#String 学习笔记
##String是final类型的,所以String不能被继承
##String.intern(): 如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。
注:“==” 比较的是两个对象的引用(内存地址)是否相同
###采用new 创建的字符串对象,不会进入字符串常量池
String a = "abc";
String b = new String("abc");
String c = "abc";
System.out.println("a == b: " + (a == b));//输出为false
System.out.println("b.intern() == a: " + (b.intern() == a));//输出为true
System.out.println("a == c : " + (a == c));//输出为true
- 字符串"abc"已经在字符串常量池中,并有一个引用a。
- 而变量b是new出来的String,则b是一个新的引用,故有a == b 为false。
- 由于字符串常量池中已经有"abc"了,所以a.intern()返回的是字符串常量池中的该字符串的引用,所以会有b.intern() == a 为true。
- 引用c也指向字符串常量池中的"abc",所以a == c 为true。
###字符串相加的时候,都是静态字符串的结果会添加到字符串常量池,如果其中包含变量,则不会进入字符串常量池
String a = "abcd";
String b = "ab" + "cd";
String c = "ab";
String d = c + "cd";
String e = c + "cd";
System.out.println("a == b : " + (a == b));//输出为true
System.out.println("a == d : " + (a == d));//输出为false
System.out.println("d == e : " + (d == e));//输出为false
System.out.println(d.intern() == e);
- 字符串"abcd"已经在字符串常量池中,并有一个引用a。
- 引用b引用静态字符串"ab" + "cd",则b所引用的对象也在字符串常量池中,故a == b 为true。
- 引用d是变量c+常量"cd",包含了变量,则不会进入字符串常量池,而会有一个新的引用,故a == d 为false。
- 同理,e也已是一个新的引用,故有 d == e 为false。
这是今天在看《深入理解Java虚拟机》这本java经典读物,看到有关方法区和运行时常量池这块,才发现String还有这么多的坑,所以就自己实际写测试代码看了下,小小的总结下。String经常会在面试中问到,所以深入理解了还是很重要的。