zoukankan      html  css  js  c++  java
  • equals和==的区别 你真的掌握了吗?

    PS:最近读Java编程思想的时候发现了一些小问题.就是equals方法和==,感觉自己是真正掌握了,其实并没有.简单的记录一下.

    学习内容:

    1.equals 和 == 的区别

     equals和==想必大家都很熟悉,但是是否真正的掌握了呢?还真就不好说.这个东西没有什么过多好讲的.我们通过例子来分析一下问题.

    1. 基本数据类型

     先来个简单的.基本数据类型的比较.

    package com.equal.test;
    
    public class Equal {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int i=3;
            int i1=3;
            System.out.println(i==i1);
        }
    }
    true.

     这个相对而言就非常的简单,打印台打印出来的一定是true.并且这一类的数据都只有 == 方法去比较值.而没有equals方法..没什么好说的.

    2. Integer类型数据.

    package com.equal.test;
    
    public class Equal {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    Integer i2
    = new Integer(3); Integer i3 = new Integer(3); System.out.println((i2==i3)+" "+i2.equals(i3)); } }
    false true

     这样的比较大家还是明白的,使用new方法之后生成的两个对象,即使我们赋给两个对象的值是相同的,但是不一样的是我们创建了两个对象.也就是说i2和i3拿到的是两个不同对象的引用.因此在使用==方法的时候,那么会输出false,因为==比较的是两个对象之间的引用.说白了也就是比较二者的内存地址,那么很明显,二者的内存地址肯定是不相同的.所以 == 会输出false 而equals方法会输出true.

      public boolean equals(Object obj) {
            if (obj instanceof Integer) {
                return value == ((Integer)obj).intValue();
            }
            return false;
        }

     Integer中equals方法还是非常的简单的.判断当前的对象是否为Integer对象.如果是,那么只需要比较具体的数值,如果不是,那么就会返回false.

     那么搞明白了上面这块,我们看一下这个情况.

    package com.equal.test;
    
    public class Equal {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Integer i = 3;
            Integer i1 = 3;
            System.out.println((i==i1)+" "+i.equals(i1));
            
            int i4 =3;
            System.out.println((i==i4)+" "+i.equals(i4));
        }
    }
    true true
    true true

     这次我们是直接使用Integer定义了两个Integer变量,但是 == 和equals方法输出的都是true.equals方法可能很容易理解.输出为true也是必然的但是 == 也输出了true.这是因为我们虽然定义了两个Integer变量,但是我们把一个常量值赋给了两个变量.那么二者拿到的是同一个对象的引用.也就是说内存地址是相同的.因此 == 方法输出为true.

     第二个相对而言就非常简单了.虽然i4只是一个int类型的变量,但是在使用equals方法的时候被装箱成Integer,因此可以使用equals方法比较, ==就是先把i进行拆箱,拆成int类型的数据,然后进行比较.相对而言还是非常简单的.

    3.String类型数据.

    package com.equal.test;
    
    public class Equal {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String s = "3";
            String s1 = "3";
            System.out.println((s==s1)+" "+s.equals(s1));
            
            String s2 = new String("3");
            String s3 = new String("3");
            System.out.println((s2==s3)+" "+s2.equals(s3));
        }
    }
    true true
    false true

      String类型其实和Integer基本都是相似的,原理是一样的.但是如果我们这样就觉得我们真正掌握了的话,那么来看一下下面的代码.

     我们定义了一个test类.

    package com.map.test;
    
    public class test {
    
        protected int number;
        
        public test(int n) {
            // TODO Auto-generated constructor stub
            this.number = n;
        }
    }

     然后我们的测试代码如下.

    public static void main(String[] args) {
            
            test t = new test(3);
            test t1 = new test(3);
            System.out.println(t.equals(t1)+" "+(t==t1));
    }
    false false

    这里输出的全部都为false,这是为什么呢?都是对象类型,这是什么原因呢?这是因为,我们的test方法里没有重写equals方法.也就导致了,默认去使用了Object的equals方法.

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

     这是Object的equals的源码.我们不难发现,比较的是两个对象是否相同,这毋庸置疑,两个test对象一定是不同的,两个对象的两个引用,内存地址自然是不一样的.这就使得equals方法和==方法是没有区别的。因此我们如果想让equals方法输出true.那么我们必须重写equals方法.

     

     

  • 相关阅读:
    利用表格分页显示数据的js组件datatable的使用
    css和javascript代码写在页面中的位置说明
    jqueryui组件progressbar进度条和日期组件datepickers的简单使用
    漏洞扫描工具Nessu的安装和简单使用
    jqueryui插件slider的简单使用
    html常用标签表单和表格等及css的简单入门
    通过flask实现web页面简单的增删改查bootstrap美化版
    jquery简单使用入门
    bootstrap简单使用布局、栅格系统、modal标签页等常用组件入门
    Centos7.3_x86_64通过systemctl控制tomcat8.0.46启动和停止
  • 原文地址:https://www.cnblogs.com/RGogoing/p/5338238.html
Copyright © 2011-2022 走看看