StringTable常见面试题分析

本文分析了Java中StringTable的特性,包括常量池中的字符串对象化、StringBuilder在字符串拼接中的作用以及编译期对常量字符串拼接的优化。通过示例代码解释了不同拼接方式下字符串对象的创建与引用,强调了字符串池的使用能避免重复创建对象。
摘要由CSDN通过智能技术生成

签名:但行好事,莫问前程。

文章目录


前言

记录一下StringTable常见面试题分析。


StringTable的特性:

  • 常量池中的字符串仅是符号,第一次用到时才变为对象
  • 串池中保存的是字符串常量对象
  • 利用串池的机制,来避免重复创建字符串对象
  • 字符串变量拼接的原理是 StringBuilder (1.8)
  • 字符串常量拼接的原理是编译期优化

先看代码:

public class StringTableDemo {
    // StringTable []  串池 hashtable结构,不能扩容
    public static void main(String[] args) {
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab"; // StringTable ["a","b","ab"] 当代码执行到这一步,"a","b","ab" 都被加载到串池中

        String s4 = s1 + s2; // new StringBuilder().append("a").append("b").toString() => new String("ab") 我们知道,new出来的对象都存在堆中
        System.out.println(s3 == s4); // 堆中的s4和串池中的s3不是同一个对象,所以结果是:false

        // javac 在编译期间的优化,两个常量字符串"a"和"b"的拼接结果就是字符串"ab"
        String s5 = "a" + "b"; // 当代码执行到这一步,会先去串池中找有没有“ab”字符串对象,没有的话,将“ab”字符串加入串池;有的话,直接引用串池中的“ab”对象
        System.out.println(s3 == s5); // s3和s5都是指向串池中的“ab”字符串对象,所以结果是:true
    }
}

运行结果:

在这里插入图片描述


总结

博客主要记录了StringTable常见面试题分析,有啥错误或不足地方请指正,如果对你有所帮助,请一键三连。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值