国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

JAVA中“相等性比較”的實(shí)現(xiàn)技巧

2019-09-10 07:22:44李小榮疏志年陳麗萍梁寶華

李小榮 疏志年 陳麗萍 梁寶華

摘要:本文主要研究JAVA語(yǔ)言中如何進(jìn)行基本類型和引用類型數(shù)據(jù)的“相等性比較”.通過(guò)介紹JAVA程序運(yùn)行時(shí)的內(nèi)存、運(yùn)算符==、方法equals知識(shí),解析String類中equals源碼,研究具體程序的運(yùn)行過(guò)程,闡明各類數(shù)據(jù)“相等性比較”的實(shí)現(xiàn)技巧.

關(guān)鍵詞:相等性比較;常量池;==;equals();方法重寫

中圖分類號(hào):TP312? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):1673-260X(2019)04-0053-02

1 引言

Java語(yǔ)言具有面向?qū)ο蟆⒖缙脚_(tái)、多線程等優(yōu)良特性,在歷年TIOBE世界編程語(yǔ)言排行中多居榜首,是世界上使用范圍最廣的編程語(yǔ)言之一[1].在Java編程過(guò)程中,有時(shí)需要對(duì)數(shù)據(jù)是否相等進(jìn)行比較.Java語(yǔ)言的數(shù)據(jù)類型分兩大類:基本類型、引用類型.基本類型的變量中存儲(chǔ)的是具體的數(shù)據(jù)值,變量比較大小時(shí)比較的是具體數(shù)據(jù)值;引用類型變量中存儲(chǔ)的是對(duì)象的引用,在根類Object類的toString()方法中聲明為:getClass().getName() + "@" + Integer.toHexString(hashCode()),各子孫類可以根據(jù)需要將其改寫.

2 知識(shí)介紹

2.1 Java程序運(yùn)行時(shí)的內(nèi)存

Java程序運(yùn)行時(shí),需要占用內(nèi)存空間,每一片區(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式[2].Java程序運(yùn)行時(shí)的內(nèi)存區(qū)域主要?jiǎng)澐譃椋簵^(qū)、堆區(qū)、靜態(tài)數(shù)據(jù)區(qū)、代碼區(qū)等5個(gè)區(qū)域,現(xiàn)主要介紹前三個(gè)區(qū)域.

(1)棧區(qū)(VM Stack):虛擬機(jī)棧中存放了一個(gè)個(gè)棧幀,當(dāng)程序執(zhí)行一個(gè)方法時(shí),就入創(chuàng)建一個(gè)棧幀并壓入棧中,一個(gè)棧幀中主要包括有局部變量表、操作數(shù)棧等,方法執(zhí)行完畢后,此棧幀從VM Stack中移除.

(2)堆區(qū)(Heap):存放所有new出來(lái)的東西,如對(duì)象實(shí)例、數(shù)組等.

(3)方法區(qū)(Method Area):用于存放被虛擬機(jī)加載的類信息、常量、靜態(tài)常量等,運(yùn)行時(shí)常量池也在方法區(qū)中.常量池中所有相同的常量被合并,只占用一個(gè)空間.

(4)本地方法棧(Native Method Stack).

(5)程序計(jì)數(shù)器(Program Counter Register).

2.2 Java中如何比較數(shù)據(jù)是否相等

方法一:使用操作符“==”,比較兩個(gè)操作數(shù)在棧區(qū)的值是否相等.若為基本類型數(shù)據(jù),比較的是具體的數(shù)據(jù)值是否相等[3];若為引用類型數(shù)據(jù),比較的是兩個(gè)對(duì)象的引用值,當(dāng)且僅當(dāng)兩個(gè)對(duì)象的引用值相同時(shí),即是指向堆區(qū)或方法區(qū)的同一個(gè)對(duì)象實(shí)體時(shí),結(jié)果為true.

方法二:使用equals()方法[4].根結(jié)點(diǎn)類Object類的equals(Object obj)方法體為:return (this == obj); 各子孫類可以根據(jù)需要修改.

2.3 方法重寫

日常生活中,我們比較兩個(gè)對(duì)象是否相同,主要比較的是兩個(gè)對(duì)象的主要屬性值是否相同.比如說(shuō)我們的書丟失了,需要買一本一樣的書,意思是買一本ISBN相同的書即可,也就是說(shuō)出版社、作者名、書名、版次、價(jià)格等信息相同即可,不是非得就是原來(lái)的那本書.

具體類可以制定相應(yīng)的規(guī)則用于比較兩個(gè)此類對(duì)象是否相等,一般來(lái)講,這種規(guī)則的制定通過(guò)重寫父類中的equals方法來(lái)實(shí)現(xiàn).在此,我們來(lái)研究String對(duì)象的比較規(guī)則.

2.4 String類源碼解析

解析:每一個(gè)String對(duì)象內(nèi)部都有一個(gè)重要的成員變量:char類型的數(shù)組value[],用于存放字符串對(duì)象所對(duì)應(yīng)的字符序列.

