zoukankan      html  css  js  c++  java
  • 【翻译】创建String 使用“”还是构造函数(new String)

    在java中创建String,通常有以下两种方法。

    String x = "abc";
    String y = new String("abc");

    它们之间有什么不同呢?通过双引号和构造函数创建?

    1.双引号VS构造函数

    这个答案能够通过下面两个例子得到

    Example 1

    String a = "abcd";
    String b = "abcd";
    System.out.println(a == b);  // True
    System.out.println(a.equals(b)); // True

    a == b 返回True,是因为a和b 引用在jvm得方法区的同一个字符串(“abcd”),引用同一个内存空间。

    当一个字符串被创建超过一次,每个不同的字符串只会存储一个。(相同的两个/多个字符串,只会存储其中一个)。

    这称之为"string interning",所有的java 字符串在编译的时候都会自动 interning

    Example 2

    String c = new String("abcd");
    String d = new String("abcd");
    System.out.println(c == d);  // False
    System.out.println(c.equals(d)); // True

    c == d 返回False,是因为c和d在jvm 栈中引用了不同的对象。new String(),会在Head中创建对象。不同的对象分配不同的内存空间。

    下图就很直观的展示了这两种情况

    2.Run-Time String Interning (不会翻译)

    String interning 能够在运行时进行,甚至两个字符串通过构造函数创建。(原:String interning can still be done at run-time, even if two strings are constructed with constructors)

    String c = new String("abcd").intern();
    String d = new String("abcd").intern();
    System.out.println(c == d);  // Now true (其实这里是1.7以上才会返回true,1.7一下是返回false的)
    System.out.println(c.equals(d)); // True

    3.什么时候用上面的方式去创建字符串

    因为“abcd”已经是一个字符串,通过构造函数的方式(new String())去创建将会创建不必要的对象。

    所以,如果你需要创建一个字符串,直接String a = "xxx",这样便可以。

    如果你需要在栈上创建一个新的对象,那么你可以通过构造函数的方式去创建字符串:new String("xxx");

    原文链接:https://www.programcreek.com/2014/03/create-java-string-by-double-quotes-vs-by-constructor/

  • 相关阅读:
    用IIS做宿主的WCF服务
    Apache+mono+xsp搭建Linux下的asp.net平台
    web页面中的卡片布局代码
    GridView内的数据循环滚动
    adb 无法启动问题
    User interface
    动态生成linearLayout
    跳转到下一个activity
    android studio 快捷键
    [转]项目失败的经验
  • 原文地址:https://www.cnblogs.com/caoRM/p/8659250.html
Copyright © 2011-2022 走看看