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

转载于:https://my.oschina.net/u/3155476/blog/3047752

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,`String.intern()` 是一个用于字符串对象的方法。它的作用是将字符串对象添加到字符串常量池中,并返回常量池中该字符串的引用。 具体含义如下: 1. 字符串常量池:Java 中的字符串常量池是一个特殊的内存区域,用于存储字符串字面值。当创建字符串时,如果字符串常量池中已经存在相同的字符串字面值,则会直接返回常量池中的引用,而不会创建新的对象。 2. `String.intern()` 方法:`intern()` 方法是 `String` 类提供的一个实例方法。调用它会检查当前字符串对象在常量池中是否存在。如果存在,则返回常量池中的引用;如果不存在,则将当前字符串对象添加到常量池中,并返回该引用。 使用 `String.intern()` 方法的主要目的是节省内存和提高性能。通过将字符串对象放入常量池中,可以重复使用相同的字符串字面值,减少内存占用,并且可以更快地比较字符串的相等性。 例如: ```java String str1 = new String("Hello"); String str2 = str1.intern(); System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true ``` 在上面的例子中,`str1` 是通过 `new String("Hello")` 创建的新字符串对象,而 `str2` 是通过 `str1.intern()` 返回的常量池中的引用。虽然它们的值相等,但它们是不同的对象,所以 `str1 == str2` 返回 `false`,而 `str1.equals(str2)` 返回 `true`。 需要注意的是,`String.intern()` 方法可能会在某些情况下导致一些性能问题和潜在的内存泄漏。因此,在使用时要注意评估场景和潜在的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值