欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:Java之String類

柚子快報(bào)激活碼778899分享:Java之String類

http://yzkb.51969.com/

目錄

初識(shí)String

字符串比較相等

字符串常量池

理解字符串的不可變

字符與字符串

字符串常見操作

字符串比較

compareTo()函數(shù)的原碼

?字符串查找

字符串替換

字符串拆分

字符串截取

其它操作

StringBuffer和StringBuilder

面試題:請解釋String、StringBuffer、StringBuilder的區(qū)別:?

初識(shí)String

常見的構(gòu)造String的方式

// 方式一

String str = "Hello Bit";

// 方式二

String str2 = new String("Hello Bit");

// 方式三

char[] array = {'a', 'b', 'c'};

String str3 = new String(array);

注意事項(xiàng):"hello" 這樣的字符串字面值常量, 類型也是 String. String 也是引用類型. String str = "Hello"; 這樣的代碼內(nèi)存布局如下:

由于

String

是引用類型

,

因此對于以下代碼

String str1 = "Hello";

String str2 = str1;

內(nèi)存布局如圖:

那是不是修改

str1 , str2

也會(huì)隨之變化呢

?

str1 = "World";

System.out.println(str2);

//

執(zhí)行結(jié)果

Hello

我們發(fā)現(xiàn)

, "

修改

" str1

之后

, str2

也沒發(fā)生變化

,

還是

?Hello。

事實(shí)上

,

str1 = "World"

這樣的代碼并不算

"

修改

"

字符串

,

而是讓

str1

這個(gè)引用指向了一個(gè)新的

String

對象。

?

字符串比較相等

代碼1

String str1 = "Hello";

String str2 = "Hello";

System.out.println(str1 == str2);

// 執(zhí)行結(jié)果

true

代碼2

String str1 = new String("Hello");

String str2 = new String("Hello");

System.out.println(str1 == str2);

// 執(zhí)行結(jié)果

false

我們來分析兩種創(chuàng)建 String 方式的差異.代碼1內(nèi)存布局

我們發(fā)現(xiàn), str1 和 str2 是指向同一個(gè)對象的. 此時(shí)如 "Hello" 這樣的字符串常量是在 字符串常量池 中.

關(guān)于字符串常量池

"Hello"

這樣的字符串字面值常量

,

也是需要一定的內(nèi)存空間來存儲(chǔ)的

.

這樣的常量具有一個(gè)特點(diǎn)

,

就是不需要修改(

常量嘛

).

所以如果代碼中有多個(gè)地方引用都需要使用

"Hello"

的話

,

就直接引用到常量池的這個(gè)位置就行了,

而沒必要把

"Hello"

在內(nèi)存中存儲(chǔ)兩次

.

代碼2內(nèi)存布局

通過 String str1 = new String("Hello"); 這樣的方式創(chuàng)建的 String 對象相當(dāng)于再堆上另外開辟了空間來存儲(chǔ)"Hello" 的內(nèi)容, 也就是內(nèi)存中存在兩份 "Hello". String 使用 == 比較并不是在比較字符串內(nèi)容, 而是比較兩個(gè)引用是否是指向同一個(gè)對象.

Java

中要想比較字符串的內(nèi)容

,

必須采用

String

類提供的

equals

方法。

String str1 = new String("Hello");

String str2 = new String("Hello");

System.out.println(str1.equals(str2));

// System.out.println(str2.equals(str1)); // 或者這樣寫也行

// 執(zhí)行結(jié)果

true

equals 使用注意事項(xiàng) 現(xiàn)在需要比較 str 和 "Hello" 兩個(gè)字符串是否相等, 我們該如何來寫呢?

String str = new String("Hello");

// 方式一

System.out.println(str.equals("Hello"));

// 方式二

System.out.println("Hello".equals(str));

字符串常量池

在上面的例子中, String類的兩種實(shí)例化操作, 直接賦值和 new 一個(gè)新的 String.a) 直接賦值

String str1 = "hello" ;

String str2 = "hello" ;

String str3 = "hello" ;

System.out.println(str1 == str2); // true

System.out.println(str1 == str3); // true

System.out.println(str2 == str3); // true

為什么現(xiàn)在并沒有開辟新的堆內(nèi)存空間呢?String類的設(shè)計(jì)使用了共享設(shè)計(jì)模式。 在JVM底層實(shí)際上會(huì)自動(dòng)維護(hù)一個(gè)對象池(字符串常量池),如果現(xiàn)在采用了直接賦值的模式進(jìn)行String類的對象實(shí)例化操作,那么該實(shí)例化對象(字符串內(nèi)容)將自動(dòng)保存到這個(gè)對象池之中. 如果下次繼續(xù)使用直接賦值的模式聲明String類對象,此時(shí)對象池之中如若有指定內(nèi)容,將直接進(jìn)行引用,如若沒有,則開辟新的字符串對象而后將其保存在對象池之中以供下次使用。

b) 采用構(gòu)造方法 類對象使用構(gòu)造方法實(shí)例化是標(biāo)準(zhǔn)做法。分析如下程序:

String

str

=

new

String

(

"hello"

) ;

這樣的做法有兩個(gè)缺點(diǎn): 1. 如果使用String構(gòu)造方法就會(huì)開辟兩塊堆內(nèi)存空間,并且其中一塊堆內(nèi)存將成為垃圾空間(字符串常量 "hello" 也是一個(gè)匿名對象, 用了一次之后就不再使用了, 就成為垃圾空間, 會(huì)被 JVM 自動(dòng)回收掉). 2. 字符串共享問題. 同一個(gè)字符串可能會(huì)被存儲(chǔ)多次, 比較浪費(fèi)空間.

我們可以使用 String 的 intern 方法來手動(dòng)把 String 對象加入到字符串常量池中。

// 該字符串常量并沒有保存在對象池之中

String str1 = new String("hello") ;

String str2 = "hello" ;

System.out.println(str1 == str2);

// 執(zhí)行結(jié)果

false

? ?

String str1 = new String("hello").intern() ;

String str2 = "hello" ;

System.out.println(str1 == str2);

// 執(zhí)行結(jié)果

true

?

關(guān)于String類中的intern()方法

在Java中,String 類的 intern() 方法是一個(gè)非常重要的方法,它用于確保字符串常量池中只存儲(chǔ)一份相同內(nèi)容的字符串的副本。當(dāng)你調(diào)用一個(gè)字符串的 intern() 方法時(shí),如果字符串常量池中已經(jīng)包含一個(gè)等于此 String 對象的字符串(通過 equals(Object) 方法確定),則返回代表池中這個(gè)字符串的 String 對象的引用。否則,將此 String 對象包含的字符串添加到常量池中,并返回此 String 對象的引用。

intern() 方法的作用:通過 intern() 方法,可以顯式地將一個(gè)字符串對象添加到字符串常量池中(如果該字符串尚不存在于池中),并返回該字符串的引用。這對于減少內(nèi)存中的字符串副本數(shù)量,優(yōu)化內(nèi)存使用非常有幫助。

intern() 方法的返回值:如果字符串常量池中已經(jīng)包含與當(dāng)前字符串內(nèi)容相同的字符串,則返回常量池中該字符串的引用;否則,將當(dāng)前字符串添加到常量池中,并返回當(dāng)前字符串的引用。注意,這里的“當(dāng)前字符串”指的是調(diào)用 intern() 方法的字符串對象。

面試題:請解釋

String

類中兩種對象實(shí)例化的區(qū)別

1.

直接賦值:只會(huì)開辟一塊堆內(nèi)存空間,并且該字符串對象可以自動(dòng)保存在對象池中以供下次使用。

2.

構(gòu)造方法:會(huì)開辟兩塊堆內(nèi)存空間,不會(huì)自動(dòng)保存在對象池中,可以使用

intern()

方法手工入池。

理解字符串的不可變

字符串是一種不可變對象

.

它的內(nèi)容不可改變

.

String

類的內(nèi)部實(shí)現(xiàn)也是基于

char[]

來實(shí)現(xiàn)的

,

但是

String

類并沒有提供

set

方法之類的來修改內(nèi)部的字符數(shù)組

.

感受下形如這樣的代碼:

String str = "hello" ;

str = str + " world" ;

str += "!!!" ;

System.out.println(str);

// 執(zhí)行結(jié)果

hello world!!!

形如

+=

這樣的操作

,

表面上好像是修改了字符串

,

其實(shí)不是

.

內(nèi)存變化如下

:

+=

之后

str

打印的結(jié)果卻是變了

,

但是不是

String

對象本身發(fā)生改變

,

而是

str

引用到了其他的對象

.

為什么

String

要不可變

?

1.

方便實(shí)現(xiàn)字符串對象池

.

如果

String

可變

,

那么對象池就需要考慮何時(shí)深拷貝字符串的問題了

.

2.

不可變對象是線程安全的

.

3.

不可變對象更方便緩存

hash code,

作為

key

時(shí)可以更高效的保存到

HashMap

中。

字符與字符串

代碼示例:獲取指定位置的字符

String str = "hello" ;

System.out.println(str.charAt(0)); // 下標(biāo)從 0 開始

// 執(zhí)行結(jié)果

h

System.out.println(str.charAt(10));

// 執(zhí)行結(jié)果

產(chǎn)生 StringIndexOutOfBoundsException 異常

字符串常見操作

字符串比較

代碼示例

String str1 = "hello" ;

String str2 = "Hello" ;

System.out.println(str1.equals(str2)); // false

System.out.println(str1.equalsIgnoreCase(str2)); // true

String

類中

compareTo()

方法是一個(gè)非常重要的方法,該方法返回一個(gè)整型,該數(shù)據(jù)會(huì)根據(jù)大小關(guān)系返回三類內(nèi)容:

1.

相等:返回

0.

2.

小于:返回內(nèi)容小于

0.

3.

大于:返回內(nèi)容大于

0。

4.如果前者字符串的長度短于后者字符串的長度,會(huì)返回二者的長度差值。

compareTo()函數(shù)的原碼

public int compareTo(String anotherString) {

int len1 = value.length;

int len2 = anotherString.value.length;

int lim = Math.min(len1, len2);

char v1[] = value;

char v2[] = anotherString.value;

int k = 0;

while (k < lim) {

char c1 = v1[k];

char c2 = v2[k];

if (c1 != c2) {

return c1 - c2;

}

k++;

}

return len1 - len2;

}

?字符串查找

字符串替換

字符串拆分

代碼示例:實(shí)現(xiàn)字符串的拆分處理

String str = "hello world hello bit" ;

String[] result = str.split(" ") ; // 按照空格拆分

for(String s: result) {

System.out.println(s);

}

代碼示例:字符串的部分拆分

String str = "hello world hello bit" ;

String[] result = str.split(" ",2) ;

for(String s: result) {

System.out.println(s);

}

注意事項(xiàng):

1. 字符"|","*","+"都得加上轉(zhuǎn)義字符,前面加上"\".

2. 而如果是"",那么就得寫成"\\".

3. 如果一個(gè)字符串中有多個(gè)分隔符,可以用"|"作為連字符.

字符串截取

注意事項(xiàng):

1.

索引從

0

開始

2.

注意前閉后開區(qū)間的寫法

, substring(0, 5)

表示包含

0

號(hào)下標(biāo)的字符

,

不包含

5

號(hào)下標(biāo)

其它操作

StringBuffer和StringBuilder

首先來回顧下

String

類的特點(diǎn):

任何的字符串常量都是

String

對象,而且

String

的常量不可改變,如果改變對象內(nèi)容,改變的是其引用的指向而已。

通常來講

String

的操作比較簡單,但是由于

String

的不可更改特性,為了方便字符串的修改,提供

StringBuffer

和 StringBuilder類。 StringBuffer 和

StringBuilder

大部分功能是相同的,在String

中使用

"+"

來進(jìn)行字符串連接,但是這個(gè)操作在

StringBuffer

類中需要更改為

append()

方法:

示例:StringBuffer的使用

public class Test{

public static void main(String[] args) {

StringBuffer sb = new StringBuffer();

sb.append("Hello").append("World");

fun(sb);

System.out.println(sb);

}

public static void fun(StringBuffer temp) {

temp.append("\n").append("www.bit.com.cn");

}

}

String

StringBuffer

最大的區(qū)別在于:

String

的內(nèi)容無法修改,而

StringBuffer

的內(nèi)容可以修改。頻繁修改字符串的情況考慮使用StingBuffer

為了更好理解

String

StringBuffer

,我們來看這兩個(gè)類的結(jié)構(gòu)

:

可以發(fā)現(xiàn)兩個(gè)類都是

"CharSequence"

接口的子類。這個(gè)接口描述的是一系列的字符集。所以字符串是字符集的子類,如果以后看見CharSequence

,最簡單的聯(lián)想就是字符串。

注意:

String

StringBuffer

類不能直接轉(zhuǎn)換。如果要想互相轉(zhuǎn)換,可以采用如下原則

:

String變?yōu)镾tringBuffer:利用StringBuffer的構(gòu)造方法或append()方法

StringBuffer變?yōu)镾tring:調(diào)用toString()方法

面試題:請解釋String、StringBuffer、StringBuilder的區(qū)別:?

String的內(nèi)容不可修改,StringBuffer與StringBuilder的內(nèi)容可以修改. StringBuffer與StringBuilder大部分功能是相似的。 StringBuffer采用同步處理,屬于線程安全操作;而StringBuilder未采用同步處理,屬于線程不安全操作。

柚子快報(bào)激活碼778899分享:Java之String類

http://yzkb.51969.com/

精彩文章

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19603613.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