Java提高篇??理解String 及 String.intern() 在实际中的应用

发布于:2021-10-14 17:09:29

?  1. 首先String不属于8种基本数据类型,String是一个对象。?

看例1:?



String s0=”kvill”;
String s1=”kvill”;
String s2=”kv” + “ill”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );

结果为:?


true?

  首先,我们要知道Java会确保一个字符串常量只有一个拷贝。?



例2:



1 String s0=”kvill”;
2 String s1=new String(”kvill”);
3 String s2=”kv” + new String(“ill”);
4 System.out.println( s0==s1 );
5 System.out.println( s0==s2 );
6 System.out.println( s1==s2 );

结果为:?


false?

例2中s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。?


?


  4. String.intern():?


String s0= “kvill”;
String s1=new String(”kvill”);
String s2=new String(“kvill”);
System.out.println( s0==s1 );
System.out.println( “**********” );
s1.intern();
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );

结果为:?


false?

?


最后我再破除一个错误的理解:???


  有人说,“使用String.intern()方法则可以将一个String类的保存到一个全局String表中,如果具有相同值的Unicode字符串已经在这个表中,那么该方法返回表中已有字符串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中“如果我把他说的这个全局的String表理解为常量池的话,他的最后一句话,“如果在表中没有相同值的字符串,则将自己的地址注册到表中”是错的: ??



String s1=new String("kvill");
String s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );

结果:



false
kvill kvill
true

在这个类中我们没有声名一个”kvill”常量,所以常量池中一开始是没有”kvill”的,当我们调用s1.intern()后就在常量池中新添加了一个”kvill”常量,原来的不在常量池中的”kvill”仍然存在,也就不是“将自己的地址注册到常量池中”了。?


?


?文章参考链接:


String池化及intern方法的作用


常量池是什么东东?String.intern()什么时候用?怎么用?

相关推荐

最新更新

猜你喜欢