你是否遇到过这样的问题?
String str1 = "Hello"; String str2 = new String("Hello"); String str3 = str2; // 引用传递 System.out.println(str1 == str2); System.out.println(str1 == str3); System.out.println(str2 == str3); System.out.println(str1.equals(str2)); System.out.println(str1.equals(str3)); System.out.println(str2.equals(str3)); 以上代码输出true还是false
或者是这样的问题
Integer i6 = 123; System.out.println(i5 == i6); //true System.out.println(i5.equals(i6));//true Integer i7 = 130; Integer i8 = 130; System.out.println(i7 == i8); //false System.out.println(i7.equals(i8)); //true 以上代码输出true还是false
今天,让我们一起来解答Java中equal和==的异曲同工之处!
/** * 实战:equal 和 == 以及在对象、类型下的情况 */ public class article0603 { /** * 理论1: * ==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中的内存对象的地址 * 理论2: * String类中被复写的equals()方法其实是比较两个字符串的内容 * equal()比较的是类型和值,类型相等时再比较值,都相等时返回true */ public static void test01() { String str1 = "Hello"; String str2 = new String("Hello"); String str3 = str2; // 引用传递 System.out.println(str1 == str2); // false System.out.println(str1 == str3); // false System.out.println(str2 == str3); // true System.out.println(str1.equals(str2)); // true System.out.println(str1.equals(str3)); // true System.out.println(str2.equals(str3)); // true } /** * 理论3: * ==在比较引用类型时是比较的内存中栈的值 * 理论4: * 为Integer赋值时调用的方法为Integer.valueOf(),当值在-127到128之间时会进行缓存, * 使用同一对象,超过时则创建新的对象 */ public static void test02() { Integer i1 = new Integer(100); Integer i2 = new Integer(100); System.out.println(i1 == i2);//false System.out.println(i1.equals(i2));//true Integer i3 = new Integer(129); Integer i4 = new Integer(129); System.out.println(i3 == i4); //false System.out.println(i3.equals(i4));//true Integer i5 = 123; Integer i6 = 123; System.out.println(i5 == i6); //true System.out.println(i5.equals(i6));//true Integer i7 = 130; Integer i8 = 130; System.out.println(i7 == i8); //false System.out.println(i7.equals(i8)); //true } /** * 理论5: * 实例化obj的equals()方法被重写,任何值都会返回true */ public static void test03() { Object obj = new Object() { @Override public boolean equals(Object s) { return true; } @Override public String toString() { return "abc"; } }; System.out.println(obj);//abc System.out.println(obj.equals("abcde")); //true } public static void main(String[] args) { test01(); test02(); test03(); } }
总结:
- ==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中的内存对象的地址
- String类中被复写的equals()方法其实是比较两个字符串的内 equal()比较的是类型和值,类型相等时再比较值,都相等时返回true
- ==在比较引用类型时是比较的内存中栈的值
- 为Integer赋值时调用的方法为Integer.valueOf(),当值在-127到128之间时会进行缓存,==使用同一对象,超过时则创建新的对象
- 例化obj的equals()方法被重写,任何值都会返回true