一般情况下:
基本类型使用==做比较
引用类型使用equals做比较
但在字符串的比较方面有一些特殊之处
1. ==
- 比较基本类型时
是比较存储的值是否一样
System.out.println(9==10);//false
- 比较引用类型时(以字符串为例)
和内存存储区域有关
基本类型:存储的是值,存储在栈中,比较的是值
引用类型:存储的是数据和引用,==比较的是引用
System.out.println("www.baidu.com"=="www.baidu.com");//true
两个字符串比较的时候,比较的是内存地址。两个字符串都是常量,在内存区域的静态区中。由于是一样的字符串,所以在静态区只保存一份。所以true。当两个字符串不一样时,在静态区中才会申请一份新的内存存储不一样的字符串
加入变量s2,s3,s4
String s2=new String("www.baidu.com");
String s3="www.baidu.com";
String s4="www.baidu.com";
System.out.println(s2==s3);//false
System.out.println(s3==s4);//取得的两个字符串内存地址是一样的true
s3和s4在栈里存储,二者指向089地址的内存区域,= =比较引用,所以s3==s4(true)
s2构造变化,new了一个新的String,String传递常量存在静态区,但String对象会保留地址在堆里,指向String对象,所以s2= =s3(false)
2.equals
- equals在字符串中的比较是比较里面的数据(字符串特殊之处)
(代码承上)s2和s3里面的数是相等的
System.out.println(s2.equals(s3));//true
- 在自己所创建的类中,使用equals和==比较的都是引用
public static void main(String[] args) {
Student s1=new Student(1,"lina");//前面已经有Student的构造方法
Student s2=new Student(1,"lina");
System.out.println(s1==s2);//false
因为new出来的都放在堆里,堆里会申请内存区域
栈里有s1和s2指向堆中存放的区域
s1==s2比较内存地址,输出为false
(当使用equals方法的时候,每一个类都继承至object,equals是object的方法,所以可直接使用)
System.out.println(s1.equals(s2));//false
其实equals比较的还是引用,输出为false
那么什么时候为true呢?以下为例
public static void main(String[] args) {
Student s1=new Student(1,"lina");//前面已经有Student的构造方法
Student s2=new Student(1,"lina");
Student s3=s2;//!s3和s2指向同一个内存区域
System.out.println(s3==s2);//true
System.out.println(s3.equals(s2));//true
}
3.重写equals方法
通过==做引用类型的比较,equals方法在字符串类型的比较是比较数值。如果想要比较自己所创建的类,用equals方法比较里面数据的方法时,考虑重写equals方法。
public boolean equals(Student s){
if(this.age==s.age&&this.name==s.name){
return true;
}else {
return false;
}
}
public static void main(String[] args) {
Student s1=new Student(1,"lina");//前面已经有Student的构造方法
Student s2=new Student(1,"lina");
System.out.println(s1.equals(s2));//true
}
学习来源:【bilbili:siki学院】
来源:CSDN
作者:nanali_lili
链接:https://blog.csdn.net/linanali0606/article/details/104615553