Java中equals与==和comparaTo的区别

一.先说说Java中equals和==的区别:

Java中的数据类型,可分为两类:

  1.基本数据类型(也叫原始数据类型)

    八大基本数据类型 char byte short int long double float boolean

  2.引用数据类型(也就复合数据类型)除了上面的8个,其他都是引用数据类型

区别:

  基本数据类型比较只能用==,不能用equals,因为用equals(参数),参数必须为对象。

他们之间的比较,比较的是他们的值。

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 1;
        System.out.println(a == b);
    }
}

  当引用类型用(==)进行比较的时候
  比较的是他们在内存中的存放地址,除非地址一样,否则比较后结果为false。

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new A();
        System.out.println(a1 == a2);// false
        A a3 = a1;
        System.out.println(a1 == a3);//true
    }
}

class A {

}

  Java当中所有的类都是继承于Object这个基类的,equals的方法在在Object中定义,这个方法的初始行为是比较对象的内存地址(如上面的例子),因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟用双等号(==)的结果相同。

Object里面的equals方法:

    public boolean equals(Object obj) {
        return (this == obj);
    }

  但是一些类中这个方法被重写了,如String,Integer,重写后的equals不再是比较对象在内存的存放地址了,而是比较的内容。

以String为例,equals方法代码为:

  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;
    }

举个例子:

public class Test {
    public static void main(String[] args) {

        Integer a = new Integer(1);
        Integer b = new Integer(1);
        System.out.println(a.equals(b));// true

        String s1 = new String("abc");
        String s2 = new String("abc");
        System.out.println(s1.equals(s2));// true
    }
}

  上面的例子仅仅是纯比较而言的,如果中间加入其它代码,还是可以改变的。

二.比较String中comparaTo和equals的区别

只有实现了Comparable的类才有comparaTo方法,String实现了Comparable接口的类,所以compareTo为String的方法。

public class Test {
public static void main(String[] args) {
  String s1 = new String("abc");
  String s2 = new String("abc");
  System.out.println(s1.equals(s2));// true
  System.out.println(s1.compareTo(s2));// 0

  String s3 = new String("abc");
  String s4 = new String("abca");
  String s5 = new String("abcde");
  String s6 = new String("abcd");

  System.out.println(s3.compareTo(s4));// -1
  System.out.println(s5.compareTo(s6));// 1

  System.out.println(s5.compareTo(s4));// 3
  System.out.println(s4.compareTo(s5));// -3
}
}

 区别: 

    通常compareTo用来比较大小的 而equals是比较是否相等的。

    同比之下,equals的效率高,因为compareTo是按字典顺序比较两个字符串。也就是按顺序比较字符串中各个字符的 Unicode值。

   compareTo时:

    当相同时:返回int 0;当小于时,如果此位为空,则返回-1,否则返回Unicode差值,当大于时,如果参数对应位为空,则为1,否则为差值。

时间: 2024-12-22 21:09:27

Java中equals与==和comparaTo的区别的相关文章

Java中equals、==和instanceof的区别

本文转自http://blog.csdn.net/t12x3456/article/details/7341515 (1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同. “==”比较两个变量本身的值,即两个对象在内存中的首地址. “equals()”比较字符串中所包含的内容是否相同. 比如: String s1,s2,s3 = "abc", s4 ="abc" ; s1 = new String("abc"

java中equals,hashcode和==的区别

1.== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.引用类型(类.接口.数组) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. 对象是放在堆中的,栈中存放的是对象的引用(地址).由此可见'=='是对栈中

Java中equals,hashcode,==的区别

==  :比较java栈局部变量表中变量的地址或值是否相等. equals : 比较变量的地址在java堆中引用对象是否为同一个对象. hashcode : 通过对象在JVM内存中的存储地址通过特定算法返回一个hash值,主要是配合HashSet HashMap进行增加.删除等. public native int hashCode(); 原文地址:https://www.cnblogs.com/JimKing/p/9536878.html

【转】Java中equals和==的区别

[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. JAVA当中所有的类都是继承于Object这个基类的,

java中equals和==的区别 (转)

java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同. equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同.  ==比较的是2个对象的地址,而equals比较的是2个对象的内容. 显然,当equals为true时,==不一定为true: 一.String中

关于java中equals与==的区别的小实验

java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的是二者是都为同一对象,是一种操作符. 做了几个小实验比较结果. 实验一: String str1="ab": String str2="ab": System.out.println(s1==s2)://trueSystem.out.println(str1.equals(str2));//true 这里的str1与str2都指向了常量池中的同一对象,所以S

Java中equals和hashcode的区别?

Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用于比较,尤其是在set集合中比较元素是否重复 equals方法返回true的两个对象,hashcode一定相同 hashcode相同的两个对象,equals方法不一定返回true 原文地址:https://www.cnblogs.com/qf123/p/8671141.html

java中的hashcode和euqals的区别和联系

一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象). 2 .要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等. 没有覆盖equals方法代码如下: [java] view plaincopy //学生类 public class S

java中Map,List与Set的区别

java中Map,List与Set的区别 目录(?)[+] Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 简单说下集合和数组的区别:(参考文章: