Java 为什么字符串不需要新关键字

Java 为什么字符串不需要新关键字,java,string,object,new-operator,Java,String,Object,New Operator,我是java新手 在java中,String是一个类 我们不必使用new关键字来创建classString的对象,其中asnew用于为其他类创建对象 我听说过类似于此的包装类,如Integer,Double。 但是String不是包装器,不是吗 实际上,当我使用 String message = "Hai"; ??? 它与 String message = new String("Hai"); String h2 = new String("hi"); 这是消息一个参考变量或其他

我是java新手

在java中,
String
是一个
类
我们不必使用
new
关键字来创建class
String
的对象,其中as
new
用于为其他类创建对象

我听说过类似于此的包装类,如
Integer
Double
。 但是
String
不是包装器,不是吗

实际上,当我使用

     String message = "Hai";
??? 它与

String message = new String("Hai");
String h2 = new String("hi");
这是
消息
一个参考变量或其他东西??
是否还有其他类不需要
new
来创建对象???

字符串和整数创建是不同的

String s = "Test";
这里为字符串重载了“=”运算符。“some”+“things”中的“+”操作符也是如此。 作为

Integer i = 2;
在Java5.0之前,这是编译时错误;不能将原语指定给其包装器。但在Java5.0中,这被称为自动装箱,其中原语在需要时自动升级到包装器

String h1 = "hi";
将不同于

String message = new String("Hai");
String h2 = new String("hi");
原因是JVM为所有字符串文本维护一个字符串表。因此,表中会有一个“hi”条目,比如它的地址是1000

但当您显式创建一个string对象时,将创建一个新对象,比如说它的地址是2000。现在,新对象将指向字符串表中的条目1000

所以当你说

h1 == h2
它比较

1000 == 2000

因此这是错误的

Java语言规范允许将字符串表示为文本。您可以认为它是一个字符串的快捷方式初始化,它有一个重要的副作用,它与通过新的

不同的规则初始化不同。 字符串文本都是内部的,这意味着它们是Java运行时存储的常量值,可以跨多个类共享。例如:

class MainClass (
    public String test = "hello";
}

class OtherClass {
   public String another = "hello";

   public OtherClass() {
       MainClass main = new MainClass();
       System.out.println(main.test == another);
   }
}

将打印“true”,因为两个字符串实例实际上都指向同一个对象。如果您通过new关键字初始化字符串,则不会出现这种情况。

使用以下行,您不是在堆中创建新的
字符串对象,而是重用字符串文本(如果已经可用):

“Hai”
是字符串文本池中的字符串文本。因为字符串是不可变的,所以它们是可重用的,所以JVM将它们汇集到字符串文本池中。这是推荐的方法,因为您正在重用它

但是,通过以下操作,您实际上是在(堆中)创建一个新对象:

newstring(“Hai”)
是一个新的
String
对象。在这种情况下,即使文本
“Hai”
已经在字符串文本池中,也会创建一个新对象。不建议这样做,因为可能会以多个具有相同值的
String
对象结束

另请参见本帖:

是否有其他类不需要新建来创建对象

实际上,如果不使用关键字
new
,就无法在Java中创建任何对象

e、 g

并不意味着创建
整数
对象时不使用
新建
。我们不需要显式地使用
new
关键字。但是在引擎盖下,如果值为1的
Integer
对象在缓存中不存在(
Integer
对象由JVM缓存),则将使用
new
关键字创建它。

在java中
“==”比较左侧和右侧的内存位置(而不是该内存位置的值),因此在

新字符串(“hai”)==新字符串(“hai”)

它返回false


在“Hai”==“Hai”的情况下,java不会为相同的字符串文本分配单独的内存,因此这里“==”返回true。您可以始终使用equals方法来比较值。

我认为,
Integer
是用于primitive type
int
的包装类。但是字符串不是原始的,不是吗?+1。简洁明了。如果OP真的想深入到这一点,我们应该提到Java语言规范是免费提供的。Java为字符串提供了一些语法糖,因此当您编写“Hello,World”时,您会得到一个对表示给定字符流的
字符串
对象的引用。您正在那里隐式地创建一个对象(如果需要的话),但这与
=
操作符没有任何关系。
Integer i = 1;