我告诉某人,我们必须使用 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
文字。
其他“驻留”情况发生在包装类型Integer
、Long
等中。它们没有构造函数,但有静态方法valueOf()
可以时返回预构建的共享对象(通常是最接近零的 256 个值),而不能时则返回新对象。后者没有太大问题,因为这些类型比 String
更轻量。例如,Long
的有效负载仅为 8 个字节。 String
包含一个 char[]
,即使是空也有 16 个字节左右。
要回答您的问题,您不能依赖任何“实习”机制。它们过去已经发生了变化,并且将来也可能会发生变化(甚至从一个 JVM 更改为另一个 JVM),从而使您的代码无法使用。始终使用等于
。
关于java - 使用 equal(==) 运算符比较两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18555379/