欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java中String類的各種用法

 更新時間:2021年11月22日 11:39:23   作者:zjruiiiiii  
Java中定義了String和StringBuffer兩個類來封裝對字符串的各種操作,存放于java.lang包中,是Java語言的核心類,提供了字符串的比較、查找、截取、大小寫轉(zhuǎn)換等操作,無需導入即可直接使用它們。讓我們來詳細了解它吧

一、創(chuàng)建字符串

創(chuàng)建字符串的方式有三種:

// 方式一
String str = "Hello Bit";
// 方式二
String str2 = new String("Hello Bit");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);

我們對第一和第二種創(chuàng)建字符串的方法都已經(jīng)非常熟悉了,那至于為什么第三種能夠傳入一個字符數(shù)組變?yōu)樽址?,我們可以按住ctrl鍵點入傳入字符數(shù)組的String當中看其原碼,我們能夠發(fā)現(xiàn)此時是利用的方法是數(shù)組的拷貝,將字符數(shù)組的所有字符改為字符串形式。

在這里插入圖片描述

二、字符、字節(jié)與字符串的轉(zhuǎn)換

1.字符與字符串的轉(zhuǎn)換

因為字符串等同于是一個個字符的集合,因此要想字符轉(zhuǎn)為字符串則要調(diào)用String的構(gòu)造方法并傳入一個字符數(shù)組。例如:

char[] val = {'a','b','c'};
String str = new String(val);
System.out.println(str);

當然,我們也可以選擇字符數(shù)組從哪個下標開始到哪個下標結(jié)束的字符轉(zhuǎn)換為字符串的形式。

例如:

char[] val = {'a','b','c','d','e'};
String str1 = new String(val,0,3);
System.out.println(str1);
//打印結(jié)果為abc
System.out.println("=========");
String str2 = new String(val,1,3);
System.out.println(str2);
//打印結(jié)果為bcd

因為字符串是字符的集合,因此可以字符串可以轉(zhuǎn)換為一個字符或者一個字符數(shù)組。括號內(nèi)的比如0、1是偏移量,偏移量是從0開始的,因此從偏移量為0的位置處往后取3個字符構(gòu)成一個字符串。

如果字符串要轉(zhuǎn)換為單個字符,代碼如下:

String str = "abc";
System.out.println(str.charAt(1));
//打印結(jié)果為b

如果字符串要轉(zhuǎn)換為字符數(shù)組,代碼如下:

char[] val = str.toCharArray();
System.out.println(Arrays.toString(val));
//打印結(jié)果:[a, b, c]

2.字節(jié)與字符串的轉(zhuǎn)換

Java中的將字節(jié)轉(zhuǎn)為字符串需要將字節(jié)數(shù)組轉(zhuǎn)為字符串。

字節(jié)數(shù)組轉(zhuǎn)換為字符串:

byte[] bytes = {97,98,99,100};
String str1 = new String(bytes,0,3);
System.out.println(str1);
//打印結(jié)果為abc
System.out.println("========");
String str2 = new String(bytes,1,3);
System.out.println(str2);
//打印結(jié)果為bcd

字符串轉(zhuǎn)換為字節(jié)數(shù)組:

String str1 = "abc";
byte[] bytes1 = str1.getBytes();
System.out.println(Arrays.toString(bytes1));
//打印結(jié)果為:[97, 98, 99]

三、字符串的比較

有許多初學者會認為,“ == ”與equals比較的方式是相同的。其實有很大的區(qū)別。
對于兩個字符串用“ == ”比較,比較的是變量的引用。而String的equals方法比較的是兩個字符串的內(nèi)容。但此時又有個疑問:為什么每個定義字符串常量的是一個引用呢?這樣就牽扯到了字符串常量池。

1.字符串常量池

