java中的数据类型
基础数据类型
基础数据类型有byte、short、char、int、long、float、double、bool、String。除了 String 会比较地址,其它的基础类型的比较,使用 == 和 equals() 两者都是比较值。
-
String类的equals()方法源码
public boolean equals(Object anObject) {
if (this == anObject) { //先比较地址,如果相同直接返回true
return true;
}
if (anObject instanceof String) {//如果地址不相同,判断要比较的对象是不是String实例,如果不是直接返回false
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {//比较两个对象的长度,如果不相等直接返回false
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
//比较两个string对象的每个字符,如果都相等,就返回true,有一个不相等就返回false
return true;
}
}
return false;
}查看源码可知,String 类型的 equals 方法既会比较地址,也会比较字符串的每个字符(值).
-
String类型的equals()比较
public class Main {
public static void main(String[] args) {
String name1 = new String("123");
String name2 = new String("123");
System.out.println(name1 == name2);//false
System.out.println(name1.equals(name2));//true
}
}结果分析: name1 和 name2 是 String 的两个不同实例,name1==name2 是比较 name1 与 name2 的地址,所以返回 false。而 name1.equals(name2) 先是比较两者的地址,发现不同后接着比较两者的值,相同,所以返回 true。
复合数据类型(类)
-
Object类中equals()方法源码
public boolean equals(Object obj) {
return (this == obj);
}查看源码可知,当自己定义的类如果不重写 Object 类中 equals() 方法时,调用 equals() 方法其实和直接用 == 判断的效果一样。
-
未重写时
public class Person {
private String name; public Person(String name) {
this.setName(name);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}Person.java
public class Test {
public static void main(String[] args) {
Person person1 = new Person("zze");
Person person2 = new Person("zze");
System.out.println(person1 == person2);//false
System.out.println(person1.equals(person2));//false
}
} -
重写时
public class Person {
private String name; public Person(String name) {
this.setName(name);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public boolean equals(Object obj) {
if(obj instanceof Person){
return this.name==((Person) obj).name;
}
return false;
}
}Person.java
public class Test {
public static void main(String[] args) {
Person person1 = new Person("zze");
Person person2 = new Person("zze");
System.out.println(person1 == person2);//false
System.out.println(person1.equals(person2));//true
}
}
结论
首先,基本数据类型与复合数据类型在内存中存储的的方式是不同的:
- 基本数据类型在栈中存储的是值。
- 复合数据类型在栈中存储的是地址,来指向堆内存的实例。
可以这样理解:使用 == 比较的时候都是比较变量中存储的值,但基础类型的变量中存储的值就是实际值,而复合数据类型变量中存储的值是指向堆对象的引用地址。而 equals() 方法就是一个依赖于 == 实现普通函数,只不过它的实现是在所有对象的基类 (Object) 中.