首先贴上源码中的注释
在一个String类上调用这个方法的时候如果常量池中存在和这个String对象相同的对象的时候,直接返回常量池中的常量,如果常量池中不存在这个对象,就直接将其将其加入常量池,并且返回一个引用。
String str2=new String("nihao"); //在堆中创建一个String对象
String str3=str2.intern(); //调用str.intern()的时候,常量池中没有‘nihao’,所以在常量池中创建一个,返回创建的引用,所以此时str3指向的是常量池中的对象
String str="nihao"; //这种是直接去常量池创建对象的,但是现在常量池中已经有了“nihao”,所以这时候直接返回常量池中已经有的对象的引用,此时str指向的也是常量池中的“nihao”
System.out.println(str3==str2);//str2指向的是堆中的,所以地址不同返回false
System.out.println(str3==str); //两个指向的是常量池中的同一个对象,这时候判断地址是否相等返回的是true
System.out.println(str==str2.intern());//str2.intern()首先会判断常量池中是否存在,存在就返回常量池中的引用,所以两只地址对比返回的是true
System.out.println(str==str2);//这行返回的是false,说明intern()函数对调用的String对象没有什么影响,
intern()方法直接从常量池中取值,这样会比直接从堆中取值快。
String str2=new String("nihao"); System.out.println(str2.intern()=="nihao");
执行“==”效率高,相当于equals,节省内存
由于intern()操作每次都需要与常量池中的数据进行比较以查看常量池中是否存在等值数据,同时JVM需要确保常量池中的数据的唯一性,这就涉及到加锁机制,这些操作都是有需要占用CPU时间的,所以如果进行intern操作的是大量不会被重复利用的String的话,则有点得不偿失。由此可见,String.intern()主要 适用于只有有限值,并且这些有限值会被重复利用的场景,
蓝色部分来源于下面
作者:LilacZiyun
链接:https://www.jianshu.com/p/95f516cb75ef
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。