Java学习记录|字符串的比较

送分小仙女□ 提交于 2020-03-03 02:42:22

一般情况下:
基本类型使用==做比较
引用类型使用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学院】

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!