equals 和 == 的区别
1. == 的作用
- == 的作用: 对内容或值进行比较(用于基本类型或者引用类型之间的比较)
- 基本类型比较值是否相同; 引用类型比较指向的地址是否相同(java中唯一使用真实地址的操作)
- 格式: A == B
2. equals作用
- 作用: 对象比较(先比较两个对象的类型,再对对象中属性值比较)
- 在实际使用中,一般会重写定义的class的equals方法
- 特点
- 只能用于引用类型
- 容易产生空指针异常
- equals相同,hashCode一定相同
- hashCode相同,equals不一定相同
例如: a存储了一个对象的地址,b == null,a和b分别对equals进行调用
a.equals(b) = false
b.equals(a) 空指针异常
3. equals的重写
- 在Object类中定义了equals方法;
public boolean equals(Object obj){
return (this == obj);
}
- 这种比较对象内存地址值意义不大,所以在一些实际的类库中,这个方法被重写了,如String,Data类。
- 比如 String 中重写的equals方法:
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;
}
4. 例子
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2);
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1==str2);
5. java中的堆和栈
- 堆和栈都是java用来在RAM中存放数据的地方,java自动管理栈和堆,程序员不能直接设置
- java的堆是一个运行时的数据区,类的对象从中分配空间。这些对象通过new,newarray等建立。
int a = 3;
int b = 3;
编译器先处理int a = 3; 首先在栈中创建一个变量为的引用,然后查找栈中是否有 3 这个值,如果没找到,就将3存进了,把a指向3;
接着处理int b = 3; 因为栈中已经有3了,所以直接把b指向3。
这时如果有 int a = 4, 那么编译器就会重新搜索栈,如果没有4,就把4存进了,把a指向4,因此a的值不影响b的值
对于String
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2);
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1==str2);
同理,String str1 = "abc"; String str2 = "abc"; 在内存中只存在一个对象而已,有利于节省内存空间,在一定程度上提高运行速度,因为JVM会自动根据栈中的实际情况来决定是否有必要创建新对象。
而 String str1 = new String("abc"); 是在堆中创建对象,不管字符串是否相等,加重程序负担
由于 String类的immutable性质,当String变量需要经常更换值时,应该考虑使用StringBuffer类,以提高效率