Java中==和equals的区别
在Java中“==”和“equals()”都是用于比较两个对象是否相等,但是他们之间还是有着许多不同之处。
两者的区别
“==”是一个操作符,用于比较两个操作数的值是否相等。如果操作数为值类型,比较的是值是否相等,如果操作数为引用类型,比较的是地址值是否相等。
“equals()”是一个定义在Object类中的方法,默认情况下,它也是判断两个对象的值是否相等,即与"=="操作符等效。“equals()”方法通常被用于比较对象的内容是否相等,它是一个实例方法,需要被重写以实现自定义的对象比较逻辑。
特殊案例
-
案例1:
String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); System.out.println(str1 == str2); // true System.out.println(str1 == str3); // false
在上面的例子中,str1和str2都是指向同一个字符串常量池中的"hello"字符串,所以它们的引用相等返回true。而str3则是通过new关键字新创建了一个String对象,它的引用指向堆内存中另外一个地址,与str1的引用地址不相等返回false。
-
案例2:
在Java中,对于小于等于127的整数类型和char类型的包装类型,会存在缓存机制。也就是说,当使用自动装箱或者调用valueOf()方法创建这些包装类型的对象时,如果值在-128到127之间,那么会从缓存中直接返回一个已经存在的对象,而不是新建一个对象,从而提高了性能和减少了内存开销。
Integer a = 100; Integer b = 100; System.out.println(a == b); // true Integer c = 200; Integer d = 200; System.out.println(c == d); // false
在上面的例子中,由于100在-128到127之间,所以a和b都会引用同一个对象,因此“==”运算符返回true;而200不在这个范围内,c和d会分别引用不同的对象,所以返回false。需要注意的是,这种缓存机制只针对自动装箱和valueOf()方法,而直接调用构造函数创建对象时则不会使用缓存。对于包装类型推荐使用 equals 方法进行判断。
作者:Crazy_Joker
来源:http://www.cnblogs.com/Crazy_Joker
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
来源:http://www.cnblogs.com/Crazy_Joker
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。