在java中创建字符串的最佳方法是什么

在java中创建字符串的最佳方法是什么,java,string,Java,String,有两种方法可以在java中创建字符串,如下所示: 字符串s=新字符串Hellow; 字符串s1=Hellow; 在案例1中,将创建两个对象,一个在字符串常量池中,另一个在堆内存中,而在案例2中,仅在字符串常量池中创建一个对象 根据我的理解,每当我们使用new关键字创建对象时,字符串常量池中也会创建一个对象。那么,为什么要使用new关键字创建字符串呢?我们应该始终通过stringliteral创建 所以你们能告诉我我的理解是对还是错吗。如果错误,请提供必须使用new创建字符串的场景。最佳方法是选项

有两种方法可以在java中创建字符串,如下所示:

字符串s=新字符串Hellow; 字符串s1=Hellow; 在案例1中,将创建两个对象,一个在字符串常量池中,另一个在堆内存中,而在案例2中,仅在字符串常量池中创建一个对象


根据我的理解,每当我们使用new关键字创建对象时,字符串常量池中也会创建一个对象。那么,为什么要使用new关键字创建字符串呢?我们应该始终通过stringliteral创建


所以你们能告诉我我的理解是对还是错吗。如果错误,请提供必须使用new创建字符串的场景。

最佳方法是选项2。而您可以使用new关键字创建字符串。在这种情况下,literalhellow将被保存到由String类维护的常量池中。此外,还将在堆中创建一个obj。 选中此项: 最初为空的字符串池由类字符串私下维护

调用intern方法时,如果池中已包含一个字符串,该字符串等于equalsObject方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用

因此,对于任意两个字符串s和t,s.intern==t.intern为真当且仅当s.equalst为真时

如果您在创建对象时考虑内存问题,我建议信任jvm,让它对没有引用的对象进行垃圾收集

当你做字符串S1=something时;或者字符串S1=新事物;您正在创建一个池中不存在的Literal对象。此外,当您将S1的值更改为S1=yes时,您将创建一个新对象。并将文本内容留在池中,直到垃圾被收集

更好的方法是使用StringBuffer类

String s = "Hellow";
这是99%的情况下,当你必须创建一个字符串。它创建新字符串并将其放入字符串池或重用字符串池中已经存在的现有字符串

String s = new String("Hellow");
当您确实需要完全不同的字符串对象,而这些对象不会存储和共享在字符串池中时,这种方法非常有用。您是对的,这里正好有两个对象:Hellow-这是存储在字符串池中的字符串文字,以及将存储在堆中的新字符串

我可以给你举个例子。当必须从字节数组创建新字符串时,必须使用new Stringbyte[]buf

买路。要将字符串移动到字符串池,可以使用string.intern:


1=>。字符串s=新字符串“ABC”; 2=>. 字符串s1=“ABC”; 如果同时创建1和2,则只在字符串池引用上创建一个“ABC”对象,以将堆同时添加到这两个对象。因为1和2个字符是相同的。
为什么要使用对象引用来创建此对象。创建字符串的最佳简单方法是使用String类way 1 String s=“ABC”

旁注:Hello的拼写是错误的。我们称之为输入错误。那么,为什么要使用new关键字创建字符串,而应该始终通过string literal创建。-请向我解释为什么要使用新字符串。根据我的理解,每当我们使用新关键字创建对象时,一个对象也会在字符串常量池中创建。不完全,您可以调用新字符串并创建字符串,该字符串相当于没有文本,不会放置在池中。另外,new Stringnew char[]{'h','e','l','l','o'}将创建表示hello的字符串,该字符串将不会放置在池中。在你的情况下,新的斯特林赫洛;新字符串。。。使用通过Hellow字符串文字创建的池中的字符串,但通过new创建的字符串将不会放置在池中。
String one = "one";
String two = new String("one");   // one != two, one.equals(two) = true
String three = two.intern("one"); // one == three, one.equals(three) = true