摘要:在以下表達式中得到的是兩個不同的信息我要創建一個字符串。否則,將此對象添加到池中,并且返回此對象的引用。的適用情況多個相同的大字符串同時出現的情況,例如可能出現多個相同消息的消息隊列的設計。
1 一個最簡單的程序:初學java有段時間了,但是昨晚忽然就被"asd"==getpara("password")搞得不開心了:確實JAVA很多東西和以前接觸過的語言完全不一樣,比如最簡單的new String("asd") !=new String ("asd")。
public class A { public static void main(String args[]) { String s1 = "Hello"; String s2 = "Hello"; System.out.println(s1 == s2); } }
肯定很多人說,輸出true,確實是輸出true,s1和s2引用的是同一個東西嘛。但是這個程序如果換一種寫法,那么肯定就不太一樣了。
2 第一種變體:public class A { public static void main(String args[]) { String s1 = "Hello"; String s2 = new String("Hello"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); } }
或者:
public class A { public static void main(String args[]) { String s1 = new String("Hello"); String s2 = new String("Hello"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); } }
那么結果就有點不太確定了,有些人很壞的想到了,多帶帶拿出來,肯定至少有一個不會相等。
這兩個程序的結果都是false true,原因很簡單,JAVA是一個基本完全面向對象的語言,s1 == s2 判斷的是他的引用(相當于內存地址、指針),equals則是使用這個對象自身的方法去判斷值是否相等。
在以下表達式中:
String s1 = "Hello"; String s2 = new String("Hello");
JVM得到的是兩個不同的信息:
1.我要創建一個“Hello”字符串。
2.我要創建一個新的“Hello”字符串,不要跟原來的一樣的。
于是,s1 != s2.
順序排列: public class A { public static void main(String args[]) { String s1 = new String("Hello"); String s2 = new String("Hello"); String s3 = "Hello"; s1=s1.intern(); s2=s2.intern(); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); System.out.println(s3 == s2); System.out.println(s3.equals(s2)); } }
打亂順序排列: public class A { public static void main(String args[]) { String s1 = new String("Hello"); String s3 = "Hello"; s1=s1.intern(); String s2 = new String("Hello"); s2=s2.intern(); //也可以String s2 = new String("Hello").intern(); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); System.out.println(s3 == s2); System.out.println(s3.equals(s2)); } }
那么這次應該很清楚了=
兩個object,但是中間加入了一些羞羞的東西,于是答案肯定是true true true true。
那么intern到底是什么。
當調用 intern 方法時,如果池已經包含一個等于此 String 對象的字符串(該對象由 equals(Object) 方法確定),則返回池中的字符串。
否則,將此 String 對象添加到池中,并且返回此 String 對象的引用。
intern的適用情況:多個相同的大字符串同時出現的情況,例如可能出現多個相同消息的消息隊列的設計。
結論:該學JVM虛擬機了,Scala Up!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64298.html
摘要:這兩個操作符都是編譯器默認引入了類,最后都調用方法返回對象,臨時對象被回收,因此效率極為低下 Java String類筆記 聲明 文章均為本人技術筆記,轉載請注明出處https://segmentfault.com/u/yzwall String的不可變性 String的不可變性 // String declaration public final class String ...
摘要: env: os:ubuntu 16.04 x64openjdk8u //java.lang.String package java.lang; import java.lang.StringDebugHelper; //... public final class String{ final char value[];//remove private public bool...
摘要:因此,對應地我們可以翻譯這段二進制字節碼為這樣的代碼注意,這段代碼并不能通過編譯,因為源碼這一層是不允許直接繼承的,這個繼承過程只允許在編譯器內部解語法糖的過程中被編譯器添加,添加之后的類才會有的訪問標識符。 語法糖(Syntactic Sugar)的出現是為了降低我們編寫某些代碼時陷入的重復或繁瑣,這使得我們使用語法糖后可以寫出簡明而優雅的代碼。在Java中不加工的語法糖代碼運行時可...
摘要:如感興趣,可移步手寫之基于動態創建對象手寫之基于注解動態創建對象今天將詳細介紹如何手寫依賴注入,在運行過程中如何動態地為對象的屬性賦值。完成后在中會有相關的包出現進行注入前需要創建工廠,在運行時從工廠中取出對象為屬性賦值。 前兩篇文章介紹了關于手寫Spring IOC控制反轉,由Spring工廠在運行過程中動態地創建對象的兩種方式。如感興趣,可移步: 手寫Spring之IOC基于xml...
摘要:上一篇博客介紹了如何基于配置文件在運行時創建實例對象,這篇博客將介紹基于注解方式怎樣實現對象的創建。方便測試,該類型分別創建兩個單例和多例的類型。注意這種為對象注入屬性值的方式耦合度較高,可根據情況使用。 上一篇博客介紹了如何基于xml配置文件在運行時創建實例對象,這篇博客將介紹基于注解方式怎樣實現對象的創建。 廢話不多說,直接上代碼。 首先還是創建項目,由于這次不需要使用第三方的AP...
閱讀 1307·2021-11-04 16:09
閱讀 3504·2021-10-19 11:45
閱讀 2400·2021-10-11 10:59
閱讀 1015·2021-09-23 11:21
閱讀 2766·2021-09-22 10:54
閱讀 1139·2019-08-30 15:53
閱讀 2607·2019-08-30 15:53
閱讀 3481·2019-08-30 12:57