成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java中String怎么用

這篇文章將為大家詳細(xì)講解有關(guān)Java中String怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設(shè)、成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計制作的專業(yè)網(wǎng)站制作公司,擁有經(jīng)驗豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁設(shè)計人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨特的設(shè)計風(fēng)格。自公司成立以來曾獨立設(shè)計制作的站點上千。

前言

String可以說是Java中使用最多最頻繁、最特殊的類,因為同時也是字面常量,而字面常量包括基本類型、String類型、空類型。

一. String的使用

1. String的不可變性

/**
 * The {@code String} class represents character strings. All
 * string literals in Java programs, such as {@code "abc"}, are
 * implemented as instances of this class.
 * <p>
 * Strings are constant; their values cannot be changed after they
 * are created. String buffers support mutable strings.
 * Because String objects are immutable they can be shared. For example:
 * ...
 */

public final class String { 
 private final char value[];
}

String對象一旦在堆中創(chuàng)建出來,就無法再修改。因為String對象放在char數(shù)組中,該數(shù)組由final關(guān)鍵字修飾,不可變。

2. 定義一個字符串

/**
 * 定義一個字符串
 */
String str1 = "helloworld";
String str2 = "helloworld";
//也可以,但基本不這樣寫
String str3 = new String("helloworld");
System.out.println(str1 == str2);
System.out.println(str1 == str3);

//運行結(jié)果 true, false

上面三句代碼怎么理解呢?這里需要先引入一個概念,字符串常量池。

字符串常量池是一塊特殊的獨立內(nèi)存空間,放在Java Heap中 { 在Jdk7.0之前字符串常量池存放在PermGen中,Jdk7.0的時候移動到了Java Heap(在堆中仍然是獨立的),Jdk8.0的時候去掉了PermGen,用Metaspace進(jìn)行取代 } ,Java內(nèi)存模型不是本章討論的重點。

str1和str2引用的字符串字面量就在字符串常量池中,而str3引用的對象在Java Heap中。

怎么,還不太好理解?舉個例子

工作一天,到下班時間了,準(zhǔn)備看會兒金瓶.,算了,《三國演義》,打開小說網(wǎng)站,在線閱讀;過了半個小時,女票回家了,看《三國演義》也是她想做的事兒,我看網(wǎng)址發(fā)給她,好,她也開始看了,再過半個小時,我爸回來了,他也是三國迷,但是他不喜歡在線看,因此在書店買了一本看。

上面提到的小說網(wǎng)站就是一個字符串常量池,包含了很多字符串字面量,如《三國演義》、《西游記》、《紅樓夢》等,每個字符串字面量在常量池中保持獨一份,無論誰進(jìn)網(wǎng)站看《三國演義》都是同樣的網(wǎng)址和同樣的內(nèi)容。

我和女票就是str1和str2,我們看的都是同一個網(wǎng)站的《三國演義》,不僅內(nèi)容一樣,引用的地址也一樣(字符串常量池中保留了唯一的“helloworld”),因此str1 == str2 運行結(jié)果為true

而我爸就是str3,與我和女票都不一樣,雖然看的內(nèi)容也是《三國演義》,但是通過實體書籍來看,引用地址不一樣,同時一本書籍不支持多個人同時看(字符串對象在java heap中,且每次new都會新建一個對象),因此str1 == str3 運行結(jié)果為false。

一個字符串字面量總是引用String類的同一個實例,因為被String.intern()方法限定了,同樣我們可以調(diào)用該方法將堆中的String對象放到字符串常量池中,這樣做可以提升內(nèi)存使用效率,同時可以讓所用使用者共享唯一的實例。

System.out.println(str1 == str3.intern());
//運行結(jié)果為true

那么該方法的實現(xiàn)邏輯是怎么樣的呢,我們看一下源碼

