美文网首页程序员的日常Just Do ITJava
听说你不明白Java里"=="和"

听说你不明白Java里"=="和"

作者: 码道成功 | 来源:发表于2016-09-22 17:24 被阅读321次

    Java程序里用来测试两个变量是否相等有两种方式,那就是我们今天要深入讨论的“==”和“equals()”。相信我们的Java程序员对它都不陌生吧。去面试时也是频率很高的被面试官问到,当然了,为了打发面试官而去了解它们未免功利心太强了吧,毕竟我们在写代码时经常跟它们打交道的……废话不多说,让我们开始探索吧
    【欢迎各位大神批评指正,转载请保留链接……谢谢!我的CSDN博客

    一、“==”和“equals()”的区别

    1、“==”是关系运算符,“equals()”是Object类中定义的一个方法
    2、用途:

    “==”用于判断两个基本类型的值是否相等或两个引用变量(通过类定义的变量)的引用地址是否相等,换句话说,也就是两个引用变量是否指向同一个对象,类似C语言里的指针变量是否指向同一个地址。

    “equals()”用于判断引用变量所指向的内存地址的存储内容是否相等。

    二、实例代码分析

    public class TestEquals 
    {
        public static void main(String[] args)
        {
            int a = 3;
            int b = 3;
            //比较基础类型变量a和b的值是否相等,输出true
            System.out.println("a==b:"+(a == b));
            
            String s1 = new String("hello");
            String s2 = new String("hello");
            //比较引用变量s1和s2是否指向同一个对象,输出false
            System.out.println("s1==s2:"+(s1 == s2));
            //比较s1和s2的内容是否相等,输出true
            System.out.println("s1.equals(s2):"+s1.equals(s1));
            
            String s3 = "hello";
            String s4 = "hello";
            //输出true,指向常量池中同一个内存地址,即指向同一个对象
            System.out.println("s3==s4:"+(s3 == s4));
            //输出true
            System.out.println("s3.equals(s4):"+(s3.equals(s4)));
            
            String s5 = "hello";
            String s6 = new String("hello");
            //输出false
            System.out.println("s5==s6:"+(s5 == s6));
            //输出true
            System.out.println("s5.equals(s6):"+(s5.equals(s6)));
            
        }
    }
    

    输出结果如下:

    a==b:true
    s1==s2:false
    s1.equals(s2):true
    s3==s4:true
    s3.equals(s4):true
    s5==s6:false
    s5.equals(s6):true
    

    特别注意:Object类里的equals()方法是直接使用"=="实现的,所以在自定义类时建议重写equals()方法,实现自己所需要的比较规则,比如String等类都已经对equals()方法重写了!
    Object类中的equals()方法代码如下:

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

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

    对于初学者而言,当看到s3和s4的比较结果时可能就会迷惑了,此时我们就有必要来了解下JVM中“常量池”这个概念了……
    当我们使用“hello”这种形式来创建对象时,JVM就会用常量池来管理这些字符串,JVM保证常量池中的字符串内容是唯一的;而使用new String("hello")的形式的话,“hello”则会被存放在堆(Heap)里面,如下图所示:

    equals.png

    总结:“==”是用来比较两个变量的值是否相等,但由于引用类型变量是通过类似C语言里的指针形式来存储对象内容的,也就是说引用变量存储的是对象内容的地址,如上图中s2引用变量所示,所以在用“==”比较两个引用变量时比较的是两个引用变量是否指向同一个对象(即:堆内存的同一个地址);如果要比较两个字符串的内容是否相等时则只能用String类的equals()方法。##

    相关文章

      网友评论

      • 9482ec13b44f:二、实例代码分析 里的s1.equals(s1) 肯定是true啊 楼主是不是打错了?

      本文标题:听说你不明白Java里"=="和"

      本文链接:https://www.haomeiwen.com/subject/xobzettx.html