對于“池”這個概念,可能大家還是比較陌生的。比如數(shù)據(jù)連接池、線程池等等。那這些池的作用的干嘛的呢?是用來提高存儲效率的。顧名思義字符串常量池是用來存儲字符串常量的。字符串常量池中規(guī)定只要有了一個字符串常量就不再存儲相同的字符串了。從JDK1.8開始字符串常量池是在堆里的。它本質(zhì)上是一個哈希表(StringTable)是一個數(shù)組。存儲字符串常量是,會根據(jù)一個映射關(guān)系進行存儲,這個映射關(guān)系需要設計一個哈希函數(shù)。(因為字符串常量池是有關(guān)于JVM的,需要看其原碼才能真正了解字符串常量池是如何操作的,此處不深究其原理也不會影響我們判斷引用是否相同)。

字符串常量池中當存儲一個字符串常量時會在根據(jù)哈希函數(shù)計算的某一個位置處產(chǎn)生一個結(jié)點,結(jié)點是由哈希值、String結(jié)點的地址、存儲該數(shù)組位置處的下一個結(jié)點的地址組成的(這在JVM的原碼中才能真正了解)。而每一個String結(jié)點是由字符型數(shù)組value與哈希值hash(默認為0)構(gòu)成的 (下圖所示)。點入String看其原碼時就能夠會發(fā)現(xiàn)這兩個變量。此時觀察到value數(shù)組被final修飾則說明該數(shù)組里的字符是不能夠被改變的,這就是字符串是一個常量的原因,并且該字符串會轉(zhuǎn)換為字符形式存放在字符數(shù)組當中。

在這里插入圖片描述

先來舉一個比較簡單的例子來理解字符串常量池的內(nèi)存布局。
代碼如下:
代碼一:

String str1 = "hello";
String str2 = "hello";
System.out.println(str1==str2);
//打印結(jié)果為true

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

在這里插入圖片描述

代碼二:

String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1==str2);
//打印結(jié)果為false

在這里插入圖片描述

手動入池:
我們根據(jù)上圖知道了代碼二中的運行結(jié)果是false的,因為str2指向的是new String產(chǎn)生的String對象,而不是存儲“hello”的String對象的地址。如果寫為下面這個代碼,結(jié)果會是如何呢?

String str1 = "hello";
String str2 = new String("hello").intern();
System.out.println(str1==str2);
//運行結(jié)果為true

為什么最后的結(jié)果為true呢?此時調(diào)用了String類當中的intern方法,稱為手動入池,它能夠?qū)tr2的指向不再指向new出來的String對象,而是指向了字符串常量池當中已經(jīng)存儲有“hello”字符數(shù)組的String對象。

代碼三:

String str1 = "hello";
String str2 = "he"+"llo";
System.out.println(str1==str2);
//打印結(jié)果為true

此代碼有關(guān)字符串的拼接。其實“he”與“l(fā)lo”在編譯時期就已經(jīng)編譯為“hello”了。如果要看編譯時期str2是什么字符串,則此時我們先點擊Build選項,點入Build Project選項則進行編譯(圖1)??梢栽谠擃愇募穆窂剑ê?class文件)底下(圖2+圖3),按住shift鍵加右鍵點擊powershell窗口,輸入反編譯指令javap -c 類名則能看到編譯時str2是否是已經(jīng)拼接好的hello。

圖1:

在這里插入圖片描述

圖2:在該類的窗口處點擊鼠標右鍵

在這里插入圖片描述

圖三:退回上一個文件夾,點入out->prodection->字節(jié)碼文件所在的該文件夾名->按住shift點擊鼠標右鍵點入powershell窗口->輸入javap -c 類名

在這里插入圖片描述

代碼四:

String str1 = "11";
String str2 = new String("1")+new String("1");
System.out.println(str1==str2);
//運行結(jié)果為false

字符串的拼接會產(chǎn)生一個StringBuffer的類型,通過StringBuffer調(diào)用toString方法也轉(zhuǎn)變?yōu)镾tring類,此時拼接完后字符串“11”存儲在value中,但是不會存儲到字符串常量池當中。

