Java之String

1. 常用的创建字符串的两种方式:

  1. 通过直接赋值创建字符串
1
java复制代码String testA = "一生清澈";
  1. 通过调用构造方法创建字符串
1
java复制代码String testB = new String("一生清澈");

2. 通过直接赋值创建字符串

2.1 创建过程

  1. 首先检查字符串常量池中是否已经存在了该字符串对象,如果已经存在,那么指针直接指向已经存在的字符串的地址
  2. 如果字符串常量池中不存在该字符串,那么在字符串常量池中创建此 字符串对象,然后指针指向新创建的字符串的地址

2.2 代码验证

1
2
3
4
5
java复制代码String testA = "一生清澈";
String testB = "一生清澈";

// 判断字符串的内存地址是否相等
System.out.println(testA == testB);

输出结果:true

3. 通过调用构造方法创建字符串

3.1 创建过程

  1. 首先在堆中为新的字符串对象分配内存
  2. 然后检查字符串常量池中是否存在相等的字符串,如果存在,那么将新创建的字符串对象的字符数组指针指向常量池中字符串对象的字符数组。如果不存在,那么先在字符串常量池中创建新的字符串对象,然后让堆中新创建的字符串对象的字符数组指针指向常量池中字符串对象的字符数组

3.2 代码验证

1
2
3
4
5
6
7
java复制代码// 通过直接赋值的方式创建字符串
String testA = "一生清澈";
// 通过调用构造方法的方式创建字符串
String testB = new String("一生清澈");

// 判断字符串的内存地址是否相等
System.out.println(testA == testB);

输出结果:false

1
2
3
4
5
6
7
8
9
10
11
12
java复制代码// 通过反射获取字符串类的字符数组
Field value = String.class.getDeclaredField("value");
// 设置私有变量的访问权限
value.setAccessible(true);

// 通过反射获取testA对象的字符数组
char[] testACharArray = (char[]) value.get(testA);
// 通过反射获取testB对象的字符数组
char[] testBCharArray = (char[]) value.get(testB);

// 判断字符数组的地址是否相同
System.out.println(testACharArray == testBCharArray);

输出结果:true

输出结果证明:这虽然是两个不同的字符串对象,但是他们内部的字符数组是同一个字符数组

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%