JVM基础_6_StringTable

String特点

声明为final,不可被继承,具备不可变性,具体表现为:

  • 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有value赋值
  • 当对现有字符串进行连接操作时,也需要重新指定内存区域进行复制,不能直接使用原来的value进行赋值
  • 当调用String的replace()方法修改指定字符或者字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值

此外,当通过字面量的方式给一个字符串赋值,此时的字符串声明在字符串常量池中。

字符串常量池特点

对于Java中的八种基本类型和String类型,Java都提供了常量池的概念。
String Pool是一个固定大小的Hashtable,其中不会存放相同的字符串。若放入的String非常多,则会导致Hash冲突,从而导致链表长度较长,从而影响插入和查找效率。
JDK6之前,字符串常量池存放在永久代中;JDK7之后,将字符串常量池调整到堆中。

字符串拼接

  • 常量和常量的拼接结果存放在常量池中
  • 只要拼接字符串中有一个是变量,则拼接结果将被存放在堆中。
  • 如果拼接结果调用intern方法,若常量池中已经存在该字符串,则返回常量池中的对应地址;若不存在,则在常量池中放入该字符串并且返回地址

intern()方法

如果不是用双引号声明的String对象,那么使用String提供的intern方法,intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。
intern()方法是确保字符串在内存中只有一份拷贝,这样便可节省内存空间,而这个值将会被存放在字符串内部池中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值