55、相等性的比较(==)
A)对于原生数据类型来说,比较的是左右两边的值是否相等。
B)对于引用类型来说,比较左右两边的引用是否指向同一个对象。或者说左右两边的引用地址是否相同。
56、equals()方法,该方法定义在Object类当中,因此java中的每个类都具有该方法,对于Object类的equals()方法来说,它是判断调用equals方法的引用与传进来的引用是否一致,即这两个引用是否指向的是同一个对象。对于Object类的equals()方法来说它等价于==。
57、对于String类的equals()方法来说,它重写了Object的equals方法()。它是判断当前字符串与传进来的字符串的内容是否一致。
【String的equals方法:
public Boolean equals(Object anObject) {
if(this == anObject){
return true;
}
If(anObject instanceof String){
String anotherString =(String)anObject;
Int n = count;
If(n == anotherString.count){
Charv1[] = value;
Charv2[] = anotherString.value;
int i= offset;
int j= anotherString.offset;
while(n--!= 0){
if(v1[i++]!= v2[j++]){
returnfalse;
}
}
return true;
}
}
}
Object的equals方法:
Public Boolean equals (Object anObject){
Return(this == anObject);
}
58、对于String对象的相等性判断来说,请使用equals()方法,而不要使用==。
59、String是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。
60、String Pool(字符串池)。
61、Strings = “aaa”;(采用字面值方式赋值)
1)查找String Pool 中是否存在“aaa” 这个对象,如果不存在,则在String Pool中创建一个”aaa”对象,然后将String Pool中的这个“aaa”对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2)如果存在,则不创建任何对象,直接将String Pool中的这个“aaa”对象地址返回来,赋给s引用。
62、Strings = new String(”aaa”);
1)首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则不在String Pool中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“aaa”字符串对象。
2)如果没有,则首先在String Pool中创建一个“aaa”对象,然后再在堆中(heap)创建一个“aaa”对象,然后将堆中的 这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中所创建的这个“aaa”对象。
=================================以上文字出自张龙老师的视频=================================
对于很多初学者来说,往往很难分辨equals和==的区别,有的人一开始甚至了解的很模糊,甚至看看课本就不管了。其实像这种规定一类的东西,光片面的看,是很理解的。
就如我一样,我是从c开始学的,学了有差不多一年,就开始学java了。在c里面,==就是判断两个字符串是否相等。而java里却不一样了。刚开始判断字符串时,老师讲的也很片面,当时,也就硬记的。其实并没什么用。后来看到张龙老师讲的视频,才知道原理。像这种原理性的东西,看源码会更容易理解。
上面出现的代码出自JDK 1.6 。现在分析下源码:
之前我们都知道传值,有值传递,引用传递。equals是Object的方法,所以所有类都会继承该方法。而有的类会重写该方法。同时也说明,我们自己定义的类,不要忘了重写该方法,不然用equals方法时,实际就是调用的父类Object的equals方法。
String重写的equals方法:
public Boolean equals(Object anObject) { //Object属于对象,多以此处是引用传递
if(this == anObject){ //this代指当前对象,除非自身与自身相等,正如世界上没有两个相同的人一个道理。
return true;
}
If(anObject instanceof String){ //判断接受的引用所指的对象是否属于String类。instanceof的作用就是区别一个对象是否是某个类的实例。
String anotherString =(String)anObject; //如果是,则把anObject强制转换为String类。
Int n = count; //以下就是判断相比较的两个对象的内容的。
If(n == anotherString.count){
Charv1[] = value;
Charv2[] = anotherString.value;
int i= offset;
int j= anotherString.offset;
while(n--!= 0){
if(v1[i++]!= v2[j++]){
return false; // 内容不同则返回false。
}
}
return true;
}
}
}
Object的equals方法:
Public Boolean equals (Object anObject){ //同样是引用传递
Return(this == anObject); // 判断两个引用是否相等。除非是原生数据类型相等外,其他均为false;
}
=========================================================================