答:1.為了實現字串池
2.為了執行緒安全
3.為了實現string可以建立hashcode不可變性
首先你要理解final的用途,在分析string為什麼要用final修飾,final可以修飾類,方法和變數,並且被修飾的類或方法,被final修飾的類不能被繼承,即它不能擁有自己的子類,被final修飾的方法不能被重寫, final修飾的變數,無論是類屬性、物件屬性、形參還是區域性變數,都需要進行初始化操作。
在了解final的用途後,在看string為什麼要被final修飾:主要是為了」安全性「和」效率「的緣故。
檢視jdk string的原始碼
final修飾的string,代表了string的不可繼承性,final修飾的char代表了被儲存的資料不可更改性。但是:雖然final代表了不可變,但僅僅是引用位址不可變,並不代表了陣列本身不會變,請看下面。
final也可以將陣列本身改變的,這個時候,起作用的還有private,正是因為兩者保證了string的不可變性。
那麼為什麼保證string不可變呢,因為只有當字串是不可變的,字串池才有可能實現。字串池的實現可以在執行時節約很多heap空間,因為不同的字串變數都指向池中的同乙個字串。但如果字串是可變的,那麼string interning將不能實現,因為這樣的話,如果變數改變了它的值,那麼其它指向這個值的變數的值也會一起改變。
如果字串是可變的,那麼會引起很嚴重的安全問題。譬如,資料庫的使用者名稱、密碼都是以字串的形式傳入來獲得資料庫的連線,或者在socket程式設計中,主機名和埠都是以字串的形式傳入。因為字串是不可變的,所以它的值是不可改變的,否則黑客們可以鑽到空子,改變字串指向的物件的值,造成安全漏洞。
因為字串是不可變的,所以是多執行緒安全的,同乙個字串例項可以被多個執行緒共享。這樣便不用因為執行緒安全問題而使用同步。字串自己便是執行緒安全的。
因為字串是不可變的,所以在它建立的時候hashcode就被快取了,不需要重新計算。這就使得字串很適合作為map中的鍵,字串的處理速度要快過其它的鍵物件。這就是hashmap中的鍵往往都使用字串。
String為什麼用final修飾
1 為了實現字串連線池 final可以修飾類方法和變數,被final修飾的類不能被繼承。string被final所修飾主要是為了 安全性 和 效率 final修飾string代表string不可繼承,final修飾的char陣列儲存的資料是可以改變的。char a a 2 w system.out....
String為什麼是final
1.可以快取 hash 值 因為 string 的 hash 值經常被使用,例如 string 用做 hashmap 的 key。不可變的特性可以使得 hash 值也不可變,因此只需要進行一次計算。2.string pool 的需要 如果乙個 string 物件已經被建立過了,那麼就會從 strin...
python為什麼用flask 為什麼用flask
flask是python在web開發領域乙個輕量級的框架,為什麼選擇flask呢?此文可能會給你答案。選擇flask的原因 1.微框架 簡潔 只做它需要做的,給開發展提供了很大的擴充套件性。2.flask和相關的依賴 jinja2 werkzeug 設計得非常優秀,用著簡單。3.開發效率非常高,比如...