String对象和引用String对象的位置存在于堆非常量池区域而字符串常量池则存放字面量加载时创建的对象的引用根据创建方式的不同创建过程也有可能不同详细见下方描述主要创建方式在对象创建前都会检查相应字面量比如abc是否被加载若没有则会在堆里创建一个新的String对象内容为abc然后在字符串常量池中声明一个引用指向该对象最后进行对象的创建主要创建方式如下String s abc返回字面量abc加载后存在于字符串常量池中的引用String snew String(abc)在堆非常量池区域中创建一个全新的 String 对象。然后再返回该对象的引用String s new String(abc).intern()首先会进行new String(abc)的创建intern()不创建新对象而是返回字符串常量池中已经存在的那个对象引用String sab编译器在生成字节码时会直接计算出结果 ab所以只会加载ab实际执行等价于String sabString snew String(a)new String(b)会分别和进行a、b的字面量加载和String对象的创建通过StringBuilder拼接出一个内容为 ab 的新 String 对象并让 s 指向它由于s在运行时才确定所以ab并不会被加载即字符串常量池中并没有其引用需要调用intern()将当前对象的引用直接存入常量池在实际应用中比如new StringBuilder(abc).toString()s.concat(abc)等都会在堆中new一个对象在调用intern()时若加载了字面量则直接返回字符串常量池中已经存在的那个对象引用若在运行时才确定则将当前对象的引用直接存入常量池练习问题1: String snew String(abc)的过程答首先会检查相应字面量abc是否被加载若没有则会在堆里创建一个新的String对象内容为abc然后在字符串常量池中声明一个引用指向该对象最后会在堆中new一个新的对象并返回其引用注意创建过程中若abc没被加载最终在堆中创建了两个对象否则只new了一个对象问题2: String s1 abcString s2new String(abc)String s3new String(abc).intern() 那么s2s3? s1s3?答s2!s3s1s3
String的主要创建方式与比较
发布时间:2026/5/20 1:41:21
String对象和引用String对象的位置存在于堆非常量池区域而字符串常量池则存放字面量加载时创建的对象的引用根据创建方式的不同创建过程也有可能不同详细见下方描述主要创建方式在对象创建前都会检查相应字面量比如abc是否被加载若没有则会在堆里创建一个新的String对象内容为abc然后在字符串常量池中声明一个引用指向该对象最后进行对象的创建主要创建方式如下String s abc返回字面量abc加载后存在于字符串常量池中的引用String snew String(abc)在堆非常量池区域中创建一个全新的 String 对象。然后再返回该对象的引用String s new String(abc).intern()首先会进行new String(abc)的创建intern()不创建新对象而是返回字符串常量池中已经存在的那个对象引用String sab编译器在生成字节码时会直接计算出结果 ab所以只会加载ab实际执行等价于String sabString snew String(a)new String(b)会分别和进行a、b的字面量加载和String对象的创建通过StringBuilder拼接出一个内容为 ab 的新 String 对象并让 s 指向它由于s在运行时才确定所以ab并不会被加载即字符串常量池中并没有其引用需要调用intern()将当前对象的引用直接存入常量池在实际应用中比如new StringBuilder(abc).toString()s.concat(abc)等都会在堆中new一个对象在调用intern()时若加载了字面量则直接返回字符串常量池中已经存在的那个对象引用若在运行时才确定则将当前对象的引用直接存入常量池练习问题1: String snew String(abc)的过程答首先会检查相应字面量abc是否被加载若没有则会在堆里创建一个新的String对象内容为abc然后在字符串常量池中声明一个引用指向该对象最后会在堆中new一个新的对象并返回其引用注意创建过程中若abc没被加载最终在堆中创建了两个对象否则只new了一个对象问题2: String s1 abcString s2new String(abc)String s3new String(abc).intern() 那么s2s3? s1s3?答s2!s3s1s3