Java基础笔记(10)— String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果
String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果
测试代码:
package StringTest;
public class StringTest {
public static void main(String[] args) {
testStringPool();
}
private static void testStringPool() {
/*String a= “abc” String b = “abc” String c = new String(“abc”)
* String d = “ab” + “c” .他们之间用 == 比较的结果*/
String a = "abc";
String b = "abc";
String c = new String("abc");//使用new标准的构造对象
String d = "ab" + "c";
System.out.println("a == b 的结果:" + (a == b));
System.out.println("a == c 的结果:" + (a == c));
System.out.println("a == d 的结果:" + (a == d));
System.out.println("b == c 的结果:" + (b == c));
System.out.println("b == d 的结果:" + (b == d));
System.out.println("c == d 的结果:" + (c == d));
System.out.println("abc" == ("ab" + "c"));
String e = c.intern();//将new出来的字符串对象加入字符串常量池
System.out.println(a == e);
}
}
输出结果:
a == b 的结果:true
a == c 的结果:false
a == d 的结果:true
b == c 的结果:false
b == d 的结果:true
c == d 的结果:false
true
true
结果说明:
1.比较过程是直接用“ == ” 来进行比较,没有使用equal方法,用 “ == ” 来比较的话,比较的是地址。并不是比较它们的值。
2.a,b,d,三个字符串直接用 “ == ” 比较,结果都是true。是相等的。
说明这三个变量在空间上都是指向同一个内存地址。(字符串常量池的问题)
3.和c比较的时候,结果都是false,不相等。因为,c是new出来的,new都是在堆内存中新开辟的空间,所以,地址不相同。
字符串常量池理解:
Java中字符串对象创建有两种形式。
第一种形式,如String a = “abc”;,另一种就是使用new构造对象的方法,如String c= new String(“abc”);。
这两种实现方式存在着一些性能和内存占用的不同。
原因是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池。
原理:
当代码中出现以常量形式创建字符串对象时,JVM首先会对这个字面量进行检查。
如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回。(JVM原理)
否则以new构造新的字符串对象,JVM会将这个引用放入字符串常量池,并返回该引用。