在java中内存被分为三块分别为1.栈(主要存放引用)2堆(主要存放对象并存在一个String pool)3代码区。下面进行分析:
1. String s=new String("hello");
2. String s1="hello";
3. String s2=new String("hello");
问:每行创建几个对象
解答:第一句执行的时候先在String pool 中查找是否有hello对象,结果没有hello对象则在String pool 里创建hello对象 ,并在堆里边创建hello对象,并将s指向堆里面的hello对象,所以第一句创建了两个对象。
第二句在执行时首先在String pool 中查找是否有hello对象,结果查找存在则s1指向String pool中的对象。
第三句执行时先到String pool 查找hello 对象,不管查找到与否都要在堆里面创建另一个hello对象。
扩展:有以上分析可以知道s,s1,s2所指向的不同地址进而可以判断他们是否指向的地址是否相同(用==判断地址,用equal判断内容是否相同)
在此可能还会提到intern 函数让我们参考一下jdk6.0的帮助文档:
当调用 intern 方法时,如果池已经包含一个等于此 String
对象的字符串(用 equals(Object)
方法确定),则返回池中的字符串。否则,将此String
对象添加到池中,并返回此 String
对象的引用。
所以s.intern();//s不再指向堆里的对象,而是是指向String pool 里的对象。
下面再看一个例子:
String hello="hello";
String hel="hel";
String lo="lo";
hello=="hel"+"lo";//返回true 等号右面组成hello会在String pool中找到已经存在的 //hello对象
hello=="hel"+lo;//返回false等号右边会在堆里边创建另一个对象