Java字符串实例化

时间:2017-05-22 20:42:23

标签: java string reference pool

为什么此代码返回“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”关键字创建的。我想知道为什么会这样。

3 个答案:

答案 0 :(得分:1)

字符串常量池在编译时创建。当你连接字符串文字 / 最终变量/ 最终字段时,它只使用池中的字符串,除了最终参数,例如:

Concat Literals

String fullName = "Name Lastname";
String firstNamePlusLastName = "Name " + "Lastname";

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

Concat最终变量

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;时,您联合namelastName创建了一个新字符串。这不是文字,你没有调用intern所以这个字符串没有添加到字符串池中。