String str = new String("xyz") 创
2020-10-25 本文已影响0人
从零开始的程序猿生活
首先在看这个问题之前先要知道一下String创建对象的过程。
String 在创建对象的时候jvm首先会去字符串常量池中找这个对象是否存在,如果存在直接返回这个对象的引用,如果不存在则创建一个新对象。
看下下面的代码:
public static void main(String[] args) {
String str1 = "Hello";
// System.identityHashCode(s) 方法可以返回对象内存地址,不管对象是否重写hashCode()方法
System.out.println(System.identityHashCode(str1));// 1112280004
str1 = "java";
System.out.println(System.identityHashCode(str1));// 1013423070
String str2 = "Hello";
System.out.println(System.identityHashCode(str2));// 1112280004
String str3 = new String("Hello");
System.out.println(System.identityHashCode(str3));// 380936215
String str4 = "Hello";
System.out.println(System.identityHashCode(str4));// 1112280004
}
- 在执行String str1 = "Hello"的时候,jvm首先在字符串常量池中寻找"Hello",显然是没有的,所以创建一个对象,并将这个对象的引用返回给str1。
- 在执行str1 = "java"的时候,jvm创建一个对象 "java" 并将这个对象的引用返回给 str1。
- 在执行 String str2 = "Hello" 时,jvm去字符串常量池中找"Hello",找到了内存地址为1112280004的对象,直接将这个对象的引用返回给str2,所以没有重新创建对象。
- 在执行 String str3 = new String("Hello")的时候,jvm首先去字符串常量池中寻找"Hello"对象,因为之前已经存在了,所以不会再去创建。因为new 关键字,会在内存中重新开辟一个空间,创建一个对象。所以他的内存地址为:380936215
- 最后执行 String str4 = "Hello" 的时候,因为jvm中存在这个对象,所以直接返回内存地址为1112280004的对象引用。
回归问题:
如果只是单纯的 String str = new String("xyz") ,那么jvm首先会去字符串常量池中查找这个对象,不存在,创建"xyz"这个对象(第一次创建),之后new 关键字会在内从中重新开辟一个新的空间,创建一个新的对象(第二次创建)。