/** 
 * Returns a canonical representation for the string object. 
 * <p> 
 * A pool of strings, initially empty, is maintained privately by the 
 * class {@code String}. 
 * <p> 
 * When the intern method is invoked, if the pool already contains a 
 * string equal to this {@code String} object as determined by 
 * the {@link #equals(Object)} method, then the string from the pool is 
 * returned. Otherwise, this {@code String} object is added to the 
 * pool and a reference to this {@code String} object is returned. 
 * <p> 
 * It follows that for any two strings {@code s} and {@code t}, 
 * {@code s.intern() == t.intern()} is {@code true} 
 * if and only if {@code s.equals(t)} is {@code true}. 
 * <p> 
 * All literal strings and string-valued constant expressions are 
 * interned. String literals are defined in section 3.10.5 of the 
 * <cite>The Java&trade; Language Specification</cite>. 
 * 
 * @return a string that has the same contents as this string, but is 
 *  guaranteed to be from a pool of unique strings. 
 */
 public native String intern();

我們發(fā)現(xiàn)這是一個native方法,看一下注釋,發(fā)現(xiàn)str3.intern()方法大致流程是:

當(dāng)執(zhí)行intern()時,會先判斷字符串常量池中是否含有相同(通過equals方法)的字符串字面量,如果有直接返回字符串字面量;如果不含,則將該字符串對象添加到字符串常量池中,同時返回該對象在字符串常量池的引用。

返回的引用需要賦值才可,否則還是會指向堆中的地址,即:

String str4 = new String("helloChina");
System.out.println(str4.intern() == str4);//false
str4 = str4.intern();
String str5 = "helloChina";
String str6 = "helloZhonghua"
System.out.println(str4 == str5);//true

下面我們看一下內(nèi)存結(jié)構(gòu)

Java中String怎么用

3. 再次賦值給已定義的字符串

str6 = "helloHuaxia";

我們開始已經(jīng)說了String是由final關(guān)鍵字修飾,不可變,那么此時在內(nèi)存中如何體現(xiàn)呢?

Java中String怎么用

4. String 對 “+” 的處理

String str7 = "good good" + " study";
String str8 = "good good study";
system.out.println(str7 == str8);

通過編譯工具后得到

String str7 = "good good study";
String str8 = "good good study";

因此我們可以發(fā)現(xiàn)編譯器在編譯期間就是進(jìn)行變量合并,而不會在常量池中創(chuàng)建三個對象 “good good”,“ study”,"good good study"。str7 == str8 運行結(jié)果 true。

但如果這樣

String str9 = "good good ";
String str10 = str9 + "study";
system.out.println(str8 == str10);//false

這時運行結(jié)果為false,通過String變量 + 字符常量方式得到的結(jié)果會在堆中,不在常量池中,當(dāng)然可以通過intern()方法放進(jìn)常量池中,同時不僅“+”如此,調(diào)用substring(),toUpperCase(),trim()等返回的都是String在堆中的地址。

5. String常用的方法

//str1 == "hello,world ";

//獲取長度
str1.length()//12;

//截取位置2到5之間的字符串(包括位置2,不包括位置5,從0開始)
str1.substring(2,5);//"llo"

//判斷是否含有字符串“ello”
str1.contains("ello");//true,通過indexOf實現(xiàn)

//獲取ello在str1中的開始位置
str1.indexOf("ello");//1

//將字符串轉(zhuǎn)化為字符串?dāng)?shù)據(jù)
str1.split(",");//["hello","world"]

//去掉字符串兩側(cè)空格
str1.trim();//"hello,world"

關(guān)于“Java中String怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

本文標(biāo)題:Java中String怎么用
URL標(biāo)題:http://jinyejixie.com/article32/pshjsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站網(wǎng)站設(shè)計、網(wǎng)站營銷企業(yè)網(wǎng)站制作、App開發(fā)、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
竹溪县| 旬阳县| 延边| 宜宾县| 邢台县| 嘉峪关市| 万盛区| 昭通市| 台北市| 金秀| 顺义区| 平塘县| 武陟县| 嵊泗县| 财经| 新化县| 黄浦区| 云龙县| 江山市| 汕尾市| 舒兰市| 固阳县| 苍溪县| 莱芜市| 临夏市| 云安县| 佳木斯市| 翁源县| 吴旗县| 元朗区| 翼城县| 元朗区| 唐海县| 唐海县| 巍山| 兴海县| 哈巴河县| 沈阳市| 巍山| 内乡县| 阿拉善盟|