String s=new String("Computer");
if(s=="Computer")
System.out.print("equals A");
if(s.equals("Computer"))
System.out.print("Equal B");
输出是Equal B
现在为什么 ==
不生产equals A
什么是instanceof
?
String s=new String("Computer");
if(s=="Computer")
System.out.print("equals A");
if(s.equals("Computer"))
System.out.print("Equal B");
输出是Equal B
现在为什么 ==
不生产equals A
什么是instanceof
?
==
引用是否等于,例如,“这个确切的对象是否与其他对象完全相同?”。
当您创建s
了一个新对象时,它与您正在比较的字符串也不会是同一个对象(取决于您使用的 JVM,"foo" == "foo"
因为它将在内部使用相同的对象)。
当您调用.equals()
它时( String s
)运行它自己的逻辑来确定它是同一个对象。在 String 的情况下,它将逐个字符地比较它。
instanceof
完全是另外一回事,它会告诉你一个对象是否是某种类型的对象的一个实例,例如"foo" instanceof String
是真的。
如果两个字符串具有相同的值,该equals()
方法将返回。true
只有当两个字符串都指向同一个底层对象时,==
运算符才会是。因此,当通过该方法true
测试时,保证表示相同内容的两个字符串是相等的;equals(Object)
而当使用==
操作员进行测试时,只有当它们引用相同时才会成立Object
。因此,我们应该始终equals()
用于String
比较。
关键字可instanceof
用于测试对象是否属于指定类型。例如,
if(foo instanceof Bar) { // must not pass
}
有关更多信息,请参见此处。
同意这可能是另一个问题的重复,但无论如何我都会给出答案。
== 运算符用于确定两个对象或原始数据类型(如 int)是否相同。
因为 String 是一个对象,所以使用 == 来比较两个 String 是试图查看对象本身是否相同,而实际上它们不是。为了获得“等于 A”的结果,您需要将 s 与自身进行比较。
一个字符串的.equals()
和.equalsIgnoreCase()
是比较字符串对象的文本值的方法,这是您尝试做的。
instanceof
关键字用于发现对象的类型(例如,对象是字符串类型还是整数类型)。
x instanceof ClassName 当且仅当 x 是 ClassName 类或其任何子类的对象时才返回 true
x == y 对于值类型(char、int、float 等)和引用类型(Object、Integer、YourClass、int[]、...)的工作方式不同:对于值类型,如果 x 和 y 相同,则返回 true值,而对于引用类型,如果 x 和 y 表示同一个对象,则返回 true - 对于具有不同值的两个对象,结果可能为 false。只需将引用类型上的 == 视为 C++ 中指针的比较 - 如果表示指针的整数相等,则结果为真,即指针表示相同的对象。所以: new String("abc") == new String("abc") 是假的 - 相同的值但不同的对象,类似地 "abc" == new String("abc") 是假的,但 "abc" == "abc" 为真,因为如果一个 String 常量在 .class 文件中出现多次,它会被转换为一个 String 对象。
x.equals(y) 默认情况下(在 Object.equals 中)实现为 x == y,但许多子类会覆盖它,例如对于字符串,x.equals(y) 检查这些字符串是否具有相同的值,尽管如果它们是相同的对象,那么: new String("abc").equals(new String("abc")) 为真,并且 "abc".equals("abc") 为真
但是,如果您要比较的所有字符串都已“实习”,例如: x = x.intern(); y = y.intern(),然后 x == y 将起作用。因此,例如 "abc" == new String("abc").intern() 给出 true。
如果您将字符串定义为 s="Computer" 而不是创建新对象,它将返回 true。这是因为 java 将字符串文字存储在特殊的内存空间中,因此 s 和 "Computer" 字符串将指向相同的内存位置。instanceof 是一个运算符,如果左侧对象是右侧指定的类的类型,则返回 true。
例如
String s="";
if(s instaceof java.util.String){
......
}
前面的代码将返回 true。