解析 String intern 方法,我发现了 jdk bug

本文详细解析了Java中String的intern方法,包括字符串常量池的概念,intern的含义及实战应用。通过不同场景的代码分析,揭示了该方法的工作原理,特别提到了JDK版本差异对结果的影响,并探讨了intern的使用注意事项以及一个疑似Oracle JDK的Bug。
摘要由CSDN通过智能技术生成

一、前言

​ String 类型是 java 里面一个很特殊的存在,里面涉及到了很多使用细节以及很多基础知识,并且常常在面试中会被当做基础部分进行提问,而 String 的 intern 方法更是很多人听都没有听过,更不要说使用了,所以本篇文章来解析下 intern 方法,掀起 intern 的盖头来 !

二、正文

1.字符串常量池

​ 字符串常量池其实就是一个固定长度的 HashTable,是 Java 提供的系统级别的一个 Cache,为了节省内存以及提升性能。

​ 下面来看一下一个例子,相信在笔试或者面试的时候经常会遇到这么一个问题,String a = new String(“1”); 这行代码到底创建了多少个对象?

  • 第一种情况,如果当前字符串常量池不存在 “1”,那么就会创建两个对象,一个在常量池中,一个在堆中。

  • 第二种情况,如果当前字符串常量池已经存在了 “1”,那么只会创建一个对象,这个对象在堆中。

​ 通过上面的例子可以看出,其实每次使用魔法值的时候,都会往常量池中存储一份,这样以后使用的时候可以直接从常量池中使用,并且常量池的一个加载都是在编译器就已经确认好的,性能提升不少。

2.intern() 含义

官方注释:
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

上面的意思大概就是,使用intern方法的时候,会去常量池中判断是否存在这个字符串对象,如果不存在,就往常量池中存储一份,然后返回池中对应的对象。
如果存在了,那么直接返回池中存在的字符串对象。

3. intern() 实战

场景一:

public class Main {
    
    public static void main(String[] args) {
      
        String a = new String("1");  
        a.intern();  
        String b 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值