java中的equals()与“==”

简述

接触java已经有四年多的时间,最近开始想写一些总结,来记录这几年的学习历程。不扯太多,直接开干。

“equals()”与“==”的比较

简单来说,==指的是是否是同一个东西,equals指的是这两个东西是否一样。
用java来说,==指引用是否相同,用来判断两个变量/实例是不是指向同一个内存地址;
equals用来判断这两个变量/实例指向的地址空间里的值是否相同。


基本数据类型的比较只能用==


学习java的都知道java的基本数据类型有八种分别是 byte, short, char, int, long, float, double, boolean。

它们之间的比较都是用==来比较他们的值是否相等。并且对于基本类型而言,它们没有 equals() 方法,

equals方法只会出现在他们的引用类型(包装类型)中。

        int a=10;
        int b=20;
        int c=10;
        System.out.println("a和b是否相同:" + (a==b));
        System.out.println("a和c是否相同:" + (a==c));

输出:

a和b是否相同:false
a和c是否相同:true


比较对象是引用型变量


==:比较两个引用是不是指向同一个对象实例(同一个地址)。

equals:所有的对象都是继承自Object,Object有一个方法叫做equals()方法;查看这个方法会发现他是直接用==比较;
   
public boolean equals(Object obj) {
        return (this == obj);
    }

所以如果这个时候你自定义了一个类,仅仅继承自Object且没有重写equals方法,那么其equals操作也是与Object类一样,仅仅是直接调用==操作。这个时候他俩没啥区别。如果你需要他俩不一样就需要重写 equal()方法;比如String

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

        String s1="12345";
        String s2="12345";
        String s3=new String("12345");
        String s4=new String("12345");
        System.out.println("s1与s2是否==:" + (s1==s2));
        System.out.println("s1与s2是否equals:" + s1.equals(s2));
        System.out.println("s1与s3是否==:" + (s1==s3));
        System.out.println("s1与s3是否equals:" + s1.equals(s3));
        System.out.println("s4与s3是否==:" + (s4==s3));
        System.out.println("s4与s3是否equals:" + s4.equals(s3));

输出:
s1与s2是否==:true  
s1与s2是否equals:true  
s1与s3是否==:false
s1与s3是否equals:true
s4与s3是否==:false
s4与s3是否equals:true

特别说明 s1与s2是否==:true  
程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "12345" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1 将s2引用s1所引用的对象"12345" ,在后面的程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"12345"Sting对象被创建在内存中。他们的值相同,但是位置不同了.



猜你喜欢

转载自blog.csdn.net/luosanpao2016/article/details/79218449