问题一
String zy1 = “小朱”;
String zy2 = “小朱”;
复制代码
问题二
String zy1 = “小朱”;
String zy2 = “大朱”;
复制代码
问题三
String zy1 = new String(“小朱”);
String zy2 = new String(“小朱”);
复制代码
问题四
String zy1 = new String(“小朱”);
String zy2 = new String(“大朱”);
复制代码
问题五
String z = “小”;
String y = “朱”;
String zy = z + y;
复制代码
问题六
String zy = “小” + “朱”;
复制代码
解析
–
会不会有人连问题一都不知道,“这明明是常量,这肯定没有创建对象”,哈哈是不是有好多小伙伴都这么认为。
在JAVA
虚拟机(JVM)中存在着一个字符串池,其中保存着很多String
对象,并且可以被共享使用,因此它提高了效率。由于String
类是final
的,它的值一经创建就不可改变,因此我们不用担心String
对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()
方法来访问字符串池。
嘟噜嘟噜一大堆说什么什么东西我一句也没听懂,哈哈。我们换个思路,我们把问题一中的"小朱"理解成String zy = new String(new char[]{'小','朱'});
为什么这么写看看String源码。
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
复制代码
然后我们看问题一我们可以理解为
String zy = new String(new char[]{‘小’,‘朱’});
String zy1 = zy;
String zy2 = zy;
复制代码
是不是恍然大悟,一眼就看出来只创建了一个对象。
那我们继续看问题二
String z = new String(new char[]{‘小’,‘朱’});
String y = new String(new char[]{‘大’,‘朱’});
String zy1 = z;
String zy2 = y";
复制代码
两个对象
继续看问题三
String zy = new String(new char[]{‘小’,‘朱’});
String zy1 = new String(zy);
String zy2 = new String(zy);
复制代码
三个对象
继续看问题四
String z = new String(new char[]{‘小’,‘朱’});
String y = new String(new char[]{‘大’,‘朱’});
String zy1 = new String(z);
String zy2 = new String(y);
复制代码
四个对象
码
三个对象
继续看问题四
String z = new String(new char[]{‘小’,‘朱’});
String y = new String(new char[]{‘大’,‘朱’});
String zy1 = new String(z);
String zy2 = new String(y);
复制代码
四个对象