基于Java字符串 "==" 与 "equals" 的深入理解

2016-02-19 09:25 12 1 收藏

下面图老师小编要跟大家分享基于Java字符串 "==" 与 "equals" 的深入理解,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - 编程语言 】

虽然关于Java字符串“==”和“equals”的问题是Java学习中的最基础的一个问题,但是仍然有不少刚刚学习Java的同学搞不清楚里面的原理,最近和朋友讨论到这个问题,所以写篇文章给大家分享一下我自己的理解。
首先让我们看一个例子:
代码如下:

    public class TestStringEquals { 

        public static void main(String[] args) { 

            String a = "test"; 
            String b = "test"; 
            String c = new String("test"); 
            String d = new String("test"); 
            String e = a; 
            String f = new String(a); 
            String g = a + ""; 
            System.out.println(a == b ? "expression "a==b" is true" 
                    : "expression "a==b" is false"); 
            System.out.println(a == c ? "expression "a==c" is true" 
                    : "expression "a==c" is false"); 
            System.out.println(c == d ? "expression "c==d" is true" 
                    : "expression "c==d" is false"); 
            System.out.println(a == e ? "expression "a==e" is true" 
                    : "expression "a==e" is false"); 
            System.out.println(a == f ? "expression "a==f" is true" 
                    : "expression "a==f" is false"); 
            System.out.println(a == g ? "expression "a==g" is true" 
                    : "expression "a==g" is false"); 
            if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e) 
                    && e.equals(f) && f.equals(g)) { 
                System.out 
                        .println("a equals b equals c equals d equals e equals f equals g"); 
            } 
        } 

    } 

如果先不答案,大家试着去做一做,能否保证全部正确呢?
下面公布一下答案:
代码如下:

    expression "a==b" is true 
    expression "a==c" is false 
    expression "c==d" is false 
    expression "a==e" is true 
    expression "a==f" is false 
    expression "a==g" is false 
    div style="text-align: left;"/diva equals b equals c equals d equals e equals f equals g 

要很好的理解这种题目,最好的办法就是深入理解Java中String的“==”方法和“equals”方法的机制和原理。“equals”想必大家都知道,就是比较字符串的内容,由于以上程序中的所有字符串内容都是“test”,所以用equals比较它们都会相等。

但是你是否知道Java中基类Obejct的equals方法跟“==”方法其实是一致的呢?只不过是String类继承Object类(Java中所有的类都是继承Object类的)后,重载了equal的方法,使得其成为了比较字符串中的内容。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

很好的理解了equals之后,现在让我们来研究一下“==”方法的扑朔迷离。
“==”是Java中的运算符,它比较的内容是两个对象的指针,也就是实际对象的地址。因此很容易理解e==a是返回true的。
我们再来看下c和d之间的比较,看到new关键词,说明c和d都是重新申请了一块内存地址,然后里面赋值为“test”,所以c==d返回的是false。同理都可以理解
a,c,d,f之间的“==”操作都返回的是false。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

然后再来看看g= a + “”,虽然没有看到new关键词,但是由于String类“+”操作符被重载之后,重载的方法之中一定会重新new一个String,所以也就变成了上面的情况。那么最难理解的就是a和b的比较了,其实这是Java编译器的优化所带来的结果,java编译器有一个叫字符串常量池的存储区域,由于String a = "test"这条语句编译之后,“test”就会存储在这个字符串常量池中,那么再定义b的时候,b仍然指向这块区域,所以说a和b指向的仍然是同一块区域。所以a==b返回的true。

来源:https://www.tulaoshi.com/n/20160219/1590704.html

延伸阅读
标签: Web开发
在网上找到一个用ASP开的假线程,发现和我以前做的一个程序不谋而合,只不过以前用的是VB,摘下来,储备. 1.原理实验 原理当然都一样,利用web服务器支持多线程,在同一页面里向服务器发多个http请求来完成我们的工作。还是先实验一下,在一个页面里同时写2个txt文件,比较写入时间的差异。代码如下: % startime=timer() ''----------asp实现多...
标签: Web开发
A common UI is to have a table of data rows, which when clicked on expand to show a detailed breakdown of "child" rows below the "parent" row. The only requirements ar...
标签: 养生 健康
茶是中国老百姓非常喜爱的一种饮品,有的人甚至是一年四季以茶代水,茶不离口,甚至用茶来治病。专家提醒:茶水虽好,但冬季喝茶还有很多讲究。据专家介绍:冬天人的机体生理活动处于抑制状态,对于冬天的人们来说,养生之道在于御寒保暖,尤其是老年人到了冬季,抵抗力下降,手脚容易出现冰凉的现象,如果此时再喝上一杯绿茶,那只会更加重寒气...
输卵管不孕的病因 输卵管是女性生殖系统的主要组成部分之一,具有输送精子、卵子和受精卵以及提供精子贮存、获能、顶体反应和受精场所等生理功能。输卵管在解剖上分伞部、壶腹部、峡部和间质部,输卵管任何部位阻塞都可能引起输卵管功能障碍而导不孕。目前,输卵管性不孕是女性不孕症的重要原因,约占1/3以上。...
标签: Web开发
// blueDestiny, never-online // blueDestiny [at] 126.com 通常,我们在动态给定一个container的innerHTML时,通常是样做的: div id="divc" / SCRIPT LANGUAGE="JavaScript" var div = document.getElementById("divc"); var html = "" html +=&nbs...

经验教程

701

收藏

77
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部