1. 程式人生 > >String為什麼被設計成final以及字串池的學習

String為什麼被設計成final以及字串池的學習

為什麼String被設計成final不可變的,我認為主要是2方面的原因,第一點是為了效能,第二點是為了安全

一、效能

先看一個字串緩衝池的例子

    String s1 = "ab";
    String s3 = "ab";
    System.out.println(s1==s3);//true

當String使用引號建立字串時,會先去字串池中找,找到了就返回,找不到就在字串池中增加一個然後返回,這樣由於共享提高了效能。如果Sting可變將無法實現共享,Sting變後其所有引用都會改變。

二、安全

設計成final將不能被繼承,確保它們不會在子類中改變語義。String類是final類,這意味著不允許任何人定義String的子類。換言之,如果有一個String的引用,它引用的一定是一個String物件,而不可能是其他類的物件。將會減少一些安全問題,否則有人會把自己的String子類,做修改,覆蓋一些方法,將會造成安全隱患,比如HashMap中的key如果是String等,而且一旦發生,非常難發現。

關於字串池,你可以使用引號來宣告,也可以使用String#intern將其放入。
    String s = new String("ab").intern();
    String s2 = "ab";
    System.out.println(s2==s);//true

相關推薦

String為什麼設計final以及字串學習

為什麼String被設計成final不可變的,我認為主要是2方面的原因,第一點是為了效能,第二點是為了安全 一、效能 先看一個字串緩衝池的例子 String s1 = "ab"; String s3 = "ab"; System.

String設計final的原因

我進行了重新排版,並且更換了其中的一個例子,讓我們更好理解。 String很多實用的特性,比如說“不可變性”,是工程師精心設計的藝術品!藝術品易碎!用final就是拒絕繼承,防止世界被熊孩子破壞,維護世界和平! 1. 什麼是不可變? String不可變很簡單,如下圖,給一個已有字串“abcd”第二次賦

String設計不可變和不能繼承的原因

String是所有語言中最常用的一個類。我們知道在Java中,String是不可變的、final的。Java在執行時也儲存了一個字串池(String pool),這使得String成為了一個特別的類。 主要是為了 “ 效率 ” 和 “ 安全性 ” 的緣故。若 String 

在java中String類為什麽要設計final

tro cli lai 這一 引用 沒有 num 重新 static 大神鏈接:在java中String類為什麽要設計成final? - 程序員 - 知乎 我進行了重新排版,並且更換了其中的一個例子,讓我們更好理解。 String很多實用的特性,比如說“不可變性”,是工

java裏String類為何設計final

使用 hashtable 方向 memory 思維 per 垃圾收集器 其他 tro   前些天面試遇到一個非常難的關於String的問題,“String為何被設計為不可變的”?類似的問題也有“String為何被設計為final?”個人認為還是前面一種問法更準確,設計成fi

在Java中String類為什麽要設計finalString真的不可變嗎?其他基本類型的包裝類也是不可變的嗎?

數據 pri 創建 long tde 繼承 set 字符串常量 通過 最近突然被問到String為什麽被設計為不可變,當時有點懵,這個問題一直像bug一樣存在,竟然沒有發現,沒有思考到,在此總結一下。 1.String的不可變String類被final修飾,是不可繼承和修改

在Java中String類為什麼要設計finalString真的不可變嗎?其他基本型別的包裝類也是不可變的嗎?

最近突然被問到String為什麼被設計為不可變,當時有點懵,這個問題一直像bug一樣存在,竟然沒有發現,沒有思考到,在此總結一下。 1.String的不可變 String類被final修飾,是不可繼承和修改的。當一個String變數被第二次賦值時,不是在原有記憶體地址上修改資料,而是在記憶體中重

【小家java】String類為什麼要設計final?不可變有什麼優點?

相關閱讀 原始碼解釋: 先貼一下String類的申明程式碼: public final class String implements java.io.Serializable, Comparable<String>, CharSeque

Swift base64轉圖片以及字串,以及圖片和字串 base64的方法

圖片轉成 base64: let image : UIImage =UIImage(named:"test.png")! let imageData = UIImagePNGRepresentation(image) let base64String = image

為什麼String設計為不可變?是否真的不可變?

1 物件不可變定義  不可變物件是指物件的狀態在被初始化以後,在整個物件的生命週期內,不可改變。  2 如何不可變  通常情況下,在java中通過以下步驟實現不可變 對於屬性不提供設值方法 所有的屬性定義為private final 類宣告為final不允許繼承 Return deep cloned obj

為什麼String設計不可變的

1. 字串常量池的需要 字串常量池(String pool, String intern pool, String保留池) 是Java堆記憶體中一個特殊的儲存區域, 當建立一個String物件時,假如此字串值已經存在於常量池中,則不會建立一個新的物件,而是引用已經存在的物件

為什麽現在的智能手機,都設計不可更換電池?

來講 tex 山寨 維修 客服 https 現象 關註 手機品牌 為什麽現在的智能手機,都被設計成不可更換電池?  近些年來,智能手機興起,成了人們必不可少的生活工具。不過為何近年所推出的手機,已經不能自行更換電池,究竟是什麽原因呢?  很多網友都說手機換電池很方便,例如可

字串到常量,一文看懂String設計

# 從一道面試題開始 看到這個標題,你肯定以為我又要講這道面試題了 ```java // 這行程式碼建立了幾個物件? String s3 = new String("1"); ``` 是的,沒錯,我確實要從這裡開始 ![image-20200615221408500](https://imgconv

String為什麽要設置Final類型

ide cte uid 只有一個 his void rod tor eat ---今天面試碰到個這樣的問題:String在設計的時候為什麽要設計成final的 當時回答的是String功能已經很豐富了,不需要對其進行擴展,所有巴拉巴拉。 現在來正確看看為什麽定義成fina

js中的string型別與number型別的轉換以及字串的基本常見操作

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, i

[C++] STL庫函式之字串string::npos的介紹,以及string中的find函式~

npos經常和find一起用~它們兩個都在標頭檔案<string>裡面~先看用法: #include <iostream> #include <string> us

mysql中int型的數字怎麼轉換字串 以及字串轉換int

MySQL 數字型別轉換函式(concat/cast)。 1、將Int 轉為varchar經常用 concat函式,比如concat(8,’0′) 得到字串 ’80′。 2、將varchar 轉為Int 用 cast(a as signed) a為varchar型別的字串

String 設計不可變類的好處? OR 為什麼要將String設計不可變化的?

為什麼String在 java 中是不可變的? 這是一個受歡迎的面試問題。 字串是任何程式語言中使用最多的類之一。 我們知道 String 在 java 和 java 執行時是不可變(immutable

[LeetCode] Design Compressed String Iterator 設計壓縮字串的迭代器

Design and implement a data structure for a compressed string iterator. It should support the following operations: next and hasNext. The given compress

堆,棧,字串以及程序,執行緒淺談記憶體(個人理解)

程序:一個服務的執行至少一個程序的開啟。程序就是程式的一次執行,功能的一次跑動。說簡單點好比點選跳轉,就是開啟一個程序。 執行緒:執行緒是程序的實體,簡單點說,執行緒就是分配空間(堆,棧),整合記憶體空間,處理資料交換。 一個程序可以擁有多個執行緒,多個執行緒之間可同時,協同執行。   堆: