另一个角度看Java常量池

探讨Java中Integer缓存机制及字符串比较细节,解析不同情况下整数与字符串比较的输出结果,深入理解Integer.parseInt与String.valueOf的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java程序猿都知道常量池,字符串会缓存,小于128的Int也会缓存。那你知道下面几种情况的输出结果吗?

        String str = "127";
        Integer int1 = Integer.parseInt(str);
        Integer int2 = Integer.parseInt(str);
        System.out.println("1:" + (int1 == int2));         

        String str2 = "128";
        Integer int3 = Integer.parseInt(str2);
        Integer int4 = Integer.parseInt(str2);
        System.out.println("2:" + (int3 == int4));                
        int int5 = 126;
        Integer int6 = Integer.parseInt("126");
        System.out.println("3:" + (int5 == int6));                  

        String str3 = String.valueOf("127");
        String str4 = String.valueOf("127");
        System.out.println("4:" + (str3 == str4));         

        String str5 = String.valueOf("127");
        String str6 = String.valueOf(127);
        System.out.println("5:" + (str5 == str6));          

        String str7 = String.valueOf(127);
        String str8 = String.valueOf(127);
        System.out.println("6:" + (str7 == str8));

不喜欢卖关子,直接上结果,如果和你的结果一致,那么恭喜你,可以不用往下看了。

如果你和我一样,对结果有疑问,那么我们一起来探讨。

1、2、3:通过Integer.parseInt()方法将同一个字符串解析成数字,如果数字小于128,则缓存了,所以1是true,2是false,3是true。

4、5、6,:这里我们通过String.valueOf()的重载方法来获得字符串,所以我们要想知道结果是怎么来的,先要查看这两个重载方法有什么区别。直接上源码:

很明显,我们可以看到传入字符串的话,我们得到的字符串就是传入的这个字符串。所以4是true就很好解释了。

我们再看传入int类型的时候的源码:

继续往里面看:

我们发现他new了一个新的字符串,既然有new这个关键字,那么肯定在堆中产生了一个新的对象。所以5、6都是false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值