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