通過反編譯我們看到的確拼接產(chǎn)生StringBuffer,并且StringBuffer調(diào)用toString方法產(chǎn)生一個String類的對象存儲“11”。由圖1、圖2可以完全了解。

圖1:

在這里插入圖片描述


圖2:

在這里插入圖片描述


圖3:

在這里插入圖片描述

2.字符串內(nèi)容比較

對于字符串比較,我們不能直接用“==”,而有三種方法能夠?qū)ψ址胁煌谋容^方式。

比較字符串內(nèi)容:直接調(diào)用String類的equals方法,將字符串放入括號當中比較。
比較字符串內(nèi)容(不分字母大小寫):調(diào)用String類的equalsIgnoreCase方法。

String str1 = "hello" ; 
String str2 = "Hello" ; 
System.out.println(str1.equals(str2)); // false 
System.out.println(str1.equalsIgnoreCase(str2)); // true

比較字符串中的大?。赫{(diào)用String類當中的compareTo方法。本來String類當中是沒有compareTo方法,只不過String類實現(xiàn)了Comparable接口,并且重寫了compareTo方法。

在這里插入圖片描述

它是一個字符一個字符進行比較的。如果str1大于str2則返回str1該字符減去str2該字符的值。例如:

代碼1:

String str1 = "abc";
String str2 = "bcd";
System.out.println(str1.compareTo(str2));
//運行結(jié)果為:-1

因為b的ASCII碼值比a的ASCII碼值大1,則直接返回-1。(如果是字符不相同則返回它們的ASCII碼差值)

代碼2:

String str1 = "bcdef";
String str2 = "bcd";
System.out.println(str1.compareTo(str2));
//運行結(jié)果為2

因為在str2比較結(jié)束前與str1的字符值是相同的。因此最后的結(jié)果是str1的長度減去str2的長度。

下面是String類的compareTo方法的實現(xiàn)。

在這里插入圖片描述

四、字符串查找

1.判斷一個子串是否存在于主串中:調(diào)用String類的contains方法,返回值為boolean。

String str = "abbabcacc";
boolean flg = str.contains("abc");
System.out.println(flg);
//打印結(jié)果為true

2.從頭開始查找一個子串,并返回第一個子串開始的索引位置,如果沒有,則返回-1。也可以傳入一個索引,代表是從哪個索引位置開始尋找,調(diào)用String類中的indexOf方法。

String str = "abbabcacc";
int index = str.indexOf("abc");
System.out.println(index);
//打印結(jié)果為3

3.從尾處開始尋找,查看主串中有無傳入的子串,若有則返回索引值,沒有則返回-1。調(diào)用String類的lastIndexOf,并且也可以傳入索引代表從哪個索引值從尾處尋找到頭處。調(diào)用String類的lastIndexOf
代碼1:

String str = "abbabcacc";
int index = str.lastIndexOf("ac");
System.out.println(index);
//打印結(jié)果為6

當我們要找的子串剛好被“切斷”時,它仍然會取到后面的字符返回子串開始的索引值,但是后面的字符的索引值不能取到。

代碼2:

String str = "abbabcacc";
int index = str.lastIndexOf("ac",6);
System.out.println(index);
//打印結(jié)果為6

4.判斷一個字符串是否以指定子串開頭,調(diào)用String類中的startsWith方法。也可以傳入索引值說明從指定位置開始判斷是否以指定子串開頭。

String str = "abbabcacc";
boolean flg = str.startsWith("abb");
System.out.println(flg);
//打印結(jié)果為true
String str = "abbabcacc";
boolean flg = str.startsWith("abb",3);
System.out.println(flg);
//打印結(jié)果為false

5.判斷一個字符串是否以指定子串結(jié)尾。調(diào)用String類當中的endsWith方法。

String str = "abbabcacc";
boolean flg = str.endsWith("acc");
System.out.println(flg);
//打印結(jié)果為true

五、字符串替換

1.替換字符串中的所有的指定內(nèi)容。調(diào)用String類當中的repalceAll方法。

String str = "helloworld" ; 
System.out.println(str.replaceAll("l", "_"));
//打印結(jié)果為he__owor_d

也可以選擇替換字符串中的首個內(nèi)容。調(diào)用String類中的repalceFirst方法。

System.out.println(str.replaceFirst("l", "_"));
//打印結(jié)果為he_loworld

由于字符串是不可變對象, 替換不修改當前字符串, 而是產(chǎn)生一個新的字符串。

六、字符串拆分

指定字符串在主串的基礎(chǔ)上能分為幾個組就等于分為幾個String類數(shù)組。因此可以通過foreach循環(huán)來遍歷拆分后的數(shù)組的內(nèi)容。調(diào)用String類的split方法。

String str = "hello world hello bit" ; 
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) { 
 System.out.println(s); 
}
//打印結(jié)果為

