本文基于JDK11。
字节阵列存储字符串内容。高速缓存字符串的hash代码。
代码编码有两种类型。编码有两种类型。这意味着Latin1已编码。每个角色占据1字节。这意味着使用UTF16编码,每个字符占2个字节。
使用0/1指示两个编码,在计算字符串长度时可以直接使用。
这意味着是否压缩字符串。如果是错误的,它将仅使用UTF16编码方法;JVM默认值为属性是正确的,并且大多数方案足以使用1个字节。您可以使用-xx:-compactstrings参数来关闭此功能。
该规则定义了字符串的比较(对情况敏感)。
只有当字符串成功地操作时,将返回新的字符串对象。例如,当取出架子时,当字符串的长度为0或尾巴没有空间时,它将返回原始对象(这样)作为代码1)。
请注意,字节数组的值仍然可以通过反射(例如代码2)来修改。
在大多数情况下,1个字节表示字符,因此JDK9将字符数组更改为字节数组,并与新属性合作以减少字符串的空间占用。
字符串非常频繁。为了重复使用和提高性能,引入了字符串常数池。字符串常数池位于桩中,JDK7在方法区域之前。
字符串常数池可以看到哈希表。表中的每个条目都包含字符串的标签和指针(等效于字符串对象的地址)到字符串对象。
因此,如果字符串常数池包含字面数量,则该结构如下图所示。
创建字符串的方法有两种:和谐。
使用文字卷时,如果常数池已经存在,请直接返回引用(方向);如果不存在,请将字符串添加到常数池(即创建一个)并返回引用。
创建创建时,如果常数池已经存在,请在桩中创建一个字符串对象,然后返回对象的引用。如果常数池中没有存在,请首先在常数池中的中国中创建字符串,然后创建字符串对象。返回对象的引用。
因此,同一字符串由字面卷引用,其引用必须相等。
即使创建的对象相等,引用也不同,并且字符串常数池的引用是不同的。
??注意
对于多个文字,它将在编译时优化它,并最终只会产生字面数量。例如,优化后的价格等效。
除上述两个主要创建方法外,还可以通过其他写作方法来使用创建字符串。这些写作方法不包含文字卷,也不会在常数池中创建对象。这些写作方法不限于以下内容。
当调用intern()时,如果字符串存在在常数池中,则返回常数池中的引用;如果不存在常数池,请创建并返回对象引用。
??注意
实际上,在这里创建没有存在并不准确。这是因为字符串常数池在JDK7之后从永久生成转移到堆,位置的变化将导致Internet()效果的变化。
请记住:由于字符串恒定池位于堆中,它将避免尽可能多地创建。如果不存在字符串常数池,它将指向已经在桩中的字符串对象,而不是重新创建字符串对象。
以下是几个示例说明:
由于恒定的池和堆空间是孤立的区域,因此共享相同的字符串没有问题。当调用intern()时,如果不存在常数池,则将重新创建字符串对象。
线程安全是否是堕落,低性能的线程安全性是由于其不道德性,而StringBuffer线程安全性是因为所有方法都是方法。
StringBuilder中的字节数组和StringBuffer中的字节数组未经修改。在字符串操作期间,该属性直接修改。操作方法返回,因此他们可以使用更方便的链条调用。
例如,
因为字符串每次修改时都会创建一个新对象,因此性能较低。不建议在周期中经常使用字符串或其他操作。
总结一下,当字符串修改较小时,您可以使用字符串;在单线线程中修改了大量的StringBuilder;在多线程使用中修改了大量修饰符。
String Joiner可以轻松地剪接字符串。有两个构造函数必须指定一个划分,或者在缝线完成后添加的前缀和后缀。StringJoiner不是螺纹-SAFFE。
基本上使用如下:
缝合字符串还可以调用字符串的静态方法,该方法由StringJoiner实现。
字符串更有用。首先,确定它是否是同一对象。如果不是这样,请确定它是否是字符串类型对象,如果是的,是否等于长度,然后直接返回false;否则,返回false。
实现如下:
此外,字符串还在表现形式中提供了一个字符串。
原始:https://juejin.cn/post/7097845709541474334