string 相等 java_java中string相等问题(==与.equal的具体区别。求详细解释)
展開全部
這要和String的JVM內(nèi)部工作原理相結(jié)合!
比如:String?s1="accp"
Java內(nèi)部將此62616964757a686964616fe58685e5aeb931333431366361語句轉(zhuǎn)化為以下幾個(gè)步驟:
(1)先定義一個(gè)名為s1的對(duì)String類的對(duì)象引用變量放到棧中:String?s1;
(2)在常量池(字符串常量池)中查找有沒有存放值為"accp"的地址,如果沒有,則開辟一塊存放字面值為"accp",并將這一塊內(nèi)存的指向地址放到棧中s1的變量中。如果已經(jīng)有了值為"accp"的地址,則直接返回這個(gè)地址給棧中s1變量。所以如果常量池中已經(jīng)有的值,直接返回地址就好。
String?s1?=?"accp"; 其字符串值是保存了一個(gè)指向常量池中值的引用!
所以s1?和s2的引用地址是相同的,所s1==s2為true
------------------------------------------------------------------------------
而Strings3=newString(s1);
(1)先定義一個(gè)名為s3的對(duì)String類的對(duì)象引用變量放到棧中:String?s3;
(2)在堆中創(chuàng)建一個(gè)String類型的對(duì)象,這個(gè)對(duì)象的值,也就是s1的字面值為“accp”。會(huì)按照上面的第2的操作到常量池中獲取,并返回一個(gè)常量池的引用給堆中的這個(gè)對(duì)象。
(3) 將堆中創(chuàng)建對(duì)象的地址返回給棧中變量s3。
所以?Strings3=newString(s1); 是一個(gè)指向堆中對(duì)象的引用地址。那么 s1 == s3 為false
下面給一個(gè)圖更好理解吧:
對(duì)象引用大概圖示
==是比較對(duì)象的引用地址,如果要比較對(duì)象的值的話用equal吧!
----------擴(kuò)展-------------------------------------------------------------------
String有一個(gè)方法intern(),返回的是這個(gè)String對(duì)象的常量池引用對(duì)象。
如果用
String s4 = s3.intern();
String s5= new String(s1).intern();
則 s1 == s4 和 s1 == s5 都為true
--------備注------------------------------------------------------------------------
這個(gè)問題以前的答案由于本人的經(jīng)驗(yàn)和能力的不足,導(dǎo)致回答有很多錯(cuò)誤的地方,在此表示非常抱歉。
總結(jié)
以上是生活随笔為你收集整理的string 相等 java_java中string相等问题(==与.equal的具体区别。求详细解释)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gho镜像 u盘安装系统怎么安装 用U盘
- 下一篇: 联想小新air14怎么进u盘启动 如何在