Java中 == 和 equals()详解

java中的数据类型分为两种:

一 、基本数据类型:

  byte、short、int、long、float、double、char、boolean

  比较它们需要用  ==  ,比较的是它们的值是否相等

二、引用数据类型:

  也就是对基本数据类型的封装,用 == 比较的是它们的内存地址(其实还是比较的基本数据类型,它们的内存地址不就是int吗)。当new的时候,会给它一个新的内存地址,所以再通过==比较,就会返回false;在Object类中的equals方法其实比较的也是内存地址,用==和equals方法比较结果是一样的,但在一些类中把equals方法重写了,如String、Integer等类中,而不是单纯的比较内存地址了。

  这个equals方法不是固定的,有需要的时候,我们根据情况自己重写。

下面用简单的代码来测试一下吧,里面的注释要注意看哦!其中的java源码在文章末尾有截图

public class Text{
    public static void main(String[] args){
        String str = "abcd";
        String str1 = "abcd1";
        int i = 1;
        String str2 = new String("abcd");

        //比较的是内存地址,内存地址是什么?一个16进制的整形值
        //java对象内存地址经过哈希算法得出一个int类型数字
        System.out.println( "abcd1" == str1 );

        //用的是String的equals方法,对字符串进行挨个比较
        System.out.println( str.equals("abcd") );

        //在javac的时候,虚拟机把字符串自动组合了???
        System.out.println( str.equals(‘a‘+"bcd") );

        //比较的是内存的地址,str2创建的时候,用了一个关键字new,明确告诉虚拟机,我要一个新的,所以字符串"abcd"被当做一个新的创建,并且有一个新的内存地址
        if (str == str2) {
            System.out.println( "str == str2" );
        }else{
            System.out.println( "str != str2" );

            //调用的String里面的hashCode方法(文章末尾有java源码),所以相等.那String中的hashCode方法算的是什么呢?难道是ASCII?
            ////确实是ASCII码,      作者自己算过,
            //
            //有些地方我们需要重写hashCode方法,什么地方?
            //最常见的是当一个对象被加入收集对象(collection object)时,这两个函数必须自己设计。更细化的定义是:如果你想将一个对象A放入另一个收集对象B里,       //或者使用这个对象A为查找一个元对象在收集对 象B里位置的钥匙,并支持是否容纳,删除收集对象B里的元对象这样的操作,那么,equals()和hashCode()函数必须开发者自己定义。       //其他情况下,这两个函数是不需要定义的。
            System.out.println(  str.hashCode() );
            System.out.println(  str2.hashCode() );

        }

        //调用String的equals    java.lang.String中964行equals方法
        //字符串底层是字符数组,所以String中的equals方法用两个char数组,对立面的字符一个一个的比较
        //
        //对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间:
        //对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
        //反射性:x.equals(x)必须返回是“true”。
        //类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
        //还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
        //任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
        //
        //有些情况下,我们需要自己重写equals()方法,根据情况而定
        if (str.equals(str2)) {
            System.out.println( "str equals str2" );
        }else{
            System.out.println( "str is not equals str2" );
        }

    }
}

运行结果:

总结:

    == :    比较的是基本数据类型,比较的是它们的值

   equals():   比较的是引用数据类型,比较的是引用数据类型,不同类型有不同的equals方法,根据不同的数据类型调用不同的equals方法。也可以在特殊情况下重写equals方法。

Object中的equals():

String中的equals():

String中的hashCode():

时间: 2024-11-05 22:44:28

Java中 == 和 equals()详解的相关文章

Java中的HashTable详解

Hashtables提供了一个很有用的方法可以使应用程序的性能达到最佳. Hashtables(哈 希表)在计算机领域中已不 是一个新概念了.它们是用来加快计算机的处理速度的,用当今的标准来处理,速度非常慢,而它们可以让你在查询许多数据条目时,很快地找到一个特殊的条目. 尽管现代的机器速度已快了几千倍,但是为了得到应用程序的最佳性能,hashtables仍然是个很有用的方法. 设想一下,你有一个 包含约一千条记录的数据文件??比如一个小企业的客户记录还有一个程序,它把记录读到内存中进行处理.每个

java中static作用详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类

Java中反射机制详解

序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射,所以回过头来把这个给重新补一下,自己欠下的债,迟早是要还的. ---WH 一.什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的

Java中的final详解以及用途实战

浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一

Java 中的泛型详解-Java编程思想

Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的对象的类型 class Holder1 { private Circle a; public Holder1(Circle a) { this.a = a; } Circle get() { return a; } } 上面的类的可重用性不怎么样,无法持有其他类型的任何对象,下面通过持有Object

Java中Unsafe类详解

http://www.cnblogs.com/mickole/articles/3757278.html Java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1.通过Unsafe类可以分配内存,可以释放内存: 类中提供的3个本地方法allocateMemory.reallocateMemory.freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应. public native long alloca

Java中Date类型详解

一.Date类型的初始化 1. Date(int year, int month, int date); 直接写入年份是得不到正确的结果的. 因为java中Date是从1900年开始算的,所以前面的第一个参数只要填入从1900年后过了多少年就是你想要得到的年份. 月需要减1,日可以直接插入. 这种方法用的比较少,常用的是第二种方法. 2. 这种方法是将一个符合特定格式,比如yyyy-MM-dd,的字符串转化成为Date类型的数据. 首先,定义一个Date类型的对象 Date date = nul

Java中Class对象详解

java中把生成Class对象和实例对象弄混了,更何况生成Class对象和生成 instance都有多种方式.所以只有弄清其中的原理,才可以深入理解.首先要生成Class对象,然后再生成Instance.那Class对象的生 成方式有哪些呢,以及其中是如何秘密生成的呢? Class对象的生成方式如下: 1.Class.forName("类名字符串")  (注意:类名字符串必须是全称,包名+类名) 2.类名.class 3.实例对象.getClass() 通过一段小程序,来观察一下Cla

java中的static详解

如果一个类成员被声明为static,它就能够在类的任何对象创建之前被访问,而不必引用任何对象.static 成员的最常见的例子是main( ) .因为在程序开始执行时必须调用main() ,所以它被声明为static. 声明为static的变量实质上就是全局变量.当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量,例如:声明一个static的变量count作为new一个类实例的计数.声明为static的方法有以下几条限制: 1.它们仅能调用其他的s