王磊的个人技术记录 王磊的个人技术记录

记录精彩的程序人生

目录
java字符串方法intern记录
/  

java字符串方法intern记录

public static void main(String[] args) {
String s1 = new String("hello");
String intern1 = s1.intern();
String s2 = "hello";
System.out.println(s1 == s2);
String s3 = new String("hello") + new String("hello");
String intern3 = s3.intern();
String s4 = "hellohello";
System.out.println(s3 == s4);
}

返回结果:

在jdk1.6下运行的结果为:

  false,false

在jdk1.7,1.8下运行的结果为:

  false,true

对调 String intern3 = s3.intern();
String s4 = "hellohello";之后

在jdk1.8下 false false

原因

intern() 方法返回字符串对象的规范化表示形式。

它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。  
我猜测,如果调用intern方法的时候常量池里没有这个字符串,会在常量池新建这个字符串,然后将String的指向指到常量池,这个时候在写String s4 = "hellohello"; s4也会指向常量池,如果调用intern方法的时候常量池里有这个字符串,应该是会更新对象的指向到这个常量池,但是不更新对象的地址。

s1!=s2 是因为声明s1的时候常量池中初始化了这个字符串,在调用方法的时候,方法没有对s1的对象做任何操作,只是返回了这个字符串.

s3==s4是因为 s3声明的时候+操作会new一个Stringbuffer,然后app,Stringbuffer不会在常量池中初始化"hellohello"字符串,在调用方法的时候,会去常量池初始化这个字符串,并跟新s4的指针。

intern详解见转载http://www.jianshu.com/users/90ab66c248e6/latest_articles


标题:java字符串方法intern记录
作者:wanglei03
地址:https://wangleijava.com/articles/2019/12/05/1575550271950.html