java中==和equals区别

时间:2022-03-04 16:09:46

主要是使用String时候的区别!

一、java当中的数据类型和“==”的含义

基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。 复合数据类型(类):当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。 注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。

二、equals()方法介绍

JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被复写了,如String、Integer、Date。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。  所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来

三、代码展示

public class Test1 {
     /*        ==:比较的是两个字符串内存地址的数值是否相等,属于数值比较;
            equals():比较的是两个字符串的内容,属于内容比较。
            以后进行字符串相等判断的时候都使用equals()。*/
    public static void main(String[] args) {
        String a="aaaa";
        String b="aaaa";
        System.out.println(a==b);//true    
        System.out.println(a.equals(b));//true
        System.out.println("-------------------------------------");
        
        
        Integer c=66;
        Integer d=66;
        System.out.println(c==d);//true    
        System.out.println(c.equals(d));//    true
        System.out.println("-------------------------------------");
        
        String a1=new String("aaa");
        String b1=new String("aaa");
        System.out.println(a1==b1);//false
        System.out.println(a1.equals(b1));//true    
        System.out.println("-------------------------------------");
        
        String a2="aaa";
        String b2=new String("aaa");
        System.out.println(a2==b2);//false
        System.out.println(a2.equals(b2));//true
        System.out.println("-------------------------------------");


        /*java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",
        表面上看起来好像这个方法没什么用处。
        但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,
        如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。*/


        String a3="aaa";
        String b3=new String("aaa");
        b3=b3.intern();
        System.out.println(a3==b3);//true
        System.out.println(a3.equals(b3));//true
        System.out.println("-------------------------------------");
    }

}

补充:

1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。