国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中字符串常見題之String相關講解

Java中字符串常見題之String相關講解

2021-07-02 14:45Zy_JiBai Java教程

今天小編就為大家分享一篇關于Java中字符串常見題之String相關講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

今天給大家帶來的是在面試中經常被問到的一道題:

無論在java還是android中,string是一個很常見的類,但是大家真的很了解嗎,我這里有幾個題:

1.

?
1
2
string str1 = "abc";
string str2 = new string("abc");

這兩種創建string對象的方法有什么不同?

2.

?
1
string s = "a" + "b" + "c" + "d";

這里面一共創建了多少對象?

這兩道題昨天給筆者搞得是一臉懵逼,后來一聽這是一道很經典的面試題,就趕快查閱各種資料,現在已經解決了。

在解決這兩個題之前,我們先來明確幾個知識點,相信把這幾個知識點弄完之后再回頭看這兩個題,就很簡單了:

  • 1.引用在棧內存中存儲,對象在堆內存中存儲。
  • 2.string對象不可變。
  • 3.string創建對象的形式:
  • 4.字符串常量池的意義:
  • 5.intern()方法使用。

我們首先來開第一個:

引用在棧內存中存儲,對象在堆內存中存儲。

Java中字符串常見題之String相關講解

這個是我粗略畫的一張圖,這張圖可能不是很準確,但是我只想表達一個意思,我們的棧內存,存放的是我們對象的引用和我們基本數據類型的值。而堆內存中存放的是我們的對象。就是這么簡單。

為什么說string對象不可變

這里我們用一下大佬的圖:

Java中字符串常見題之String相關講解

如果用代碼表示上面的圖,那就是:

?
1
2
string s = "abcd";
s = s + "el";

如果沒有上面這張圖,大家可能會覺得我們只是給s對象后面加了一個el,這不還是原來的s嗎?不,我們說的string對象不可變就是這個意思,當我們給s再加上el時候,新的字符串abcdel被存放到了一個新的內存中。已經不是原來的內存了。所以說string對象不可變,如果變了,那就已經變成了一個新的對象。

那說到這里大家可能會返回去看我寫的第二個問題:按你的說法這不就7個對象嗎?abcd各占一個,每次+到一起都要重新生成對象,一共生成了7個對象。話是沒錯,但是我想說這道題說多解,等我們講完了下面這兩個知識點,這道題就完全解開了。

string創建對象的形式:

正如我們上面看到的,string有兩種創建對象的形式:

1.字面量形式:

?
1
string str = "asd";

2.標準的new形式:

?
1
string str = new string("asd");

字符串常量池的意義:

字符串常量池,又稱為字符串在字面量池。大家不要他想象的多么高深額,其實說白了他就是一塊內存,它里面存放的是我們的字符串的引用。

大家可能疑問這個東西有什么意義:假如我們要創建一個字符串,"a" + "b" + "c" + ....+ 我們+了一萬次,那么按照上面的說法,我們是不是為了創建一個很長的字符串,創建了很多的對象。這樣不但有的字符串被重復的創建了,而且占用了很多不必要的內存,代價有點大。

我們的jvm為了減少字符串的重復創建,維護了一個特殊的內存:就是這個字符串常量池。

在這個字符串常量池中,存放著我們字符串對象的引用。下面我們根據字符串創建對象的兩種形式來說明一下常量池是如何存放string對象引用的:

1.通過字面量創建string對象:

Java中字符串常見題之String相關講解

我們舉個例子,string str = "abc";我們通過字面量形式創建一個值為"abc"的對象,首先我們判斷常量池中是否存在一個引用,這個引用的值也是"abc",如果有這個值,那么我們就從常量池中拿到這個引用,返回給str。

如果沒有,那么我們就創建這個對象,然后把str這個引用值放到常量池中。

在這里我們要明確幾個點了:

  • 1首先常量池存放的不是字符串對象,而是字符串對象的引用。
  • 2.無論常量池中是否存在這個對象的引用,最后結果都會存放有這個引用。
  • 3.該方法可能不會創建新的對象。

2.通過new創建string對象。

這里其實只有一句話,無論常量池中是否存在相同值的引用,至少創建一個對象。因為不管別的,new這個語法就一定會創建一個新的對象,然后我們要看構造方法中的字符串,如果常量池中存在與該字符串相同值的引用,那么就不會創建新的對象,反之會創建對象之后,在常量池中存放這個引用。

