为什么此代码返回“false”而不是“true”:
package com.company;
public class Main {
public static void main(String[] args) {
String fullName = "Name Lastname";
String name = "Name ";
String lastName = "Lastname";
String firstNamePlusLastName = name + lastName;
System.out.println(fullName == firstNamePlusLastName);
}
}
如果我没记错的话:
String firstNamePlusLastName = name + lastName;
应该创建一个指向内存中现有地址的String(字符串池),因为我们已经声明了一个带有值的字符串:“Name Lastname”,它不应该自动插入到字符串池中而不应该输出是“true”,因为我们已经在字符串池中具有与String firstNamePlusLastname相同的值的字符串?
编辑:
我知道在测试两个字符串是否存在内容相等时我应该使用.equals()方法,但我不想在上面的例子中这样做,我实际上确实想测试引用相等性,并且基于Java在上面的代码中我比较的两个字符串应该是相同的,但它们不是,它们应该指向内存中的相同地址,因为它们具有相同的内容,并且两个字符串都不是使用“new”关键字创建的。我想知道为什么会这样。
答案 0 :(得分:1)
字符串常量池在编译时创建。当你连接字符串文字 / 最终变量/ 最终字段时,它只使用池中的字符串,除了最终参数,例如:
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
答案 1 :(得分:0)
因为您必须使用.equals()
字符串
fullName.equals(firstNamePlusLastName)
==
测试引用相等性(它们是否是同一个对象),意思完全相同,甚至是相同的引用。
.equals()
指的是对象的等于实现,对于字符串,如果它们具有相同顺序的相同字符,则表示。
考虑一下:
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
答案 2 :(得分:-1)
字符串文字被实习。当您通过任何非文字方法(调用new String()
,从输入,连接等读取)创建字符串时,它将不会自动实现。当您致电String firstNamePlusLastName = name + lastName;
时,您联合name
和lastName
创建了一个新字符串。这不是文字,你没有调用intern
所以这个字符串没有添加到字符串池中。