String创建对象
在Java编程语言中,`String`类是使用极为频繁的一个类,主要用于处理文本字符串。面试或笔试中,`String`对象的创建方法是常见的考察点。以下是对`String`类创建对象的一些关键知识点的详细说明: 1. **字面量方式创建**: 在Java中,我们最常用的方法是通过字面量直接创建`String`对象,如`String str = "Hello"`。这种方式创建的`String`对象会存储在常量池中,因为它们是编译时常量。 2. **构造函数创建**: `String`类提供了多个构造函数,允许我们通过字符数组或另一个`String`对象来创建新对象。例如: ```java char[] charArray = {'H', 'e', 'l', 'l', 'o'}; String str1 = new String(charArray); // 通过字符数组 String str2 = new String("Hello"); // 通过另一个字符串 ``` 这种方式创建的`String`对象位于堆内存中,不是常量池中的对象。 3. **StringBuffer/StringBuilder**: 当我们需要拼接多个字符串时,使用`StringBuffer`或`StringBuilder`(Java 5引入的线程不安全但更高效的版本)通常更为高效。例如: ```java StringBuilder sb = new StringBuilder(); sb.append("Hello").append(" ").append("World"); String str3 = sb.toString(); // 转换为String对象 ``` 4. **intern() 方法**: `String`类的`intern()`方法用于获取常量池中的字符串引用。如果常量池中已存在该字符串,则返回其引用;否则,将字符串添加到常量池并返回引用。例如: ```java String str4 = new String("Hello").intern(); // 返回常量池中的"Hello"引用 ``` 5. **equals() 和 ==**: 判断两个`String`对象是否相等时,使用`equals()`方法而不是`==`。`==`比较的是对象的引用,而`equals()`比较的是内容。除非两个`String`对象是同一个对象,否则`==`通常会返回`false`,而`equals()`会根据内容判断。 6. **String是不可变的**: `String`类的对象一旦创建,其内容就不能更改。每次对`String`对象进行修改操作(如`concat()`、`substring()`等),都会生成新的`String`对象。 7. **垃圾回收与String对象**: 如果一个`String`对象不再被引用,Java的垃圾回收机制会自动回收该对象所占用的内存。但在常量池中的`String`对象会一直存在,直到JVM停止运行。 8. **字符串常量池优化**: Java 7开始,字符串常量池被移到了堆内存中,这使得字符串的创建和垃圾回收更加高效。 9. **内存占用**: 字面量创建的`String`对象会共享内存,而通过构造函数创建的则会在堆中分配新的内存空间。 10. **String局部变量与成员变量**: 在方法内部声明的`String`变量是局部变量,其生命周期仅限于该方法。作为类的成员变量,`String`对象会随着对象的创建而创建,直到对象被垃圾回收。 以上就是关于`String`类创建对象的一些核心知识点。理解这些细节对于编写高效、无误的Java代码至关重要,也是面试中经常被问及的问题。