-
== 在比较基本数据类型时,是比较两边的数据的值是否相等
// 整数类型 int num1 = 1; // 双精度浮点数类型 double num2 = 1.0; // 输出结果为 true System.out.println(num1 == num2);
-
== 在比较引用数据类型时,比较的是两边对象的内存地址,也就是判断两个对象是否指向同一个内存对象
// 第一种情况 // 定义一个字符串str1 String str1 = "test"; // 将定义的字符串直接赋给str2,其实只是将对象str1的引用赋给了str2,此时两个对象指向同一个内存对象 String str2 = str1; // 输出结果为 true System.out.println(str1 == str2); // 第二种情况 // 定义一个字符串str1 String str1 = "test"; // 对于字符串类型,简单第一次创建一个字符串时,会在方法区中的常量池里面创建一个字符串 // 等第二次在创建一个同样的字符串时,内存中不会再创建一个新的同样的字符串,而是直接将旧的字符串引用赋过去 String str2 = "test"; // 输出结果为 true System.out.println(str1 == str2); // 第三种情况 // 使用new关键字在内存中创建一个对象str1 String str1 = new String("test"); // 使用new关键字在内存中创建一个对象str2 String str2 = new String("test"); // 使用new关键字是在内存中创建新的对象,两个对象在内存中指向的内存地址不一样,输出结果为 false System.out.println(str1 == str2);
-
Object类中的equals()方法
- 在Object类中的方法底层采用的其实是使用==进行比较,也就是说如果子类不对equals()方法进行重写默认比较的还是两个对象的内存地址(String类型除外,因为String类重写了equals()方法,比较的是两个字符串的内容)
/** * 如果子类不对equals()方法进行重写默认比较的还是两个对象的内存地址 * @anObject 需要比较的对象 * @return 指向同一个对象返回true,否则返回false */ public boolean equals(Object obj) { return (this == obj); }
-
String类中的equals()方法
/** * String类重写了Object类中的equals()方法,比较的是两个字符串的内容 * @anObject 需要比较的对象 * @return 两个字符串相等返回true,否则返回false */ public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
例如:
// 定义一个字符串str1 String str1 = new String("test"); // 将定义的字符串直接赋给str2 String str2 = new String("test"); // 因为String类重写了Object类中的equals()方法,比较的是两个字符串的内容,输出结果为 true System.out.println(str1.equals(str1));