Stringtable 串池经典面试题

本文介绍了Java中的String池,它存储在堆中,用于避免重复创建字符串对象。String对象通过intern()方法可以尝试放入String池,1.6版本会复制一份,1.8版本则直接移动对象。博客通过代码示例展示了不同情况下字符串对象在堆和池之间的关系,讨论了String对象相等性的判断,并提出了面试题关于字符串入池的条件。
摘要由CSDN通过智能技术生成

Stringtable串池

简单介绍

常量池中的字符串仅是符号,第一次用到时才变为字符串对象

利用串池的机制,来避免重复创建字符串对象 ,如果两个字符串(作为key)一样,那么就会使用同一份。

可以使用 intern 方法,主动将串池中还没有的字符串对象放入串池

1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份(原来的对象没有变,只是在常量池中多了一个字符串), 放入串池, 会把串池中的对象返回。

1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池(移动而不是复制,也就是说堆中的对象消失了), 会把串池中的对象返回 。

String table又称为String pool,字符串常量池,其存在于堆中(jdk1.7之后改的)。最重要的一点,String table中存储的并不是String类型的对象,存储的而是指向String对象的索引,真实对象还是存储在堆中。

此外String table还存在一个hash表的特性,里面不存在相同的两个字符串。

面试题

串池StringTable基本了解_zhanlijuan-CSDN博客

java-方法区 (二) - StringTable串池_404QAQ的博客-CSDN博客

代码解析


public class StringTable {
    public static void main(String[] args) {
        String s1="a";
        String s2="b";
        String s3="a"+"b"; // 相当于 "ab"  在串池中 串池在堆区中
        String s4= s1+s2;   // 在堆中 但不在串池中
        String s5="ab"; // 在串池中 因为串池的hash属性  只有一份 ab 所以和s3一样
        String s6=s4.intern();
        // java1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池(移动而不是复制,也就是说堆中的对象消失了),
        // 会把串池中的对象返回  返回的就是 “ab”所在的位置
// 具体的 串池中有"ab" 所以并不会把s4 从堆区移动到串池中,但是返回的是 串池中的对象 s3

        System.out.println(s3==s4);//false  s3就是"ab" 在串池中  s4在堆中
        System.out.println(s3==s5);// true
        System.out.println(s3==s6);// true 入池后返回引用 

        String x2=new String("c")+new String("d");
        String x1="cd";
        String x3 = x2.intern();
        //问,如果调换了【最后两行代码】位置呢? true  
        //如果是jdk1.6呢  如果是1.6 都是false
        System.out.println(x1==x2);// false x2无法入池  所以x2的的指向还是在堆区中
        System.out.println(x1 == x3); // true 返回串池中的对象

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trigger333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值