写在前面
学习的时候时刻要注意输出,输入的过程可能你没有体会到其中的精髓,你觉得自己很懂,其实是一直半解
碰到情况
想模拟一个登陆请求,密码不等于123456就else
稀里糊涂写出来
==的用法
- 结论:== 比较的是"值"是否相等
- 情况1对于基本类型的比较
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); //true
在函数中定义的基本类型变量(即基本类型的局部变量)和对象的引用变量(即对象的变量名)都在函数的栈内存中分配
故对于基本类型而言,栈内存放的值就是10,== 比较的是值,所以输出true
- 情况2对于引用性不new String的String类型比较
String s1 = "chance";
String s2 = "chance";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
当执行String s1 = “chance”;这条语句时,会在方法区中的字符常量池里找”chance”这个字符串,若没有找到,则将”chance”这个字符串放入字符串常量池中.而在栈中开辟一块名为s1的空间存放”chance”,这块空间的引用
我们已经说 == 比较的的值,在此例中,值为方法去字符串常量的地址,值相同,输出true。
4. 对于new String和普通常量的比较
你肯定明白了,对于new String和普通常量的 == 结果肯定为false,因为对象在堆内存的地址不同
5. 结论
首先,== 比较的就是值
对于基本变量类型,他们的值存在栈中,所以输出true
对于String类型的,如果不是new String的话,会在方法去的字符串常量池中找,所以指向的是同一个地址 输出true
对于new String和其他对象的比较,无论其中的“内容”是否相同,两个对象地址不同,输出false.
equals的用法
- equals方法用于两个对象的比较,不能比较基本对象
equals方法的源码是利用**==** ,本身与刚才讨论的并无不同 - special case
String,Data类型重写了equals方法
这比较的就是内容
总结!
1)对于==,比较的是值是否相等
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址即占栈内存里面存放的值
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。