== 对于基本类型和引⽤类型的作⽤效果是不同的:
对于基本数据类型来说, == 比较的是值。
对于引⽤数据类型来说, == 比较的是对象的内存地址。
因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引⽤数据类型的 变量,其本质比较的都是值,只是引⽤类型变量存的值是对象的地址。
基本数据类型:
6 种数字类型:
4 种整数型: byte 、 short 、 int 、 long
2 种浮点型: float 、 double
1 种字符类型: char
1 种布尔型: boolean 。
引用数据类型:
3 种:类,接口,数组。
equals:
equals() 不能⽤于判断基本数据类型的变量,只能⽤来判断两个对象是否相等。 equals() ⽅法存在 于 Object 类中,⽽ Object 类是所有类的直接或间接⽗类,因此所有的类都有 equals() ⽅法。
public boolean equals(Object obj) {
return (this == obj);
}
equals() ⽅法存在两种使⽤情况:
类没有重写 equals() ⽅法 :通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个 对象,使⽤的默认是 Object 类 equals() ⽅法。
类重写了 equals() ⽅法 :⼀般我们都重写 equals() ⽅法来比较两个对象中的属性是否相等; 若它们的属性相等,则返回 true(即,认为这两个对象相等)。
String a = new String("ab"); // a 为⼀个引⽤
String b = new String("ab"); // b为另⼀个引⽤,对象的内容⼀样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
System.out.println(aa == bb);//直接比较的是值 true
System.out.println(a == b);//通过new创建对象内存地址不同 false
System.out.println(a.equals(b));// 属性值相等 true
System.out.println(42 == 42.0);// true
String 中的 equals ⽅法是被重写过的,因为 Object 的 equals ⽅法是比较的对象的内存地址, ⽽ String 的 equals ⽅法比较的是对象的值。 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对 象,如果有就把它赋给当前引⽤。如果没有就在常量池中重新创建⼀个 String 对象。
String中的equals方法:比较的是值
public boolean equals(Object anObject) {
//判断是否是同一个引用,是返回true否则返回false
if (this == anObject) {
return true;
}
//是否是String类型,是进入
if (anObject instanceof String) {
//向下转型,转为String
String anotherString = (String)anObject;
//获取他们值的长度,判断长度是否相同,是进入
int n = value.length;
if (n == anotherString.value.length) {
//将值转为char数组,进行比较只要有一个不想等就返回false
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;
}