浅谈java String类中的intern方法

对于java 字符串String的认识,相信你们都接触过也使用过,可是怎么使用它,如何去使用好它又是另一回事了,好了,言归正传,今天听之前的同事说,字符串intern方法,我当时以为这个是什么?没用过,后来百度一下这个,才知道它的做用是强制让JAVA虚拟机去常量池匹配这个值,常量池咱们都知道是存在于方法区的,它是方法区的一部分,而方法区是线程共享的,因此常量池也就是线程共享的,可是它并非线程不安全的,它实际上是线程安全的,他仅仅是让有相同值的引用指向同一个位置而已,若是引用值变化了,可是常量池中没有新的值,那么就会新开辟一个常量结果来交给新的引用。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,而且减小方法区的开辟空间。code

相关文章
相关标签/搜索