hello
world
hello
bit

split方法還能夠傳入一個limit參數(shù),代表拆分后最多分為幾個數(shù)組。如果拆分后數(shù)組的個數(shù)小于這個limit值則按原來拆分的數(shù)組的個數(shù)拆分,否則數(shù)組的個數(shù)不能夠超過limit值

String str = "hello world hello bit" ; 
String[] result = str.split(" ",2) ; 
for(String s: result) { 
 System.out.println(s); 
}
//打印結(jié)果為

hello
world hello bit

當然,對于字符串的拆分可以嵌套拆分,即先拆分為兩部分,再根據(jù)另一個字符串再拆分。

String str = "name=zhangsan&age=18";
String[] strings = str.split("&");
for (String s:strings) {
 String[] ss = s.split("=");
 for (String s1:ss) {
   System.out.println(s1);
 }
}
//打印結(jié)果為

name
zhangsan
age
18

對于字符串的拆分還有幾種特殊情況,當遇到需要拆分的為轉(zhuǎn)義字符時,傳入指定的字符串則需要傳多兩個斜杠。例如:

String str = "192.168.1.1";
String[] strings = str.split("\\.");
for (String s:strings) {
     System.out.println(s);
}
//打印結(jié)果為

192
168
1
1

因此需要注意的是:字符"|","*","+“都得加上轉(zhuǎn)義字符,前面加上”\\"。

對于字符串的拆分還可以根據(jù)多個指定的字符串進行拆分,指定的字符串之間用‘|'分隔。

String str = "Java30 12&21#hello";
String[] strings = str.split(" |&|#");
for (String s:strings) {
     System.out.println(s);
}
//打印結(jié)果為

Java30
12
21
hello

七、字符串截取

對于一個字符串的截取,傳入一個索引值代表是從哪個索引開始截取。傳入兩個索引值則代表截取的范圍。調(diào)用String類中的substring方法。例如:

String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));
//打印結(jié)果為

world
hello

注意:

  • 索引從0開始
  • 注意前閉后開區(qū)間的寫法, substring(0, 5) 表示包含 0 號下標的字符, 不包含 5 號下標

對于以上字符串操作的方法,我們可以查看其原碼能夠更好地了解該方法是如何進行操作的。

八、String類中其它的常用方法

1.String類的trim方法。這個方法是用來去掉字符串中左右兩邊空格,而字符串中間的空格是不會去掉的。
代碼:

String str = "  abc  def  ";
String s = str.trim();
System.out.println(s);
//打印結(jié)果為

abc def

2.String類中的toUpperCase和toLowerCase方法。toUpperCase是用來將字符串中的小寫字母轉(zhuǎn)變?yōu)榇髮懽帜福皇亲帜傅牟贿M行處理。toLowerCase方法是用來將字符串中的大寫字母轉(zhuǎn)變?yōu)閷憣懽帜福皇亲帜傅囊膊贿M行處理。

String str = " hello%$$%@#$%world 哈哈哈 " ; 
System.out.println(str.toUpperCase()); 
System.out.println(str.toLowerCase());
//打印結(jié)果為:

HELLO%$$%@#$%WORLD 哈哈哈
hello%$$%@#$%world 哈哈哈

