对于java 字符串String的认识,相信大家都接触过也使用过,但是怎么使用它,如何去使用好它又是另外一回事了,好了,言归正传,今天听以前的同事说,字符串intern方法,我当时觉得这个是什么?没用过,后来百度一下这个,才知道它的作用是强制让JAVA虚拟机去常量池匹配这个值,常量池我们都知道是存在于方法区的,它是方法区的一部分,而方法区是线程共享的,所以常量池也就是线程共享的,但是它并不是线程不安全的,它其实是线程安全的,他仅仅是让有相同值的引用指向同一个位置而已,如果引用值变化了,但是常量池中没有新的值,那么就会新开辟一个常量结果来交给新的引用。
这样说你们可能会有一点懵,我举个例子
String strA = "helloWord";
String strB = "hello";
String strC = "Word";
String strD = strB + strC;
如果我不用字符串中的tntern方法,拿strA==strD来比较是否同一个对象,结果我们都知道,false,因为JVM在编译程序时,会将编译过程中对字面量计算的表达式先行计算,将结果替换表达式。只要有一方不是字面量,就不会编译计算,因为JVM不明确它是什么,这样解释应该都清晰明了吧?由于strD的表达式右边不是字面量,而导致跟strA不是同一个对象,当我这样编写时。
String strA = "helloWord";
String strB = "hello";
String strC = "Word";
String strD = strB + strC;
boolean compareResult = strA == strD.intern();
结果将为true,同一个对象,为什么我频繁说对象,对象,你们能联想到什么?线程锁,锁的对象必须是同一个对象,当你要拿一个字符串作为锁的对象,拿必须要确保这个对象是同一个,当你需要用字符串拼接这个锁对象时,使用到一些字面量是hard core + 表达式形成的结果跟常量池存在的值一样时,但又不是同一个对象,这个时候我们可以用intern,并且减少方法区的开辟空间。