java细节篇(==和equals的区别)

1)当==两边是对象时(String,Integer...),两边比的都是地址
2)当==两边是基本类型时(int,float),两边比的都是值
3)默认equals比的是对象的地址,但是重写的话可以改变成比较值,String和Integer的equals就是重写过的

废话少说,Run!!!

package test;

public class Test {

    public static void main(String[] args) {

        System.out.println("###############对象时比的都是地址################");
        TestObj t = new TestObj();
        TestObj t2 = new TestObj();
        System.out.println(t==t2);//false
        System.out.println(t.equals(t2));//false

        System.out.println("############基本类型[==]比的是值###########");
        int a=1;
        float b=1f;
        System.out.println(a==b);//true
        //  System.out.println(a.equals(b)); 写法错误

        System.out.println("##########Integer特殊(equals重写成比较值,但new时==还是比较地址)##########");
        Integer i1=0;
        Integer i2=0;
        System.out.println(i1==i2);//true
        System.out.println(i1.equals(i2));//true
        Integer i3 = new Integer(0);
        Integer i4 = new Integer(0);
        System.out.println(i3==i4);//false
        System.out.println(i3.equals(i4));//true
        System.out.println(i1==i3);//false
        System.out.println(i1.equals(i3));//true
        System.out.println(i4.equals(i2));//true
        int i5 = 0;
        System.out.println(i1.equals(i5));//true 和基本int类型比是比值
        System.out.println(i1==i5);//true 和基本int类型比也是比值
        System.out.println(i3.equals(i5));//true new的和基本int类型比是比值
        System.out.println(i3==i5);//true  new的和基本int类型比也是比值
        float f6 = 0f;//等同f6=0;
        System.out.println(i1.equals(f6));//false 注意结果不同说明equals的重写只是对int类型时是比值
        System.out.println(i1==f6);//true
        System.out.println(i3.equals(f6));//false 注意结果不同说明equals的重写只是对int类型时是比值
        System.out.println(i3==f6);//true  

        System.out.println("=======String特殊=======");
        String s1="a";
        String s2="a";
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
        String s3 = new String("a");
        String s4 = new String("a");
        System.out.println(s3==s4);
        System.out.println(s3.equals(s4));
        System.out.println(s1==s3);
        System.out.println(s1.equals(s3));
        System.out.println(s4.equals(s2));

    }

}

对于Integer为什么只会对int作值的比较,查看源代码可见:

/**
     * Compares this object to the specified object.  The result is
     * {@code true} if and only if the argument is not
     * {@code null} and is an {@code Integer} object that
     * contains the same {@code int} value as this object.
     *
     * @param   obj   the object to compare with.
     * @return  {@code true} if the objects are the same;
     *          {@code false} otherwise.
     */
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
时间: 2024-10-15 19:30:34

java细节篇(==和equals的区别)的相关文章

Java杂谈之String----"=="与equals的区别

在程序代码的编写中,经常涉及到两个字符串的比较 这个时候一般困惑我们的是"=="和equals方法的取舍问题,实际上,只要明白了这两者 比较的区别,我们就能够正确的选择出到底采用哪种方式进行字符串的比较了 首先我们定义两个字符串 String s1 = "hello"; String s2 = new String("hello"); 这两个都建立了"hello"的字符串,但到底有什么不同呢 注意,Java中没有指针的概念,这

java中的==和equals的区别

关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指正,谢谢. 在JAVA程序中一般的基本类型(值类型int,double,boolean等)都只能通过 = = 来判断值是否相等. 如:System.out.println(1==1);System.out.println(true==true);√ 不能写成System.out.println(1.

java中,==跟equals的区别

在java中,经常有一些刚入行的新手分不清==跟equals的区别.==操作符是专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或者两个变量是否相等,只能用==操作符.如果一个变量指向的数据是对象类型,这时候就涉及了两块内存,对象本身占用已快内存,变量本身也占用一块内存,例如:Object obj = new Object();中,变量obj是一个内存,new Object();是另一个内存.此时,变量obj所对应的内存中存储的数值

java String的“==”和equals的区别 (第一篇博客)

==和equals都是有比较是否相等的作用,但是它们二者有什么区别呢? 废话不多说,直接戳重点 ==比较的是地址,equals比较的是内容 但是要注意的是,在java虚拟机中含有字符串池(直接量在此池内),相同内容的字符串直接量对应为相同的对象...说得是不是有点抽象,举例来说明一下吧 String s1="hello"; String s2=new String ("hello"); s1=="hello";//true ,因为都指向直接量&q

java中hashcode和equals的区别和联系

HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.HashMap中相同键的呢?当存储了“相同的东西”之后Java运行时环境又将如何来维护呢? 在研究这个问题之前,首先说明一下JDK对equals(Object obj)和hashcode()这两个方法的定义和规范: 在Java中任何一个对象都具备equals(Object obj)和hashcode()

Java 面试题 == 和 equals 的区别

int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象:而int则是直接存储数据值 4.Integer的默认值是null,int的默认值是0 延伸: 关于Integer和int的比较 1.由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变

Java中的==和equals的区别详解

1.基础知识 (1)String x = "hello"; (2)String x = new String ("hello"); 第1种方式的工作机制是,首先看内存中有没有存放值为"hello"的地址,如果有则将x指向这块内存地址:如果没有则在内存中重新开辟一块地址存放值"hello",并将x指向这块内存地址. String x = "hello"; String y = "hello"

Java基础(basis)-----==和equals()的区别

1. equals方法 只能处理引用类型变量,比较两个对象是否相等.会比较两个引用变量的地址值是否相等,如果属于String类,还会比较值是否相同 package com.practice; public class Practice { public static void main(String[] args) { String s1 = new String("AA"); String s2 = new String("AA"); String s3 = &q

Java提高篇(三六)-----java集合细节(二):asList的缺陷

在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷: 一.避免使用基本数据类型数组转换为列表 使用8个基本类型数组转换为列表时会存在一个比较有味的缺陷.先看如下程序: public static void main(String[] args) { int[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); System.out.println("list'size:&