這樣看起來我們的常量池的意義就很明確了,減少重復創建string對象,從而減少不必要的內存消耗。

如果要說他的弊端的話,應該就是犧牲了cpu的計算時間來換取空間吧,因為查找是否有相同內容的引用是cpu耗時計算,但是與前者占用內存相比,這個還是算不了什么的吧(筆者自己觀點,沒有官方支持哈哈)。

intern()方法使用

最后我們來看一下這個intern()方法,這個方法其實理解為查看常量池中是否存在對應內容的引用。如果有他會返回常量池中的引用,如果沒有則會將當前string的引用放入常量池。

我們舉幾個例子對比下就好:

?
1
2
3
4
5
public static void main(string[] args) {
 string str1 = "gfzy";
 string str2 = str1.intern();
 system.out.println(str1 == str2);
}

他的結果是true。很簡單,我們首先通過字面量形式創建了一個“gfzy”對象,此時常量池中沒有相同內容引用,所以常量池存放str1的引用。

然后str2為str1的.intern()方法,現在常量池中存在“gfzy”這個內容的引用,所以我們返回這個引用,也就是str1,所以str1和str2指向同一個引用。

?
1
2
3
4
5
public static void main(string[] args) {
 string str1 = new string("gfzy");
 string str2 = "gfzy";
 system.out.println(str1 == str2);
}

這個結果為false,首先我們看到str1是new了一個對象,所以他肯定是在堆內存中一塊新的內存,而構造方法中的“gfzy”,首先在常量池中會拿到他的引用,然后返回這個引用。

str2直接拿到了常量池中的引用,所以一個是堆內存新創建的,一個是原來常量池中的引用,兩者指向不是一個內存,所以是false。

而如果是這樣呢:

?
1
2
3
4
5
public static void main(string[] args) {
 string str1 = new string("gfzy").intern();
 string str2 = "gfzy";
 system.out.println(str1 == str2);
}

這個結果為true。在原來的基礎上只是添加了一個inter方法,在new string("gfzy");時候,現在常量池中已經有了這個引用。而現在intern,我們會拿到常量池中的引用,所以str1為常量池中的引用,str2和上面一樣,所以返回true。

現在這幾個問題都解決完了,我們再返回頭看之前的兩個問題,第一個問題就很簡單了,而我們剛才也說過了。

第二個是看常量池中是否已經存在了對應的引用,如果沒有,那么是"a","b","ab","c","abc","d","abcd"七個對象,如果常量池中存在引用,那么只創建了一個“abcd”(這個是編譯器優化后的結果,其實筆者這里也是有點懵逼,個人感覺應該是3個額,希望這個問題有讀者多多留言,幫我解答一下這個問題)。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://blog.csdn.net/zy_jibai/article/details/80159880

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久久久久久久久久精 | 国变精品美女久久久久av爽 | 久久成人国产精品 | 日韩不卡一区二区三区 | 精品国产网站 | 九九福利 | 波多野结衣先锋影音 | 国产成人一区二区三区 | 欧美亚洲高清 | 亚洲深深色噜噜狠狠网站 | 国产成人精品一区二区三区视频 | 色综合一区二区 | 欧美亚洲国产日韩 | 99精品欧美一区二区三区 | 毛片视频免费播放 | 久久免费99精品久久久久久 | 亚洲一区欧美 | 黄在线免费观看 | 中文字幕在线一区二区三区 | 亚洲视频中文字幕在线观看 | 免费国产一区 | 中文字幕一区在线 | 黄色永久网站 | 免费久久精品 | 国产精品a久久久久 | 亚洲免费成人在线 | 天天插天天狠 | 欧美激情国产日韩精品一区18 | 国产一区二区三区视频 | 成人免费一区二区三区视频软件 | 国产成人久久精品一区二区三区 | 欧美视频三区 | 欧美日韩精品一区二区在线观看 | 亚洲一区视频在线 | 久久艹精品 | 99精品一区二区三区 | 国产一级黄色大片 | 精品国产乱码久久久久久闺蜜 | 国产精品久久久久国产a级 国产色 | 欧美 日韩 国产 成人 在线 91 | 一区二区三区四区在线 |