【前言】
String a = "123";
String b = "123";
String c = new String("1234");
问以下输出:
System.out.println(a==b);
System.out.println(a==c);
System.out.println(b==d);
当初面公司时,一哥就考了我这个题,当时没有回答完整回去之后特别忐忑,至今记忆犹新。
(c++中的string可直接用 ‘=’ 比较,不用这么麻烦)
Java底层内存模型
String 例题
String a = “123”
时,此时常量池没有“123”
,生成“123”
String b="123"
时,常量池已有"123"
,就直接指向它,故 a==b
String c=new String("123")
时,常量池已有,但因为 new ,要在堆中新建一个对象,所以要先从栈中指向堆中的对象,再指向常量池的”123“
,故 a!=c
String a = new String(“123”);
这句代码,会创建几个对象?
1个或者两个
String拼接
每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经在常量池中,那么直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串,并将其放到常量池中。 常量池中一定不存在两个相同的字符串。
String对象一旦被创建就是固定不变的了,对字符串的任何改变都不会影响原字符串,任何相关改变都会生成新的对象。
现在大多版本的eclipse已经可以自动把用 + 拼接的字符串优化为 StringBuilder 类型,StringBuilder 拼接字符串用append方法,不用创建新对象,更省事高效