String , Data , File和基本数据类型的包装类重写了equals()方法使得其比较的是内容,而其他的类都是比较地址。
ava对字符串的处理比较特殊,会开辟一个字符串池,你每声明一个字符串(不用 new String()),他就会去搜索这个池看看是否已经存在,如果用new String()他会另辟内存,就是说 String a=”How are you”; String b=new String(a); b的内容跟a一样,但是地址不同, 如果是: String a=”How are you”; String b=”How are you”; 那么b仅仅是a的别名,它们两个的引用空间的地址是一样的
public class Test { public static void main(String args[]) { String a = "how are you?"; String b = "how are you?"; //String b = new String(a); if(a == b) System.out.println("=="); if(a.equals(b)) System.out.println("equals"); } } 这样的话既能输出==,又能输出equals.原因是使用“==”是比较两个String 的地址,在java里面,这样定义意为着他们的地址是相同的,然后他们的值也相同,所以两个都输出来了。
其实equals() 默认的也是比较两个对象的引用,但是String重载了这个方法,让他比较内容了
结果是:equals
==默认比较的是hash码,相当于C语言里面的地址
而equals比较的是对象里面的具体内容。equals可以自己重写比较规则
String类重写过了equals方法,只要2个字符串内容是相同的就算相等
所以就返回true
String a=”How are you”;
String b=new String(a);
b的内容跟a一样,但是地址不同,
如果是:
String a=”How are you”;
String b=”How are you”;
那么b仅仅是a的别名,它们两个的引用空间的地址是一样的
{
public static void main(String args[])
{
String a="How are you";
String b=new String(a);
if(a==b) System.out.println("==");
if(a.equals(b)) System.out.println("equals");
}
}String a="How are you";在字符串池生成了一个对象,值是"How are you",a是它的引用。
String b=new String(a);在堆里创建了一个对象,值是"How are you",b 是它的引用。
==比较的是地址,两个引用指向的地址很显然不同,一个在字符串池,一个在堆。
equals比较的是值,值相同。如果改成
String a="How are you";
String b="How are you";(这里会先搜索字符串池,发现有相同的字符串存在,不创建新的对象)
则两个引用指向相同的对象。此时会打印出 “==” 和“eauals".
String a="1";
String b="1";
String c=new String("2");
String d=new String("2");
System.out.println(a==b);
System.out.println(c==d);
System.out.println(c.equals(d));
(1) 如果是基本类型比较,那么只能用==来比较,不能用equals比如:
public class TestEquals {
public static void main(String[] args)
{
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}(2) 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如:
public class TestEquals {
public static void main(String[] args)
{ Integer n1 = new Integer(30);
Integer n2 = new Integer(30);
Integer n3 = new Integer(31);
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}
这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。(3) 注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)这三个类作进一步的说明。
(a)首先,介绍String的用法,请看下面的实例:
public class TestEquals {
public static void main(String[] args) {
String s1 = "123";
String s2 = "123";
String s3 = "abc";
String s4 = new String("123");
String s5 = new String("123");
String s6 = new String("abc");System.out.println(s1 == s2);//(1)true
System.out.println(s1.equals(s2));//(2)true
System.out.println(s1 == s3);//(3)flase
System.out.println(s1.equals(s3));//(4)flaseSystem.out.println(s4 == s5);//(5)flase
System.out.println(s4.equals(s5));//(6)true
System.out.println(s4 == s6);//(7)flase
System.out.println(s4.equals(s6));//(8)flaseSystem.out.println(s1 == s4);//(9)false
System.out.println(s1.equals(s4));//(10)true
}
}
public static void main(String args[]){
String a="How are you";
String c="How are you";
String b=new String(a);
if(a==b) System.out.println("==ab");
if(a==c) System.out.println("==ac");
if(a.equals(b)) System.out.println("equals:ab");
if(a.equals(c)) System.out.println("equals:ac");
}
}
先自己想想结果是什么。结果应该是
==ac
equals:ab
equals:ac
想明白为什么了吗?a和c在写程序的时候就都已经是写成了"How are you";
虽然a和c变量名不同,但是他们指向相同的地址(这是因为,系统看到他们的内容是一样的,就把这个字符串存在同一个内存空间,只存储一次,之后吧这个空间的地址给变量名),也就是String变量所直接存储的东西,==运算符比较的就是这个直接的东西,所以a和c用==比较的结果是true;
而需要注意的是,b=new String(a);和上面的直接写出来的效果是不一样的,系统真的会分配另一块空间出来~~所以用==比较a和c就是false;
而equals就不一样了,它比较的是字符串的内容。你可以想象equals是怎么做的,取出字符串中中下标相同的字符一个一个地比较。
a和b比较好理解,是两块不同内存区域中的数据一一比较,而a和b的比较实际上是同一块内存区域里面的东子,自己equals自己,所以返回结果也是true。
==是地址比较equals是值比较
equals 和 '==' 的真正区别
String a=”How are you”;
String b=new String(a);
b的内容跟a一样,但是地址不同,
如果是:
String a=”How are you”;
String b=”How are you”;
那么b仅仅是a的别名,它们两个的引用空间的地址是一样的
public class Test
{
public static void main(String args[])
{
String a = "how are you?";
String b = "how are you?";
//String b = new String(a);
if(a == b) System.out.println("==");
if(a.equals(b)) System.out.println("equals");
}
}
这样的话既能输出==,又能输出equals.原因是使用“==”是比较两个String 的地址,在java里面,这样定义意为着他们的地址是相同的,然后他们的值也相同,所以两个都输出来了。
==比较的是地址,而“equals”比较的是内容,在String这个类里面重写了equals这个类,(去看看API里面String和equals这两个类)所以可以得出squals这个结果,去熟悉一下内存的分配对LZ会有用的