equals和==区别
程序员文章站
2022-07-01 23:17:00
原文链接:https://www.cnblogs.com/army-code/p/10497662.html 1>==比较 I.对于基础数据类型(byte,short,int,long,float,double,boolean,char)比较时,使用==,比较的是数值大小(栈中的数据共享) 基础数据 ......
原文链接:https://www.cnblogs.com/army-code/p/10497662.html
1>==比较
i.对于基础数据类型(byte,short,int,long,float,double,boolean,char)比较时,使用==,比较的是数值大小(栈中的数据共享)
基础数据类型在内存的存储:都是存储在栈中(栈中的数据共享)
1 public void method(){ 2 int a=2; 3 int b=2; 4 a=3 5 }
执行第2行:在栈创建a的引用,然后查找栈中是否存在2的地址,没有开辟一个存储2的地址
执行第3行:在栈创建a的引用,然后查找栈中是否存在2的地址,有,直接把地址赋予b
执行第4行:查找栈中是否存在3的地址,没有开辟一个存储3的地址
ii.对于引用数据类型,比较的是引用内存地址,即同一个对象,无论如何改变对象里面的值,比较的结果都为true,除非新new一个对象为false
2>equals比较
原始equals和==是相同的,我们通过object的equals可以看出
public boolean equals(object obj) { return (this == obj); }
都是比较的内存地址
有些对象对equals进行重新(java.lang.string,java.util.date),例如string的equals方法:
1 public boolean equals(object anobject) { 2 if (this == anobject) { 3 return true; 4 } 5 if (anobject instanceof string) { 6 string anotherstring = (string)anobject; 7 int n = value.length; 8 if (n == anotherstring.value.length) { 9 char v1[] = value; 10 char v2[] = anotherstring.value; 11 int i = 0; 12 while (n-- != 0) { 13 if (v1[i] != v2[i]) 14 return false; 15 i++; 16 } 17 return true; 18 } 19 } 20 return false; 21 }
先对内存地址比较,不相等,再对string对象中的value进行比价
注意:
string s1=“asd” 和 string s2 = new string(“asd”);的区别
string s1=“asd” 在栈内存中开辟一个空间,存储s1的引用,然后从栈中查找”asd”值,如果存在直接返回地址,不存在,开辟空间创建”asd”并返回起始地址给s1
string s2 = new string(“asd”);和普通对象初始化一样,在栈中开辟s2的引用空间,在堆中存储”asd”
所以:
string s1=“asd”; string s2=“asd”; system.out.printl(s1==s2); //输出true string s1 = new string(“asd”); string s2=“asd” system.out.printl(s1==s2); //输出false