我也是新手菜鸟,但是还是说说我所知道的,只是知识,不是领悟:
主要说说String pool这个东西和String的一个方法public String intern();
首先:String pool是一个常量池constant pool,存在于.class文件中,哪里来的?编译器从.java中编译出来的,所有的常量都在编译时期被添加到这里。
那么当我们创建一个字符串引用变量String s0=“a”;时,这个字符串在哪里了,在常量池,在哪里我也不知道,估计在共享数据区,反正不在堆内存,简单的试验一下:
String s0="abc";
String s1=new String("abc");
sop(s0==s1);//false。二者不指向同一内存地址。
然后,为什么要说方法public String intern()呢?再做一个小实验:
String s0="abc";
String s1="abc";
sop(s0==s1);//true。二者指向同一内存地址。
String s0=new String("abc");
String s1=new String("abc");
sop(s0==s1);//false。这是两个对象,两个地址。
再来一个小实验:
String s0="abc";
//String s1="a";
//String s2="bc";
//String s3=new String("bc");
String s4="a"+new String("bc");
String s5=new String("abc");
sop(s4==s5);//false,这是内存中两个不同的对象
sop(s4.intern()==s5.intern());//true,这里的返回值都是常量池中的同一“abc”,地址相同。
sop(s0==s4);//false,s4的引用并没有改变
s4=s4.intern();
sop(s0==s4);//true,s4指向了常量池中的"abc"
方法public String intern(),参考JDK说明文档:
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(由 equals(Object) 方法确定),则返回池中的字符串。
否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
这个方法到底干嘛的呢?在执行期扩充常量池。
写这么多好累了,低血糖头晕,撑不住了,就没挨个跑代码,觉得靠谱的自己试试吧
|