From ad6c038a44f8d2c0733b934f7a5468a2b2f5f818 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Mon, 31 Dec 2018 14:22:27 +0800 Subject: [PATCH] complete String --- blogs/String.md | 142 +++++++++++++++++++++++++++++++++++++- images/String.png | Bin 0 -> 30710 bytes images/compact_after.png | Bin 0 -> 1590 bytes images/compact_before.png | Bin 0 -> 5469 bytes 4 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 images/String.png create mode 100644 images/compact_after.png create mode 100644 images/compact_before.png diff --git a/blogs/String.md b/blogs/String.md index 1871763..9043ece 100644 --- a/blogs/String.md +++ b/blogs/String.md @@ -5,7 +5,143 @@ String #### 目录 1. 思维导图 -2. String - - -3. 参考 +2. 源码解析 + - 类继承关系 + - 类成员变量 + - 类成员方法 + - 相关静态方法 +3. 对象内存分配 +4. 参考 +#### 思维导图 + +![](https://i.loli.net/2018/12/31/5c29ad8944245.png) + +#### 源码解析 + +##### 类继承关系 + +```java +public final class String + implements java.io.Serializable, Comparable, CharSequence { + } +``` + +String 类由 final 修饰,是一个不可变类。 + +##### 类成员变量 + +```java +// JDK 10 +private final byte[] value; +private final byte coder; //采取的编码方式 +static final boolean COMPACT_STRINGS; + +static { + COMPACT_STRINGS = true; //压缩 String 存储空间 +} +@Native static final byte LATIN1 = 0; +@Native static final byte UTF16 = 1; +``` + +在 JDK 9 之前,用的是 char 数组来存储 String 的值,之后就用 byte 数组来存储,char 是两个 byte,比如在存储 ‘A’ 这个字符串时只需一个 byte,就会造成空间浪费。 + +String 支持多种编码,但是如果不指定编码的话,它可能使用两种编码方式,分别是 LATIN1 和 UTF16,LATIN1 其实就是 ISO 编码,属于单字节编码,而 UTF16 为双字节编码。 + +String 在表示因为字符或者数字时,会可能存在浪费空间的情况,比如在存储 what 字符串时: + +![](https://i.loli.net/2018/12/31/5c29a0e29ddef.png) + +在 java 9 之后就变成了: + +![](https://i.loli.net/2018/12/31/5c29a1094834b.png) + +可以看到,压缩之后存储更加紧凑了。默认是开启压缩的,即 COMPACT_STRINGS 默认为 true。 + +##### 类成员方法 + +```java + //计算长度 + public int length() { + return value.length >> coder(); + } + byte coder() { + return COMPACT_STRINGS ? coder : UTF16; + } + //获取指定位置的字符 + public char charAt(int index) { + if (isLatin1()) { + return StringLatin1.charAt(value, index); + } else { + return StringUTF16.charAt(value, index); + } + } + //... +``` + +既然改变了编码方式,计算长度就需要考虑编码方式了,如果是 UTF16,双字节编码,那就是右移一位即长度为之前的 1/2。同时,也能看出来,默认采用的是单字节编码即 ISO 编码。 + +剩下就是 String#intern() 方法: + +```java +public native String intern(); +``` + +过于重要,下面解释。 + +#### 对象内存分配 + +String 对象创建有两种方式: + +1. 字面量赋值 + + ```java + String str = "Omooo" + ``` + + 这样创建字符串对象,首先会去常量池中找有没有这个字符串,如果有就直接指向,没有就先往常量池中添加再指向。 + +2. new 创建 + + ```java + String str = new String("Omooo"); + ``` + + 当然,我们肯定不会这样写。如果这样写了,它会做两件事。 + + 首先在堆上创建该字符串对象,然后去看常量池中是否有该字符串,如果有就算了,没有就往常量池中添加一个。 + +String 对象的内存分配讲完了,那就看这一道题: + +```java +String str1 = new String("str")+new String("01"); +str1.intern(); +String str2 = "str01"; +System.out.println(str2==str1); +``` + +输出 true。 + +在 JDK 1.7 之后,intern 方法做了些改变,进行拷贝的时候不是拷贝对象,而是拷贝地址值。 + +那么在想想一下两个呢? + +```java +String str1 = new String("str")+new String("01"); +String str2 = "str01"; +str1.intern(); +System.out.println(str2==str1); + +String str1 = new String("str")+new String("01"); +String str2 = "str01"; +str1 = str1.intern(); +System.out.println(str2==str1); +``` + +#### 参考 + +[String 源码浅析(一)](https://juejin.im/post/5c2588d8f265da6110371d2b) + +[Java9后String的空间优化](https://blog.csdn.net/wangyangzhizhou/article/details/80371653) + +[String类相关面试题很难?不要方,问题不大](https://www.jianshu.com/p/d416a074409d) \ No newline at end of file diff --git a/images/String.png b/images/String.png new file mode 100644 index 0000000000000000000000000000000000000000..af7e6ef1d28bbf72e386ef8d05ba0c16476300f5 GIT binary patch literal 30710 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 G%zpsChUakr literal 0 HcmV?d00001 diff --git a/images/compact_before.png b/images/compact_before.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbf623918667f34c971e165d350af10b6d751af GIT binary patch literal 5469 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 literal 0 HcmV?d00001