intern 方法 java_浅谈java String类中的intern方法

对于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,并且减少方法区的开辟空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值