intern方法主:是将当前字符串放入字符串常量池中,并返回常量池中该字符串的引用(JDK1.7及以上)不是原创,只是单纯记录自己的理解
-第一种情况,常量池中有了,直接返回
//第一种情况,常量池有
//将字符串放入字符串常量的两种方法:1.直接使用显示的双引号,2.使用str1.intern()
String str1 = "abc";//常量池中已经有abc
String intern = str1.intern();//直接返回常量池的对象
System.out.println(intern == str1);
-第二种情况 常量池中没有,再看堆中有没有
1.堆中没有(好像不存在两个地方都没有的情况吧),在常量池中创建字符串的对象,并返回刚才在常量池中创建的对象的引
2.堆中有了,还是在常量池中创建对象,只是该对象的引用直接指向堆中的对象,最后返回常量池中的对象的引用,只不过这个引用实际上就是堆中字符串对象的引用,这里可以将常量池中的对象看作是:方法栈上的一个变量(它就是一个引用的中转站),它相当于不创建对象,而是直接持有堆中对象的地址引用
//第二种情况,常量池中没有,堆中有
//将字符串放入字符串常量的两种方法:1.直接使用显示的双引号,2.使用str1.intern()
String str1 = new StringBuilder().append("ab").append("c").toString();//此时字符串常量池中只有ab和c,但是堆中有abc
str1.intern();//将abc放入字符串常量池,常量池中的对象直接指向堆中的abc
String str2 = "abc";
System.out.println(str1 == str2);//true
-