Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串实例化_Java_String_Reference_Pool - Fatal编程技术网

Java字符串实例化

Java字符串实例化,java,string,reference,pool,Java,String,Reference,Pool,为什么此代码返回“false”而不是“true”: 如果我没记错的话: String firstNamePlusLastName = name + lastName; 应该创建一个指向内存(字符串池)中现有地址的字符串,因为我们已经声明了一个值为“Name Lastname”的字符串,它不应该自动插入到字符串池中,并且输出不应该为“true”,因为我们在字符串池中已经有与字符串firstNamePlusLastname具有相同值的字符串吗 编辑: 我知道在测试两个字符串的内容是否相等时应该使用

为什么此代码返回“false”而不是“true”:

如果我没记错的话:

String firstNamePlusLastName = name + lastName;
应该创建一个指向内存(字符串池)中现有地址的字符串,因为我们已经声明了一个值为“Name Lastname”的字符串,它不应该自动插入到字符串池中,并且输出不应该为“true”,因为我们在字符串池中已经有与字符串firstNamePlusLastname具有相同值的字符串吗

编辑:


我知道在测试两个字符串的内容是否相等时应该使用.equals()方法,但我不想在上面的示例中这样做,我确实想测试引用是否相等,并且基于Java,我在上面的代码中比较的两个字符串应该相等,但它们不是,它们应该指向内存中相同的地址,因为它们具有相同的内容,并且两个字符串都不是使用“new”关键字创建的。我想知道为什么会发生这种情况。

因为必须对字符串使用
.equals()

fullName.equals(firstNamePlusLastName)

=
测试引用是否相等(它们是否是相同的对象),这意味着完全相同,甚至相同的引用

.equals()
指的是对象的equals实现,对于string,它意味着如果它们具有相同顺序的相同字符

考虑这一点:

    String a = new String("a");
    String anotherA = new String("a");
    String b = a;
    String c = a;

a == anotherA -> False;
b == a -> True
b == c -> true
anotherA.equals(a) -> True

字符串文本被拘留。当您通过任何非文本的方法(调用
new string()
、读取输入、连接等)创建字符串时,它将不会自动插入。调用
String firstNamePlusLastName=name+lastName
您将
name
lastName
连接起来,创建了一个新字符串。这不是一个文本,并且您没有调用
intern
,因此此字符串不会添加到字符串池。

在编译时创建字符串常量池。它仅在处理字符串文本/最终变量/最终字段时使用池中的字符串,但最终参数除外,例如:

Concat文本 Concat最终变量
您必须使用
equals
来比较两个字符串对象。我相信JLS坚持认为这是错误的。如果您将引用设为最终引用,那将是另一回事。@KevinO:不,它也可以是其他字符串常量的串联。。。使用字符串常量初始化的静态最终字段或使用字符串常量初始化的最终本地字段也是常量表达式。因此,是的,总会有一个字符串文字(除非所有内容都为null),但这不是同一件事。我的呢,先生。是的,如果你创建这样的字符串:string someString=“Some content”;然后创建另一个类似这样的:String anotherString=“Some content”;用“==”测试是否相等它返回true,因为第一个字符串是JVM隐式插入的,但上面的例子不是这样,我只是想知道为什么。我认为这仍然不能回答问题。OP想知道为什么不在编译时进行连接,然后将结果添加到字符串池。@Damian Lattenero,正如Jon Skeet和KevinO所确认的,使用Dawood是正确的。不,字符串常量被保留。从3.10.5开始:“这是因为字符串文字——或者更一般地说,是常量表达式(§15.28)的值的字符串——被“插入”,以便使用string.intern方法共享唯一实例。”不仅仅是任何final——它们必须是最终局部变量或静态final字段,它们必须用常量表达式初始化。@JonSkeet我想我需要修复它,:)。因为
最终
参数不起作用。非常感谢。@JonSkeet:不需要约束变量的类型。该规范规定,任何使用编译时常量初始化的
final
变量(并且是基元类型或
String
)都是编译时常量。这会自动排除参数,因为参数不能有初始值设定项。但是,这意味着字段不必是
静态的
,而是编译时常量。(虽然,恒定的非静态字段是对内存的浪费…@Holger:很有趣,是的。
    String a = new String("a");
    String anotherA = new String("a");
    String b = a;
    String c = a;

a == anotherA -> False;
b == a -> True
b == c -> true
anotherA.equals(a) -> True
String fullName = "Name Lastname";
String firstNamePlusLastName = "Name " + "Lastname";

System.out.println(fullName == firstNamePlusLastName);// true
String fullName = "Name Lastname";
final String name = "Name ";
final String lastName = "Lastname";
String firstNamePlusLastName = name + lastName;

System.out.println(fullName == firstNamePlusLastName);//true