Java中关于String赋值的两种形式

时间:2021-12-22 13:14:41

说明
第一种方式
第二种方式
总结

说明:
String在java中是使用频率很高的一个类,之前使用的时候并没有过多的在意,只知道有两种赋值方式,一种是采用字面值方式(String string1 = “string”;),一种是使用new关键字(String string2 = new String(“string”);)。如果使用string1==string2比较的话,你会发现结果为false,说明两者的地址并不一致,虽然我知道两个String比较的话为了避免出错要用string1.equals(string2),但是不知道为什么这么约定,直到今天才渐渐明白……
正是由于String是比较常用的类,不管是用户输入的字符串还是一些文本信息,都要使用String类。java为了提高效率,便于高效的管理这些String对象,设计了String池(String pool)用于存放String对象,下面我们来分析一下两种创建String对象的机制。

第一种方式:
String string1 = “string”;,这种采用字面值创建String对象的方法,首先检查 String Pool 中是否存在“string”这个对象:
1、如果存在,则不创建任何对象,直接将 String Pool 中的这个 string 对象的地址返回来,赋值给 string1 这个引用,这样 string1 就指向 String Pool 中的 “string” 这个对象;
2、如果 String Pool 中不存在 “string”这个对象,那么就先在 String Pool 中创建一个 “string” 对象,然后将 String Pool 中这个 “string” 对象的地址返回来。

第二种方式:
String string2 = new String(“string”);,众所周知new出来的对象是创建在堆内存中的,但是这里因为有 String Pool 的概念,所以略有不同,首先还是检查 String Pool 中是否存在“string”这个对象:
1、如果存在,则不在 String Pool 中再创建 “string”这个对象了,而是在堆内存(heap)中直接创建一个“string”对象,然后将堆中这个 “string”对象的地址返回来,赋值给 string2 引用,这时 string2 指向的是堆中的 “string”对象,注意并不是指向 String Pool;
2、如果 String Pool 不存在 “string”这个对象,则首先在 String Pool 中创建一个“string”对象(为了方便管理嘛),然后再在堆中创建一个“string”对象,返回堆中这个“string”对象的地址,赋值给 string2 这个引用,这便使得 string2 指向了堆中的对应地址。

总结:
使用字面赋值方式创建 String 对象,返回的地址是指向 String Pool 中的,而使用new关键字创建的 String 对象,返回的地址是指向堆内存的。

public class Test {

public static void main(String args[]) {

String string1 = "string";

String string2 = new String("string");

System.out.println(string1 == string2);
}
}

因此这里输出的肯定是false。