3.String類中的concat方法。這個方法是用來連接字符串的,相當于字符串中的拼接,但是連接后的字符串不會入到字符串常量池當中。這里不再演示。

4.String類中的length方法。它是用來求字符串長度的,跟數(shù)組不一樣,數(shù)組中的length是數(shù)組的屬性,而String中的length是一個方法。
代碼:

String str = "abcd";
System.out.println(str.length());
//打印結(jié)果為4

5.String類中的isEmpty方法。是用來判斷字符串是否為空的。
代碼:

System.out.println("hello".isEmpty());//false
System.out.println("".isEmpty());//true
System.out.println(new String().isEmpty());//true

九、StringBuffer 和 StringBuilder

對上面String字符串常量池有了了解后,我們知道了String是常量,是不可變的。當拼接時,Java會在編譯期間將String類的對象拼接優(yōu)化為StringBuffer的拼接(不會產(chǎn)生新對象),因此Java中有StringBuffer和StringBuilder中處理字符串,并且它們拼接時不會產(chǎn)生新的對象,而是在原來的字符串基礎(chǔ)上拼接。后面我們再將StringBuilder和StringBuffer的區(qū)別。
StringBuilder中有一個append方法可以將字符串在原來的基礎(chǔ)上拼接。例如當我們有這樣的代碼時:

String str = "abc";
for (int i = 0; i < 10; i++) {
     str+=i;
}
System.out.println(str);
//打印結(jié)果:

abc0123456789

會在常量池中產(chǎn)生很多的臨時變量,例abc0會在字符串常量池中產(chǎn)生,abc01又會在字符串常量池中產(chǎn)生等等。如果我們用到StringBuilder的append方法時,可以寫為(兩種寫法最后的結(jié)果是相同的,只是StringBuilder處理時不會在字符串常量池中產(chǎn)生臨時變量):

StringBuilder stringBuilder = new StringBuilder("abc");
for (int i = 0; i < 10; i++) {
     stringBuilder.append(i);
}
System.out.println(stringBuilder);
//打印結(jié)果:

abc0123456789

打印時為什么能夠打印StringBuilde類型是因為StringBuilder中重寫了父類的toString方法,它能夠把StringBuilder類型轉(zhuǎn)變?yōu)镾tring類型進行打印。

append方法也可以連著使用。代碼如下:

public static void main(String[] args) { 
StringBuffer sb = new StringBuffer(); 
sb.append("Hello").append("World"); 
fun(sb); 
System.out.println(sb); 
}
//打印結(jié)果為

HelloWorld

因此:
String變?yōu)镾tringBuffer:利用StringBuffer的構(gòu)造方法或append()方法。
StringBuffer變?yōu)镾tring:調(diào)用toString()方法。

1.StringBuilder與StringBuffer的區(qū)別

StringBuilder與StringBuffer中的方法都是大致相同的。它們的主要區(qū)別就是StringBuilder主要是用于單線程的,而StringBuffer主要是用于多線程的。我們點入StringBuffer類當中按住ctrl+7選擇append方法看到如圖所示的synchronized英文,則代表是多線程使用的,而StringBuilder類中沒有。

在這里插入圖片描述

結(jié)論:

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

2.StringBuilder與StringBuffer常用的方法

StringBuilder與StringBuffer常用的方法一般String類當中都是沒有的,例如:append方法、delete方法、reserve方法、insert方法等。

reverse方法:

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.reverse());
//打印結(jié)果為

dlrowolleh

delete方法:

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10));
//打印結(jié)果為

hello

insert方法:

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10).insert(0, "你好"));
//打印結(jié)果為:

你好hello

十、對字符串引用的理解

許多人認為,如果傳一個引用到一個函數(shù)中指向了另一個對象,就能夠解決“所有問題”,其實不然,下面這個例子能夠說明問題。
代碼:

    public static void func(String str1,char[] chars) {
    str1="hello";
    chars[0]='g';
    }
    public static void main(String[] args) {
        String str = "abcd";
        char[] chars = {'h','e','l','l','o'};
        func(str,chars);
        System.out.println(str);
        System.out.println(Arrays.toString(chars));
    }
    //打印結(jié)果為 

