java虚拟机笔记 String相关概念及其面试题

String相关

String的基本特征
  • String被声明为final,不可被继承。
  • String实现了Serializable接口,表明String支持序列化;实现了Comparable接口,表明String是可以比较大小
  • jdk8及其以前底层用char数组实现;jdk9以后用byte数组加编码标记(因为比如中文需要用两个byte存储)实现,StringBuilder和StringBuffer也做了相应的更新。
  • 字符串常量池不会存储相同内容的字符(底层实现是一个固定长度的hashtable,长度可由-XX:StringTableSize=size设置)。
  • jdk7开始,字符串常量池从方法区移到堆中,原因如下:
    • 方法区垃圾回收率不高
    • 永久代内存空比较小
  • String、StrngBuilder、StringBuffer区别
    • String底层数组用final修饰,所以不可变;StringBuilder、StringBuffer底层数组可变(可修改)
    • StringBuilder线程不安全,但速度比StringBuffer快,StringBuffer线程安全(Synchronized实现线程安全),但速度较慢
    • 需要频繁操作修改字符串时建议使用StringBuilder或者StringBuffer
        String s1= "abc";//采用赋值操作,字面量存入字符串常量池中
        String s2=new String("abc");//new String操作在堆中新建一个String对象,值为"abc"
        System.out.println(s1==s2);//false;
字符串拼接操作
  • 常量和常量的拼接结果在常量池,原理是编译器优化
        String s1= "a"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值