解析:String對(duì)象的equals方法,在兩種情況下方法返回值為true:1、當(dāng)前對(duì)象與形參對(duì)象的引用值相同,即指向同一對(duì)象實(shí)例時(shí),返回值為true.2、當(dāng)形參為字符串對(duì)象,且當(dāng)前對(duì)象與形參對(duì)象的成員變量value數(shù)組的長(zhǎng)度相同,則依次比較兩個(gè)value數(shù)組中每一個(gè)數(shù)組元素的值,若所有字符數(shù)組元素都相同,則返回值為true.在前面已知,字符串對(duì)象的value數(shù)組中存放的是字符串對(duì)象所對(duì)應(yīng)的字符序列.簡(jiǎn)而言之,若當(dāng)前字符串對(duì)象與形參字符串對(duì)象的字符序列相同,則返回為true.

3 程序舉例

執(zhí)行代碼3、4后,JVM在棧區(qū)開辟空間i1、i2、i3、s1、s2、s3、s4.

執(zhí)行代碼5、6、7后,棧區(qū)空間i1被賦值88、i2被賦值10000、i3被賦值88.

執(zhí)行代碼8,輸出“i1==i2”的比較結(jié)果,比較棧區(qū)i1與i2空間的整型常量值是否相等,不相等,故輸出為false.

執(zhí)行代碼9,輸出“i1==i3”的比較結(jié)果,比較棧區(qū)i1與i3空間的整型常量值是否相等,相等,故輸出為true.

執(zhí)行代碼10,JVM檢查常量池中是否已存在“巢湖學(xué)院”字符串常量,若已存在,則直接讓棧區(qū)s1指向常量池中的該對(duì)象,當(dāng)前程序中,常量池中現(xiàn)在沒(méi)有“巢湖學(xué)院”這個(gè)字符串常量,故在常量池中開辟一個(gè)新的空間存放此字符串常量,并讓棧區(qū)s1指向該對(duì)象.

執(zhí)行代碼11,JVM檢查常量池中是否已存在“巢湖學(xué)院”字符串常量,因已存在,所以直接讓棧區(qū)s2指向該對(duì)象.

執(zhí)行代碼12,JVM在堆區(qū)創(chuàng)建一個(gè)新的字符串對(duì)象,并讓棧區(qū)s3指向該對(duì)象.

執(zhí)行代碼13,JVM在堆區(qū)創(chuàng)建一個(gè)新的字符串對(duì)象,并讓棧區(qū)s4指向該對(duì)象.

執(zhí)行代碼14,JVM在比較棧區(qū)s1和s2的引用值是否相等,即是否指向同一個(gè)對(duì)象,因?yàn)閟1與s2均指向常量池的同一個(gè)“巢湖學(xué)院”字符串常量對(duì)象,故輸出為true.

執(zhí)行代碼15,JVM在比較棧區(qū)s1和s2所指向?qū)ο蟮膙alue數(shù)組元素是是否相同,即字符串對(duì)象的字符序列是否相同,是,故輸出為true.

執(zhí)行代碼16,JVM在比較棧區(qū)s3和s4的引用值是否相等,即是否指向同一個(gè)對(duì)象,因?yàn)閟3與s4分別指向堆區(qū)的兩個(gè)不同字符串對(duì)象,故輸出為false.

執(zhí)行代碼17,JVM在比較棧區(qū)s3和s4所指向的對(duì)象的value數(shù)組元素是否相同,即堆區(qū)兩個(gè)字符串對(duì)象的字符序列是否相同,是,故輸出為true.

4 結(jié)語(yǔ)

通過(guò)本文的源碼解析與程序執(zhí)行過(guò)程中的內(nèi)存分析,我們知道,在JAVA中實(shí)現(xiàn)“相等性比較”的技巧及相應(yīng)原理.運(yùn)用運(yùn)算符“==”比較時(shí),基本類型數(shù)據(jù)比較的是數(shù)據(jù)值[3,5],引用類型數(shù)據(jù)比較的是引用值;類可以通過(guò)重寫equals方法來(lái)制定本類對(duì)象是否相等的規(guī)則.

參考文獻(xiàn):

〔1〕李小榮,疏志年,陳麗萍,程軍.用軟件工程指導(dǎo)Java程序設(shè)計(jì)[J].福建電腦,2015,31(12):66+150.

〔2〕海子.JVM的內(nèi)存區(qū)域劃分[EB/OL].http://www.cnblogs.com/dolphin0520/p/3613043.html;2014 -05-29.

〔3〕黃海東.JAVA中實(shí)現(xiàn)“相等”比較的深入分析[J].湖北第二師范學(xué)院學(xué)報(bào),2015,32(02):31-35.

〔4〕錢宇虹.論Java對(duì)象的比較技巧[J].軟件工程師,2010(08):50-53.

〔5〕田春婷.Java對(duì)象的比較方式[J].電腦知識(shí)與技術(shù),2014,10(34):8163-8164.

田阳县| 台安县| 安阳市| 讷河市| 武清区| 阿拉尔市| 长岭县| 榆中县| 邵武市| 合作市| 永修县| 潮州市| 澜沧| 古交市| 合肥市| 若尔盖县| 顺义区| 陈巴尔虎旗| 桂林市| 大竹县| 奉节县| 博罗县| 青州市| 霞浦县| 正蓝旗| 正安县| 原阳县| 徐汇区| 松江区| 同仁县| 武冈市| 赞皇县| 金溪县| 馆陶县| 抚州市| 甘孜| 九龙坡区| 临朐县| 临清市| 衡山县| 台江县|