在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 關(guān)于java中的String對象的問題

關(guān)于java中的String對象的問題

為什么下面的程序打印false?
書上說java在內(nèi)容相同的String對象 會使用同一個實例
那為什么引用不相等?

public class test {
    public static void main(String[] args) {
        String s1="123";
        String s2=s1;
        String s3=new String("123");
        System.out.println(s3==s2);
        
    }

}
回答
編輯回答
厭遇

jvm中有常量池。所有創(chuàng)建的字符串常量都在里面存儲。如果常量池里沒有常量才會在新建常量。
new string()是用一塊內(nèi)存區(qū)域新建對象。不管常量池中是否有該常量。
兩個值雖然一樣,但是地址不一樣。所以為false;

你可以去百度下String s3=new String("123");創(chuàng)建了幾個對象。面試常問

2017年6月15日 05:07
編輯回答
哎呦喂

s3是new 的,會產(chǎn)生對象,s3指向的是一個NEW的引用對象地址

2018年6月10日 16:30
編輯回答
局外人

先說為什么應(yīng)用不等。
String s1 = "123";// 是開辟內(nèi)存,創(chuàng)建了新的對象,假設(shè)存放在內(nèi)存中的a區(qū)域,變量s是對a內(nèi)存的引用
String s2 = s1; // s2的引用也指向a內(nèi)存
String s3 = new String("123");// 重新申請一段內(nèi)存,假設(shè)存放在b區(qū)域
s3==s2 是判斷兩個變量是否指向同一塊內(nèi)存。很顯然不是,所以打印false

“書上說java在內(nèi)容相同的String對象 會使用同一個實例”是在String s1 = "123";String s2 = "123";的情況,s2和s1才指向相同的內(nèi)存區(qū)域。

2017年5月5日 15:06
編輯回答
浪婳

明確一點,只要new關(guān)鍵字,就是新建一個對象,

內(nèi)容相同的String對象 會使用同一個實例

這句話可以理解為這種情況下同一引用(如下代碼),這使用了常量池技術(shù),將字面值量提前準備好,然后當時用字面量賦值時,直接進行使用。

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);  // true
2018年6月22日 02:17
編輯回答
祉小皓

樓主可以看看這個文章:
Java 字符串(Part 2)相關(guān)面試題

這個文章看完之后你就會明白了

2017年10月10日 16:23
編輯回答
互擼娃

要想指向同一內(nèi)存區(qū)域,請使用intern方法

public class test {
    public static void main(String[] args) {
        String s1="123";
        String s2=s1;
        String s3=new String("123");
        System.out.println(s3==s2);
        System.out.println(s2==s3.intern());
        
    }

}

會輸出:

false
true

Java會確保一個字符串常量只有一個拷貝,當使用new Sting()構(gòu)建時,總會產(chǎn)生新的對象, 不是常量。
常量與變量的區(qū)別在于是否在編譯期可以確定值。存在于.class文件中的常量池,在運行期被JVM裝載,并且可以擴充。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調(diào)用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等于str的字符串并返回它的引用。

可以參考一下這個鏈接

http://www.runoob.com/java/ja...

2017年8月17日 10:21