java - 使用 equal(==) 运算符比较两个字符串

标签 java logic

我告诉某人,我们必须使用 String.equals 方法来比较两个字符串值,我们不能简单地使用 java 中的 == 运算符来比较字符串,并告诉他 == 会返回 false,因为它不比较字符串值,而是比较 String 对象引用值。

我写这个例子是为了向他展示,但令我惊讶的是,对于 == 运算符,它总是打印 true .. 这是代码

public void exampleFunc1(){

    String string1 = "ABC";
    String string2 = "ABC";

    if(string1 == string2)
        System.out.println("true");
    else{
        System.out.println("false");

    }   
    System.out.println(" Are they equal "+(string1 == string2)); // this shouldn't print True but it does
    System.out.println(" Are they equal "+(string1.equals(string2)));

}

输出:-

它们是否相等

它们是否相等

So question here is in what circumstances == operator on objects can print true, except that both objects are same instance?

最佳答案

String 是少数特殊情况之一。

String保留了一个特殊的“interned”String池。方法 myString.intern() 在此池中查找 myString。如果池中已存在另一个具有相同内容的String,则返回指向它的指针。如果没有,则添加myString(并返回一个指针)。

当您说 myString= myString.intern() ; 时,您实际上使 myString 引用共享副本或其基础 String可用于将来共享(且不得重复)。大多数创建 String 的库方法都会受到此影响,特别是 String 文字。

其他“驻留”情况发生在包装类型IntegerLong等中。它们没有构造函数,但有静态方法valueOf() 可以时返回预构建的共享对象(通常是最接近零的 256 个值),而不能时则返回新对象。后者没有太大问题,因为这些类型比 String 更轻量。例如,Long 的有效负载仅为 8 个字节。 String 包含一个 char[],即使是空也有 16 个字节左右。

要回答您的问题,您不能依赖任何“实习”机制。它们过去已经发生了变化,并且将来也可能会发生变化(甚至从一个 JVM 更改为另一个 JVM),从而使您的代码无法使用。始终使用等于

关于java - 使用 equal(==) 运算符比较两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18555379/

相关文章:

java - 如何在序列化之前从 DOM 中剥离纯空白文本节点?

Java Swing 为输出创建文本区域

java - "GMT"是 Java TimeZone 中的缩写吗?如果是的话可以使用它吗?

java - 使用 Ant 编译时为 "cannot find symbol"

java - Java 中 && 和被零除错误的不一致

javascript - 逻辑 && 和 || 有何作用括号外面做什么?

java - 在 Ubuntu 20.04 中运行 Telemetry Viewer 0.6 的 .jar 文件时出错

java - LibGDX 翻转 2D Sprite 动画

javascript - Jasmine 期望逻辑(期望 A OR B)

javascript - 引用错误: Invalid left-hand side in assignment