JVM自用笔记 —— 串池

文章详细介绍了Java中String对象的创建方式,包括字面量和new方式,强调了String的不可变性。讨论了StringPool的运作机制,指出intern()方法的作用以及JDK版本对其的影响。此外,文章还探讨了不同拼接方式的效率差异,如字面量拼接、StringBuilder使用等,并提到了final关键字对编译期优化的影响。

一. String基本特性

创建方式:

  • 字面量方式 “”。该方式会放入字符串常量池。
  • new的方式

String类由final修饰,故不可被继承。
1.8及之前底层有private final char 数组存储数据;1.9及以后由private final byte数组存储数据。(StringBuffer和StringBuilder底层也做了同样的调整)。由于成员变量由final修饰,因此字符串对象具有不可变性。
(补充:修饰的是基本数据类型,这个值本身不能修改。修饰的是引用类型,引用的指向不能修改)

二. String Pool

 字符串常量池中不会存储内容相同的字符串。
 故,intern()在串池中已存在内容相同字符串时,则=返回串池中的对象;若串池中,不存在,则将当前对象放入【jdk1.6是拷贝一份再放入串池】。开发中合理利用intern可以极大的提高空间利用率。
 它是一个固定大小的HashTable,JDK8默认长度1009。通过 -XX: StringTableSize可以修改其长度。

在这里插入图片描述
 jdk7之后,串池被调整到了堆区。(详见堆的笔记)

三. 字符串拼接

字面量与字面量的拼接,通过编译期优化,直接将结果放入串池。
只要有一个字符串变量参与拼接,则底层是通过StringBuilder进行拼接,结果在堆中。
如果拼接符号两边的变量都被final修饰,则会被编译期优化,而不是通过StringBuilder拼接。

String s1 = "abv";
String s2 = "abc";
/**
StringBuilder s = new StringBuilder();
s.append(s1);s.append(s2);
s.toString();	约等于new String()
**/
String s3 = s1 + s2;// 也是通过StringBuilder
// 效率更高
final String s1 = "ab";
final String s2 = "abc";
String s3 = "ababc"
String s4 = s1 + s2;// 通过编译期优化
s3 == s4; // true

四. new String()

  1. new String(“ab”)会造几个对象?
    首先在堆空间中创建一个内容为ab的对象;其次字面量"ab"会在串池中再造一个内容为ab的对象,
    如果串池中已经有了ab,则不会再重复创建。
  2. new String(“a”) + new String(“b”)会造几个对象?
    6个
    StringTable两个"a",“b”
    StringBuilder三个"a",“b”,“ab”
    toString一个 new String(“ab”)

在这里插入图片描述

参考

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值