美文网首页
String(未完成

String(未完成

作者: Ramsey16k | 来源:发表于2019-10-27 10:48 被阅读0次

    String 的创建方式

    String的创建方式有两种:

    • 直接赋值
      此方式在方法区中字符串常量池中创建对象
      String str = "hello";
    • 构造器
      此方式在堆内存创建对象
      String str = new String("hello");

    我们来看一段代码:

    String str1 = "AB";
    String str2 = "AB";
    String str3 = new String("AB");
    String str4 = "A";
    String str5 = "B";
    String str6 = "A" + "B";
    String str7 = str4 + str5;
    
    System.out.println("str1 == str2 result: " + (str1 == str2));  //true
    
    System.out.println("str1 == str3 result: " + (str1 == str3));  //false
    
    System.out.println("str1 == str6 result: " + (str1 == str6));  //true
    
    System.out.println("str1 == str7 result: " + (str1 == str7));  //false
    
    /**
    * intern() 方法返回字符串对象的规范化表示形式。
    * 对于两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true
    */
    System.out.println("str1 == str7.intern() result: " + (str1 == str7.intern()));  //true
    
    System.out.println("str3 == str3.intern() result: " + (str3 == str3.intern()));   //false
    
    1)str1 == str2
    String str1 = "AB";
    String str2 = "AB";
    System.out.println(str1 == str2);  // true
    
    • 当执行第一句时,JVM会先去常量池中查找是否存在AB,当存在时直接返回常量池里的引用;当不存在时,会在字符创常量池中创建一个对象并返回引用。
    • 当执行第二句时,同样的道理,由于第一句已经在常量池中创建了,所以直接返回上句创建的对象的引用。
    2)str1 == str3
    String str1 = "AB";
    String str3 = new String("AB");
    System.out.println(str1 == str3);  // false
    
    • 执行第一句,同上第一句。
    • 执行第二句时,会在堆(heap)中创建一个对象,当字符创常量池中没有‘AB’时,会在常量池中也创建一个对象;当常量池中已经存在了,就不会创建新的了。
    3)str1 == str6
    String str1 = "AB";
    String str6 = "A" + "B";
    System.out.println(str1 == str6);  // true
    
    • 由于”A”和”B”都是常量,编译时,第二句会被自动编译为‘String str6 = “AB”;
    4)str1 == str7
    String str1 = "AB";
    String str4 = "A";
    String str5 = "B";
    String str7 = str4 + str5;
    System.out.println(str1 == str7);  // false
    
    • 其中前三句变量存储的是常量池中的引用地址。
    • 第四句执行时,JVM会在堆(heap)中创建一个以str4为基础的一个StringBuilder对象,然后调用StringBuilder的append()方法完成与str5的合并,之后会调用toString()方法在堆(heap)中创建一个String对象,并把这个String对象的引用赋给str7。

    相关文章

      网友评论

          本文标题:String(未完成

          本文链接:https://www.haomeiwen.com/subject/hgbvvctx.html