欢迎光临
我们一直在努力

String的主要创建方式与比较

String对象和引用

String对象的位置存在于堆(非常量池区域), 而字符串常量池则存放字面量加载时创建的对象的引用,根据创建方式的不同,创建过程也有可能不同,详细见下方描述 

主要创建方式

在对象创建前,都会检查相应字面量(比如"abc")是否被加载,若没有,则会在堆里创建一个新的String对象,内容为"abc",然后在字符串常量池中声明一个引用指向该对象,最后进行对象的创建,主要创建方式如下:

String s = "abc"

  • 返回字面量"abc" 加载后,存在于字符串常量池中的引用
  • String s=new String("abc")

  • 在堆(非常量池区域)中创建一个全新的 String 对象。
  • 然后再返回该对象的引用
  • String s = new String("abc").intern()

  • 首先会进行new String("abc")的创建
  • intern() 不创建新对象,而是返回字符串常量池中已经存在的那个对象引用
  • String s="a"+"b"

  •  编译器在生成字节码时会直接计算出结果 "ab",所以只会加载 "ab"
  • 实际执行等价于 String s="ab"
  • String s=new 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 s=new String("abc")的过程

    答:首先会检查相应字面量("abc")是否被加载,若没有,则会在堆里创建一个新的String对象,内容为"abc",然后在字符串常量池中声明一个引用指向该对象,最后会在堆中new一个新的对象,并返回其引用

    注意:创建过程中,若"abc"没被加载,最终在堆中创建了两个对象,否则,只new了一个对象

    问题2: String s1 = "abc",String s2=new String("abc"),String s3=new String("abc").intern() 那么s2==s3? s1==s3?

    答:s2!=s3,s1==s3

    赞(0)
    未经允许不得转载:171主机测评 » String的主要创建方式与比较
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址