1.String str1="abc";
和String str2=new String("abc");
有什么区别?
- 方式一是通过字面量的方式来定义字符串的,方式二是通过new+构造器方式。
- 通过字面量的方式,此时数据声明在方法区的字符串常量池中;通过new+构造器的方式,此时数据的保存地址值是数据的堆空间中开辟空间以后对应的地址值。
字符串常量存储在字符串常量池中,目的是共享,字符串非常量对象存储在堆中。
2. String s=new String("abc");
方式创建对象,在内存中创建了几个对象?
一个或两个。
- 如果字符串常量池中已经有
abc
存在,这种情况只需要新建一个对象,否则就是需要创建两个对象。 - 当字符串常量池中没有
abc
,此时会创建两个对象:
(1)一个是字符串变量abc
所对应的、驻留在一个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只存放引用。
(2)另一个是通过new String()
创建并初始化的,内容与abc
相同的实例,也是在堆中。
知识点总结
String
是一个final
类,代表不可变的字符序列。- 字符串是常量,用双引号引起来,创建后不可更改。
String
实现了Serializable
接口:表示字符串是支持序列化的。String
实现了Comparable
接口:表示字符串是可比较大小的。- 定义了
final char[] value
用来存储字符串数据。 - 通过字面量方式给一个字符串赋值,此时的字符串值声明在字符串常量池中。
- 字符串常量池中是不会存储相同内容的字符串的。
- 当字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的
value
值。 - 当对现有的字符串进行连接操作时,也需重现指定内存区域赋值,不能在原有位置赋值。
- 当调用String的
replace()
方法修改指定字符或字符串时,也需重新指定内存区域。 - 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
- 只要其中一个是变量,结果就在堆中。
- 如果拼接的结果调用
intern()
方法,返回值就在常量池中。