1. 程式人生 > >Java的String物件

Java的String物件

序言

一直在看java的一些知識,使用到最多的是String,但是在工作中,很少去關注在使用String的時候其記憶體分配的方式,寫的時候的效率問題。好了,廢話不多說,開始,歡迎 廣大愛好者分享。

String物件

在Java中,String物件時一個不可變的物件,在檢查原始碼的時候會發現一些結果。

檢視String的原始碼會發現,它是一個final物件,在最低層使用的final修改的一個char陣列實現的,所以,string物件是不可變的。

使用

那麼在使用的時候,有啥子區別呢,看圖


帥氣的你是不是知道答案了呢,==和equals的區別是什麼?

對答案就是


對,就是這樣的,==運算是姑且是比較兩個物件的記憶體地址是否相同 ,而equals是比較的內容(在重寫equals時需要重寫hashcode方法,為什麼?)。在Jvm第一次遇到String的時候,會專門去記憶體裡面開闢一片區域出來,存放String物件,叫做String池。當遇到"hello"的時候,JVM會去String區域裡面檢查是否有"hello"物件,沒有,則建立一個返回,然後返回給引用,如果有,則直接把這個物件返回。所以==和equals都是true。相信你已經知道了吧,s和s1指向的都是同一個物件。

然後下面這種情況呢?


對,沒錯,是不是喜歡這樣寫,沒注意到呢,聰明的你是不是知道了?


你的答案是不是一樣呢,為什麼呢?


因為JVM遇到"hello"的時候會像上面那種情況一樣,new String("hello")裡面的"hello"會去String池裡去找,如果有,就返回,沒有就建立了返回,問題就出在前面的那個new上面,JVM會在記憶體上建立一個Strng物件返回,所以內容一樣,但是記憶體卻不一樣了。

所有,hashcode一樣,但是不一定是同一個物件,但是如果是同一個物件,hashcode必定一樣。

總結

打完收工。

在使用String的時候,儘量避免使用new運算子。