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