Java 为什么字符串不需要新关键字
我是java新手 在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"); 这是消息一个参考变量或其他
String
是一个类
我们不必使用new
关键字来创建classString
的对象,其中asnew
用于为其他类创建对象
我听说过类似于此的包装类,如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 typeint
的包装类。但是字符串不是原始的,不是吗?+1。简洁明了。如果OP真的想深入到这一点,我们应该提到Java语言规范是免费提供的。Java为字符串提供了一些语法糖,因此当您编写“Hello,World”时,您会得到一个对表示给定字符流的字符串对象的引用。您正在那里隐式地创建一个对象(如果需要的话),但这与=
操作符没有任何关系。
Integer i = 1;