son*_*mas 32 java string object new-operator
我是java的新手.
在java中,String是一个class.但是我们不必使用new关键字来创建类的对象,String其中new用于为其他类创建对象.
我听说过类似的Wrapper类Integer,Double它们与此类似.但String不是Wrapper,不是吗?
实际上当我使用时发生了什么
String message = "Hai";
Run Code Online (Sandbox Code Playgroud)
?? 它有什么不同
String message = new String("Hai");
Run Code Online (Sandbox Code Playgroud)
这是message一个参考变量或其他?是否有其他类不需要new创建对象?
Bhe*_*ung 24
使用以下行,您不是String在堆中创建新对象,而是重用字符串文字(如果已经可用):
String message = "Hai";
Run Code Online (Sandbox Code Playgroud)
"Hai"是字符串文字池中的字符串文字.因为,字符串是不可变的,所以它们是可重用的,因此它们由JVM汇集在字符串文字池中.这是推荐的方式,因为您正在重复使用它.
但是,通过以下内容,您实际上是在堆中创建一个新对象:
String message = new String("Hai");
Run Code Online (Sandbox Code Playgroud)
new String("Hai")是一个新的String对象.在这种情况下,即使文字"Hai"已经在字符串文字池中,也会创建一个新对象.建议不要这样做,因为您可能会以多个String具有相同值的对象结束.
另请参阅此文章:有关Java字符串池的问题
还有其他类不需要new来创建对象吗?
实际上,如果不使用关键字,则无法在Java中创建任何对象new.
例如
Integer i = 1;
Run Code Online (Sandbox Code Playgroud)
是否,并不意味着Integer在不使用的情况下创建对象new.我们不需要new明确使用关键字.但在幕后,如果Integer缓存中没有值为1 的对象(Integer对象由JVM缓存),new则将使用关键字创建它.
Java语言规范允许将字符串表示为文字.你可以认为它是一个String的快捷方式初始化,它有一个重要的副作用,不同于通过new的常规初始化
字符串文字都是实体,这意味着它们是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);
}
}
Run Code Online (Sandbox Code Playgroud)
将打印出"true",因为两个String实例实际上都指向同一个对象.如果通过new关键字初始化字符串,则不会出现这种情况.
Pra*_* M 7
字符串和整数创建是不同的.
String s = "Test";
Run Code Online (Sandbox Code Playgroud)
这里'='运算符为字符串重载."某些"+"事物"中的"+"运算符也是如此.在哪里,
Integer i = 2;
Run Code Online (Sandbox Code Playgroud)
直到Java 5.0这是编译时错误; 你不能将原语分配给它的包装器.但是从Java 5.0开始,这称为自动装箱,其中原语会在需要时自动提升到其包装器.
String h1 = "hi";
Run Code Online (Sandbox Code Playgroud)
将与众不同
String h2 = new String("hi");
Run Code Online (Sandbox Code Playgroud)
原因是JVM维护所有字符串文字的字符串表.所以表中会有一个"hi"的条目,说它的地址是1000.
但是当您显式创建一个字符串对象时,将创建一个新对象,比如它的地址是2000.现在新对象将指向字符串表中的条目1000.
因此,当你说
h1 == h2
Run Code Online (Sandbox Code Playgroud)
它比较
1000 == 2000
Run Code Online (Sandbox Code Playgroud)
所以这是错误的