abcd
[g, e, l, l, o]

結(jié)果為什么str沒有指向hello而chars而又還是改變的是原來那個hello的基礎(chǔ)上變?yōu)間ello呢?在我們學了字符串常量池后,了解到了字符串常量池只能存儲一個內(nèi)容相同的字符串常量。因此,傳入func函數(shù)當中str1是一個形參,是str1指向了新的對象“hello”,但是main函數(shù)中的str指向的還是abcd。而chars是真真正正地在原來數(shù)組的基礎(chǔ)上0下標的字符改為了‘g',最后打印的結(jié)果為[g, e, l, l, o]是沒有任何問題的。圖解如下:

在這里插入圖片描述

到此這篇關(guān)于詳解Java中String類的各種用法的文章就介紹到這了,更多相關(guān)Java String類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springmvc前臺向后臺傳值幾種方式總結(jié)(從簡單到復雜)

    springmvc前臺向后臺傳值幾種方式總結(jié)(從簡單到復雜)

    今天小編就為大家分享一篇springmvc前臺向后臺傳值幾種方式總結(jié)(從簡單到復雜),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • JavaWeb連接數(shù)據(jù)庫MySQL的操作技巧

    JavaWeb連接數(shù)據(jù)庫MySQL的操作技巧

    數(shù)據(jù)庫是編程中重要的一部分,它囊括了數(shù)據(jù)操作,數(shù)據(jù)持久化等各方面。在每一門編程語言中都占有相當大的比例。本次,小編以MySQL為例,使用mvc編程思想,給大家講解下javaweb對數(shù)據(jù)庫的操作
    2017-02-02
  • java判斷字符串是否為數(shù)字的方法小結(jié)

    java判斷字符串是否為數(shù)字的方法小結(jié)

    這篇文章主要介紹了java判斷字符串是否為數(shù)字的方法,分別講述了使用Java自帶函數(shù)、正則表達式及ascii碼三種方法進行字符串判斷的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Java中的base64編碼器

    Java中的base64編碼器

    這篇文章介紹了Java中的base64編碼器,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • java中通過行為參數(shù)化傳遞代碼方案

    java中通過行為參數(shù)化傳遞代碼方案

    大家好,本篇文章主要講的是java中通過行為參數(shù)化傳遞代碼方案,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • java 實現(xiàn)websocket的兩種方式實例詳解

    java 實現(xiàn)websocket的兩種方式實例詳解

    這篇文章主要介紹了java 實現(xiàn)websocket的兩種方式實例詳解,一種使用tomcat的websocket實現(xiàn),一種使用spring的websocket,本文通過代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • MyBatis映射器mapper快速入門教程

    MyBatis映射器mapper快速入門教程

    使用mapper接口的方式,不用寫接口實現(xiàn)類,直接完成數(shù)據(jù)庫操作,簡單方便。使用mapper接口,采用的是面向接口編程的思想,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • 一篇文章弄懂Mybatis中#和$的區(qū)別

    一篇文章弄懂Mybatis中#和$的區(qū)別

    mybatis為我們提供了兩種支持動態(tài)sql的語法#{}以及${},兩者都是動態(tài)的向sql語句中傳入需要的參數(shù),下面這篇文章主要給大家介紹了如何通過一篇文章弄懂Mybatis中#和$區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Java回調(diào)機制解讀

    Java回調(diào)機制解讀

    本文主要介紹了Java回調(diào)機制的相關(guān)知識,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java中final變量使用總結(jié)

    Java中final變量使用總結(jié)

    這篇文章主要介紹了Java中final變量使用總結(jié),final關(guān)鍵字可用于變量聲明,一旦該變量被設定,就不可以再改變該變量的值,通常final定義的變量為常量,需要的朋友可以參考下
    2015-06-06

最新評論