下面小編就為大家帶來一篇老生常談Java String字串(必看篇)。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧
Java中字串物件建立有兩種形式,一種是字面量形式,如String str = "hello";,另一種就是使用new這種標準的建構物件的方法,如String str = new String("hello");
對於這樣的常識,不再贅述。
首先String類別是final類,為什麼定義成final形式呢?
簡單說,對於如此高頻率被使用的資料類型,設計者們認為已經設計的足夠優秀了,不需要被繼承,否則胡亂繼承重寫可能會降低程式的性能。
如標題所述,既然深入,那我們就挖下String在jvm層面的小動作。
先解釋字面量創建的形式:
#當程式碼中出現字面量形式建立字串物件時,JVM首先會對這個字面量進行檢查,如果字串常數池中存在相同內容的字串物件的引用,則將這個引用返回,否則新的字串物件被創建,然後將這個引用放入字串常數池,並返回該引用。
如下:
String str1 = "hello" ;
當我們第一次創建的時候,這裡我們認為沒有內容為hello的物件存在。 JVM透過字串常數池查找不到內容為hello的字串物件存在,那麼會建立這個字串對象,然後將剛建立的物件的引用放入到字串常數池中,並且將引用傳回給變數str1
如果接下來有這樣一段程式碼
String str2 = "hello" ;
同樣JVM還是要偵測這個字面量,JVM透過找出字串常數池,發現內容為」hello」字串物件存在,於是將已經存在的字串物件的參考傳回給變數str2。注意這裡不會重新建立新的字串物件。
驗證是否為str1和str2是否指向同一對象,我們可以透過這段程式碼
System.out.println(str1 == str2);
結果為true。
第二個使用new建立:
String str3 = new String("hello");
當我們使用了new來建構字串物件的時候,不管字串常數池中有沒有相同內容的物件的引用,新的字串物件都會創建。因此我們使用下面程式碼測試一下,
String str3 = new String("hello"); System.out.println(str1 == str3);
結果為false。說明這兩個引用指向不同的物件。
intern
對於上面使用new建立的字串對象,如果想將這個物件的參考加入到字串常數池,可以使用intern方法。
呼叫intern後,首先檢查字串常數池中是否有該物件的引用,如果存在,則將這個引用傳回給變量,否則將引用加入並傳回給變數。
String str4 = str3.intern(); System.out.println(str4 == str1);
結果為true。
疑難問題
前提條件?
字串常數池實作的前提條件就是Java中String物件是不可變的,這樣可以安全地保證多個變數共享同一個物件。如果Java中的String物件可變的話,一個引用運算改變了物件的值,那麼其他的變數也會受到影響,顯然這樣是不合理的。
引用 or 物件
字串常數池中存放的時引用還是對象,這個問題是最常見的。字串常數池存放的是物件引用,不是物件。在Java中,物件都創建在堆疊記憶體中。字串常數池存在於堆記憶體中的永久代
優缺點
字串常數池的好處就是減少相同內容字串的創建,節省記憶體空間。
如果硬要說弊端的話,就是犧牲了CPU運算時間來換空間。 CPU計算時間主要用於在字串常數池中尋找是否有對內容相同物件的參考。不過其內部實作為HashTable,所以計算成本較低。
GC回收?
因為字串常數池中持有了共享的字串物件的引用,這就是說是不是會導致這些物件無法回收?
首先問題中共享的物件一般情況下都比較小。據我查證了解,在早期的版本中確實存在這樣的問題,但是隨著弱引用的引入,目前這個問題應該沒有了。
intern使用?
#关于使用intern的前提就是你清楚自己确实需要使用。比如,我们这里有一份上百万的记录,其中记录的某个值多次为美国加利福尼亚州,我们不想创建上百万条这样的字符串对象,我们可以使用intern只在内存中保留一份即可。
总有例外?
你知道下面的代码,会创建几个字符串对象,在字符串常量池中保存几个引用么?
String test = "a" + "b" + "c";
答案是只创建了一个对象,在常量池中也只保存一个引用。我们使用javap反编译看一下即可得知。
实际上在编译期间,已经将这三个字面量合成了一个。这样做实际上是一种优化,避免了创建多余的字符串对象,也没有发生字符串拼接问题。
以上是Java中關於String字串的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

使用Java的String.valueOf()函数将基本数据类型转换为字符串在Java开发中,当我们需要将基本数据类型转换为字符串时,一种常见的方法是使用String类的valueOf()函数。这个函数可以接受基本数据类型的参数,并返回对应的字符串表示。在本文中,我们将探讨如何使用String.valueOf()函数进行基本数据类型转换,并提供一些代码示例来

char数组转string的方法:可以通过赋值来实现,使用{char a[]=" abc d\0efg ";string s=a;}语法,让char数组对string直接赋值,执行代码即可完成转换。

大家好,今天给大家分享java基础知识之String。String类的重要性就不必说了,可以说是我们后端开发用的最多的类,所以,很有必要好好来聊聊它。

使用Java的String.replace()函数替换字符串中的字符(串)在Java中,字符串是不可变的对象,这意味着一旦创建了一个字符串对象,就无法修改它的值。但是,你可能会遇到需要替换字符串中的某些字符或者字符串的情况。这时候,我们可以使用Java的String类中的replace()方法来实现字符串的替换。String类的replace()方法有两种重

使用Java的String.length()函数获取字符串的长度在Java编程中,字符串是一种非常常见的数据类型,我们经常需要获取字符串的长度,即字符串中字符的个数。在Java中,我们可以使用String类的length()函数来获取字符串的长度。下面是一个简单的示例代码:publicclassStringLengthExample{publ

String中split方法使用String的split()方法用于按传入的字符或字符串对String进行拆分,返回拆分之后的数组。1、一般用法用一般的字符,例如@或,等符号做分隔符时:Stringaddress="上海@上海市@闵行区@吴中路";String[]splitAddr=address.split("@");System.out.println(splitAddr[0]+splitAddr[1]+splitAddr[2]+splitAddr[3

一、认识String1.JDK中的String首先我们看看JDK中的String类源码,它实现了很多接口,可以看到String类被final修饰了,这就说明String类不可以被继承,String不存在子类,这样所有使用JDK的人,用到的String类都是同一个,如果String允许被继承,每个人都可以对String进行扩展,每个人使用的String都不是同一个版本,两个不同的人使用相同的方法,表现出不同的结果,这就导致代码没办法进行开发了继承和方法覆写在带来灵活性的同时,也会带来很多子类行为不

String.toLowerCase()函数是Java中一个非常有用且常见的字符串处理函数,它可以将一个字符串转换为小写形式。在本文中,我们将介绍该函数的使用方法,并给出一些相关的代码示例。首先,让我们来看一下String.toLowerCase()函数的基本语法。它没有任何参数,只需要调用它即可。下面是示例代码:Stringstr="Hel


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3漢化版
中文版,非常好用

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)