




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章數(shù)組、字符串與類型新特性遼寧機(jī)電職業(yè)技術(shù)學(xué)院信息工程系軟件教研室遲勇回顧創(chuàng)建包mypackage.mywork,在包中創(chuàng)建類Welcome添加一個(gè)方法sayHello(),提示輸入姓名,然后輸出“××,歡迎你!”添加JavaDoc注釋publicvoidsayHello(){Scannerinput=newScanner(System.in);System.out.print("你叫什么?");Stringname=input.next();System.out.println(name+",你好!");}參考代碼本章學(xué)習(xí)任務(wù)使用數(shù)組生成一個(gè)隨機(jī)整數(shù)數(shù)列,并排序隨機(jī)生成數(shù)組成員長(zhǎng)度不同的二維數(shù)組數(shù)組的各種快速操作字符串的各種操作方法以及String數(shù)據(jù)類型的轉(zhuǎn)換使用StringTokenizer類完成字符串分析了解其他的JDK數(shù)據(jù)特性(泛型、自動(dòng)裝箱和自動(dòng)拆箱、類型安全的枚舉、集合框架、Lambda表達(dá)式)本章技能目標(biāo)掌握數(shù)組的定義,創(chuàng)建,初始化和賦值的語(yǔ)法了解字符串類String與StringBuffer類的區(qū)別掌握StringTokenizer類的用法熟練掌握J(rèn)ava集合框架預(yù)習(xí)檢查(1)--預(yù)習(xí)新單詞單詞釋義單詞釋義ArrayElementStringBufferTokenizerBoxing預(yù)習(xí)檢查(2)說(shuō)說(shuō)下面的語(yǔ)法哪個(gè)是數(shù)組的定義,創(chuàng)建,初始化或賦值?int[]a;int[]a=newint[3];int[]a=newint[]{1,2,3};int[]a={1,2,3};a[0]=1;簡(jiǎn)述String類與StringBuffer類的區(qū)別。數(shù)組、字符串與類型新特性-內(nèi)容目錄數(shù)組字符串泛型自動(dòng)裝箱與自動(dòng)拆箱類型安全的枚舉集合框架Lambda表達(dá)式7.1數(shù)組(Array)數(shù)組是相同類型變量的集合這些變量具有相同的標(biāo)識(shí)符即數(shù)組名,數(shù)組中的每個(gè)變量稱為數(shù)組的元素或成員(ArrayElement)。為了引用數(shù)組中的特定員,使用數(shù)組名加中括號(hào)“[]”擴(kuò)起來(lái)的整型表達(dá)式,該表達(dá)式稱為數(shù)組的索引(index)或下標(biāo)。對(duì)于一個(gè)數(shù)組a,假如它的下標(biāo)為10,則它的成員分別為a[0]~a[9]。Java中的數(shù)組和字符串都是復(fù)合數(shù)據(jù)類型因而同其他語(yǔ)言中使用的數(shù)組和字符串有一些區(qū)別。在Java中,數(shù)組必須通過(guò)創(chuàng)建數(shù)組類對(duì)象的方式使用數(shù)組,例如:
int[]a=newint[10];7.1.1數(shù)組的定義Java一維數(shù)組的定義格式有兩種:
數(shù)據(jù)類型數(shù)組名[];
或:
數(shù)據(jù)類型[]數(shù)組名;其中數(shù)據(jù)類型為Java中的任意數(shù)據(jù)類型,可以是基本數(shù)據(jù)類型或符合數(shù)據(jù)類型,數(shù)組名須為合法標(biāo)識(shí)符,如:
inta[]; String[]name;
7.1.2數(shù)組的創(chuàng)建創(chuàng)建數(shù)組指的是為數(shù)組分配內(nèi)存空間的過(guò)程。創(chuàng)建數(shù)組的格式為:數(shù)組名=new數(shù)據(jù)類型[下標(biāo)];也可以定義的同時(shí)創(chuàng)建,格式為:數(shù)據(jù)類型[]數(shù)組名=new數(shù)據(jù)類型[下標(biāo)];
或:數(shù)據(jù)類型數(shù)組名[]=new數(shù)據(jù)類型[下標(biāo)];例如:inta[];a=newint[3];//為數(shù)組a分配了3個(gè)int型的內(nèi)存空間7.1.3數(shù)組的初始化-11、數(shù)組成員默認(rèn)初始化的默認(rèn)值 變量可以分為兩類:全局變量和局部變量。 當(dāng)全局變量不賦值時(shí),它是有默認(rèn)值的(見表2-4); 而局部變量則必須賦值后使用,它沒有默認(rèn)值。 但是對(duì)于引用類型(如:數(shù)組和字符串)例外,它們即使用作局部變量也有默認(rèn)值,默認(rèn)值與全局變量的規(guī)則相同。例如:1)如果數(shù)組的成員是基本數(shù)據(jù)類型,其默認(rèn)值規(guī)則見表2-4;2)如果數(shù)組的成員是類類型,其默認(rèn)值為null。數(shù)組的初始化-22、定義的同時(shí)進(jìn)行初始化格式為:數(shù)據(jù)類型[]數(shù)組名=new數(shù)據(jù)類型[]{成員初值列表};或:數(shù)據(jù)類型[]數(shù)組名={成員初值列表};例如:
Stringname1[]=newString[]{"tom","marry","john"};//不能在newString[]中加下標(biāo)
Stringname2[]={"tom","marry","john"};1)注意第一種格式,不能在new數(shù)據(jù)類型[]的方括號(hào)中加入下標(biāo)。2)這種初始化的方法適用于數(shù)組成員個(gè)數(shù)不多的情況。7.1.4數(shù)組的賦值如果在定義數(shù)組并創(chuàng)建的同時(shí)沒有進(jìn)行初始化操作,之后再對(duì)數(shù)組成員賦數(shù)據(jù)則稱為賦值,基本格式為:數(shù)組名[成員下標(biāo)]=值;1. 對(duì)數(shù)組成員賦值:2.?dāng)?shù)組間的復(fù)制:如果想把已有的數(shù)組快速?gòu)?fù)制到另一個(gè)數(shù)組,可以使用如下格式: inta[]={1,2,3}; intb[]=a;例如: inta[]=newint[3]; a[0]=1; a[1]=2; a[2]=3; 如果是有規(guī)律的值,也可以使用循環(huán)賦值,例如: inta[]=newint[3]; for(inti=0;i<3;i++) { a[i]=i; }7.1.5一維數(shù)組示例:7-1publicclassArraySort{ publicstaticvoidmain(Stringargs[]){ System.out.println("輸入要排序數(shù)列的數(shù)的個(gè)數(shù):"); intlen=Integer.parseInt(args[0]); inta[]=newint[len]; System.out.println("成員個(gè)數(shù)為"+len); for(inti=0;i<len;i++){ a[i]=(int)(Math.random()*20); } System.out.println("顯示數(shù)組值:"); for(inti=0;i<len;i++){例7-1:生成一個(gè)隨機(jī)整數(shù)數(shù)列,并排序一維數(shù)組示例-2System.out.print(a[i]+""); } System.out.println(""); for(inti=0;i<len;i++)//排序
{ for(intj=i+1;j<len;j++){ if(a[i]<a[j]){ inttemp=a[i]; a[i]=a[j]; a[j]=temp; } } } System.out.println("顯示排序后數(shù)組值:"); for(inti=0;i<len;i++)一維數(shù)組示例-3
{ System.out.print(a[i]+""); } System.out.println("");}}遼寧機(jī)電職業(yè)技術(shù)學(xué)院【運(yùn)行結(jié)果】在DOS控制臺(tái)輸入>javaArraySort57.1.6多維數(shù)組
Java中的二維數(shù)組是由多個(gè)一維數(shù)組構(gòu)成,每個(gè)一維數(shù)組就是這個(gè)二維數(shù)組的成員,且作為成員的一維數(shù)組的長(zhǎng)度可以不同inta[][]=newint[][]{{1,2},{3,4},{5,6}};
但與C++等語(yǔ)言不同,二維數(shù)組與一維數(shù)組之間不能相互轉(zhuǎn)換。三維以上數(shù)組的原理與二維數(shù)組相同
a[0][0]=1a[0][1]=2a[1][0]=3a[1][1]=4a[2][0]=5a[2][1]=6a[0]a[1]a[2]二維數(shù)組定義,創(chuàng)建及初始化例如:定義一個(gè)有int型二維數(shù)組a定義格式為:inta[][];創(chuàng)建格式為:a[][]=newint[3][2];定義,創(chuàng)建并初始化格式為: inta[][]=newint[][]{{1,2},{3,4},{5,6}};或 inta[][]={{1,2},{3,4},{5,6}};維數(shù)組書寫格式二維數(shù)組書寫的一些正確格式:inta[][]=newint[3][]; //正確,表示二維數(shù)組a由3個(gè)一維數(shù)組構(gòu)成int[]a[]=newint[3][2]; //正確,前面的方括號(hào)[]代表數(shù)組,而這個(gè)數(shù)組是由多個(gè)一維數(shù)組a[]構(gòu)成,每個(gè)一維數(shù)組又包含兩個(gè)int型成員int[][]a=newint[3][2]; //數(shù)組的方括號(hào)標(biāo)記[]可以放在數(shù)組名前面二維數(shù)組書寫的一些錯(cuò)誤格式:inta[][]=newint[3][2]{{1,2},{3,4},{5,6}}; //數(shù)組創(chuàng)建時(shí)不能有下標(biāo)inta[][]=newint[][3]{1,2,3,4,5,6}; //不要試圖像C++那樣定義數(shù)組,多維數(shù)組與一維數(shù)組之間不能相互轉(zhuǎn)換inta[][]=newint[3][];a={{1,2},{3,4},{5,6}};//錯(cuò),二維數(shù)組不能這樣賦值7.1.6二維數(shù)組示例:7-2publicclassStudent{publicstaticvoidmain(String[]args){ int[][]a=newint[3][];//假設(shè)學(xué)校有3個(gè)年級(jí) for(inti=0;i<a.length;i++) {//每個(gè)年級(jí)的班級(jí)數(shù)在0~10之間 intdata=(int)(10*Math.random()); a[i]=newint[data];// System.out.println("***第"+(i+1)+"年級(jí)有"+a[i].length+"個(gè)班級(jí)。***");
例7-2:隨機(jī)生成數(shù)組成員長(zhǎng)度不同的二維數(shù)組,完成學(xué)校各年級(jí)和班級(jí)學(xué)生人數(shù)的賦值。二維數(shù)組示例-2 for(intj=0;j<data;j++) {//讓每個(gè)班的學(xué)生數(shù)在25~30之間 a[i][j]=(int)(5*Math.random()+25); System.out.print((j+1)+"班有"+a[i][j]+"個(gè)學(xué)生。"); } System.out.print("\n"); }}}【運(yùn)行結(jié)果】***第1年級(jí)有1個(gè)班級(jí)。***1班有28個(gè)學(xué)生。***第2年級(jí)有3個(gè)班級(jí)。***1班有27個(gè)學(xué)生。2班有27個(gè)學(xué)生。3班有26個(gè)學(xué)生。***第3年級(jí)有0個(gè)班級(jí)。***7.1.7數(shù)組的快速操作數(shù)組排序java.util.Arrays中常用的方法sort()可以對(duì)數(shù)組中的數(shù)字進(jìn)行排序,語(yǔ)法格式為:staticvoidsort(數(shù)據(jù)類型[]array)
7-3:數(shù)組排序7-4:數(shù)組拷貝實(shí)例1數(shù)組拷貝用System類的arraycopy()方法,可以實(shí)現(xiàn)一個(gè)數(shù)組的拷貝,其語(yǔ)法如下:System.arraycopy(fromArray,formIndex,toArray,toIndex,count);數(shù)組、字符串與類型新特性-內(nèi)容目錄數(shù)組字符串泛型自動(dòng)裝箱與自動(dòng)拆箱類型安全的枚舉集合框架Lambda表達(dá)式7.2 字符串(String)字符串是由多個(gè)字符構(gòu)成的序列,其結(jié)束標(biāo)志是“\0”。但需要注意,Java中的字符串String與字符數(shù)組無(wú)關(guān)。Java把字符串當(dāng)作類處理,并提供了一些字符串的操作方法,使字符串處理更簡(jiǎn)單。另外,java.lang包中還封裝了StringBuffer類用于提高字符串的處理效率。java.util包中提供了StringTokenizer類用于分析字符串,從而得到我們想要的信息。StringStringBufferStringTokenizer三個(gè)重要類7.2.1接下來(lái)我們將要學(xué)習(xí)1.
創(chuàng)建字符串變量2.
String的比較方法3.
String類的其它方法4.String類的數(shù)據(jù)類型轉(zhuǎn)換創(chuàng)建字符串變量可以將一個(gè)字符串常量直接賦給一個(gè)字符串變量,如:Stringname=”tom”;String類的常用構(gòu)造方法如下:String();初始化一個(gè)新創(chuàng)建的String對(duì)象,它表示一個(gè)空串String(byte[]
bytes);使用平臺(tái)的默認(rèn)字符集解碼指定的字節(jié)數(shù)組來(lái)構(gòu)造一個(gè)新StringString(char[]
value);使用當(dāng)前字符數(shù)組中包含的字符序列來(lái)構(gòu)造一個(gè)新的StringString(char[]
value,int
offset,int
count);構(gòu)造一個(gè)新的String,它包含來(lái)自該字符數(shù)組的部分字符序列,序列起始位置為offset,大小為countString(StringBuffer
buffer);構(gòu)造一個(gè)新的String,它包含當(dāng)前在字符串緩沖類對(duì)象中的字符序列創(chuàng)建字符串示例publicclassCreateString{publicstaticvoidmain(String[]args){ charchs[]={'wv,'e','l','c','o','m','e',',','t','o','m'}; bytebs[]={97,98,99,100}; Strings1=newString(chs); Strings2=newString(bs); Strings3=newString(chs,8,3); System.out.println("s1的值是:"+s1); System.out.println("s2的值是:"+s2); System.out.println("s3的值是:"+s3);} }例7-6【運(yùn)行結(jié)果】s1的值是:welcome,toms2的值是:abcds3的值是:tomString的比較比較兩個(gè)字符串的大小可以用恒等號(hào)(==)equals()equalsIgnoreCase()等方法來(lái)比較是否相同也可以用compareTo()方法來(lái)逐字節(jié)比較大小。String的比較實(shí)例-1publicclassCompareString{publicstaticvoidmain(String[]args){ Strings1="tom"; Strings2=newString("tom"); Strings3=s1; Strings4=newString("tom"); Strings5=newString("Tom"); if(s1==s2)//false System.out.println("s1==s2"); if(s1==s3)//true System.out.println("s1==s3");
例7-7if(s2==s4)//false System.out.println("s2==s4"); if(s2.equals(s4))//true System.out.println("s2.equals(s4)"); System.out.println(pareTo(s4));//返回0 if(s2.equalsIgnoreCase(s5))//true System.out.println("s2.equalsIgnoreCase(s5)");}}
【運(yùn)行結(jié)果】s1==s3s2.equals(s4)0s2.equalsIgnoreCase(s5)String類的其它方法常用的字符串類的方法有:
length()、charAt()、concat()、getBytes()、getChars()、indexOf()、replace(),、substring()、toCharArray()、valueOf()等方法的功能,請(qǐng)查看JDKAPIDocument
!注意:因?yàn)闉E用運(yùn)算符重載會(huì)降低程序的可讀性,除String類型的"+"號(hào)運(yùn)算符重載之外,Java語(yǔ)言不支持其它運(yùn)算符重載。
字符串String類的方法示例-1publicclassStringMethod{publicstaticvoidmain(String[]args){ Strings="Thisisteststring!"; System.out.println("原字符串為:"+s); System.out.println("s.length()為:"+s.length()); System.out.println("s.charAt(8)為:"+s.charAt(8)); System.out.println("s.indexOf('t')為:"+s.indexOf('t')); System.out.println("s.lastIndexOf('t')為:"+s.lastIndexOf('t'));System.out.println("s.substring(8,12)為:"+s.substring(8,12));System.out.println("\"hello,\".concat(s)為:"+"hello,".concat(s)); char[]chs=newchar[20];例7-8StringMethod.java程序代碼字符串String類的方法示例-2 s.getChars(8,12,chs,0); System.out.print("chs為:"); for(inti=0;i<chs.length;i++) { System.out.print(chs[i]); } System.out.println("\nEnd");}}【運(yùn)行結(jié)果】原字符串為:Thisisteststring!s.length()為:20s.charAt(8)為:ts.indexOf('t')為:8s.lastIndexOf('t')為:14s.substring(8,12)為:test"hello,".concat(s)為:hello,Thisisteststring!chs為:testEndString類的數(shù)據(jù)類型轉(zhuǎn)換String類的數(shù)據(jù)類型轉(zhuǎn)換涉及兩種情況: 1)String類型轉(zhuǎn)換為其它數(shù)據(jù)類型:有兩種方法:使用對(duì)應(yīng)包裝類的parseXXX(String)方法使用對(duì)應(yīng)包裝類的valueOf(String)方法得到此包裝類的實(shí)例,再調(diào)用XXXValue()方法得到想要的數(shù)據(jù)例如:Integer.parseInt("123456");Double.valueOf("123456.00").doubleValue();2)其它數(shù)據(jù)類型轉(zhuǎn)換為String類型:使用String類的valueOf()方法即可,例如:String.valueOf(123456.00);String數(shù)據(jù)類型的轉(zhuǎn)換示例-1publicclassStringTransform{publicstaticvoidmain(String[]args){ inta1=Integer.parseInt("123"); inta2=Integer.parseInt("456"); System.out.println(a1+a2); floatf1=Float.valueOf("12.34").floatValue(); floatf2=Float.valueOf("56.76").floatValue(); System.out.println(f1+f2); doubled1=Double.valueOf("12.34").doubleValue(); doubled2=Double.valueOf("56.76").doubleValue(); System.out.println(d1+d2);例7-9StringTransform.java程序代碼String數(shù)據(jù)類型的轉(zhuǎn)換示例-1 Strings1=String.valueOf("12.34F"); Strings2=String.valueOf("56.76D"); System.out.println(s1+s2);}}【運(yùn)行結(jié)果】57969.169.112.34F56.76D【代碼說(shuō)明】代碼第16行,s1+s2為String類型的“+”號(hào)運(yùn)算符重載,功能是將兩個(gè)字符串連接在一起。7.2.2StringBuffer創(chuàng)建StringBuffer字符串用new運(yùn)算符創(chuàng)建StringBuffer類的方法length()charAt()concat()此外還提供了:capacity()append()insert()與String類之間的異同點(diǎn)相同點(diǎn):都可以操作字符串,而且都是final類,就是說(shuō)它們都不能被繼承不同點(diǎn):String類是不變字符串(immutable)與String類相比,StringBuffer類的實(shí)例是可變字符串,且可利用緩沖區(qū)String類的不可變性(immutable)-1假設(shè)有:Strings1="tom";Strings2=s1;&tom&s1&s1變量s1變量s2字符串池&tomtom……問題:現(xiàn)在改變s2的值: s2="marry";此時(shí)s2的值為"marry",那么s1的值是什么呢?答案:s1的值仍然為"tom"!String類的不可變性(immutable)-2原因是:雖然s1與s2有引用的關(guān)系,但字符串是immutable的,就是說(shuō),一旦被賦值,s1指向的內(nèi)存空間的數(shù)據(jù)就永遠(yuǎn)不可改變,其結(jié)果如圖所示:s2重新指向了“marry”的內(nèi)存空間,所以s1的值并未發(fā)生改變&tom變量s1&marry變量s2字符串池&tomtom……marry7.2.3StringTokenizer
類StringTokenizer是字符串分析類StringTokenizer類的構(gòu)造方法為:StringTokenizer(Strings,Stringdelim);以參數(shù)dilim的字符被作為分析符,分析字符串s,分析結(jié)果的子段都存儲(chǔ)在StringTokenizer類實(shí)例中。StringTokenizer類的常用方法:nextToken()方法:返回此StringTokenizer實(shí)例的下一個(gè)子段hasMoreTokens()方法:
測(cè)試此StringTokenizer實(shí)例中是否還有可用子段countTokens()方法:計(jì)算此StringTokenizer實(shí)例的子段的個(gè)數(shù)使用StringTokenizer類完成字符串分析importjava.util.*;//StringTokenizer在util包中publicclassStringTokenizerDemo{publicstaticvoidmain(String[]args){ Stringwelcome="Welcomelogin126.comE_mail!"; Stringe_mail="cy_java@126.com";/*以空格和"."為分析符,分析字符串welcome*/ StringTokenizerst1=newStringTokenizer(welcome,".");/*以@號(hào)為分析符*/ StringTokenizerst2=newStringTokenizer(e_mail,"@"); String[]con=newString[2]; inti=0;例7-10StringTokenizer.java程序代碼使用StringTokenizer類完成字符串分析 while(st1.hasMoreTokens())//判斷是否有子段 { Strings=st1.nextToken();//將分析實(shí)例st1的下一個(gè)子段取出 System.out.print(s+"#"); } while(st2.hasMoreTokens()) { con[i]=st2.nextToken(); i++; } System.out.println("\nyourE_mailis:"+e_mail); System.out.println("yourusernameis:"+con[0]); System.out.println("yourdomain_nameis:"+con[1]);}}使用StringTokenizer類完成字符串分析【代碼說(shuō)明】1)代碼第9行,以空格和'.'為分析符來(lái)分析,當(dāng)需要多個(gè)分析符的時(shí)候,可以把它們連續(xù)寫在參數(shù)delim的位置,中間不需要用空格或其它字符分隔。2)代碼第14,19行,hasMoreTokens()返回布爾值,判斷st1中是否有分析出的子段,如果有可用子段返回true。3)代碼第16,21行,nextToken()返回String值,取出記錄指針當(dāng)前子段,再將指針移到下一子段位置?!具\(yùn)行結(jié)果】Welcome#login#126#com#E_mail!#yourE_mailis:cy_java@126.com yourusernameis:cy_javayourdomain_nameis:126.com數(shù)組、字符串與類型新特性-內(nèi)容目錄數(shù)組字符串泛型自動(dòng)裝箱與自動(dòng)拆箱類型安全的枚舉集合框架Lambda表達(dá)式7.3泛型泛型的本質(zhì)是參數(shù)化類型,也就是說(shuō)所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。Java語(yǔ)言引入泛型的好處是安全簡(jiǎn)單。泛型增強(qiáng)了java的類型安全,可以在編譯期間對(duì)容器內(nèi)的對(duì)象進(jìn)行類型檢查。沒有泛型的情況的下,通過(guò)對(duì)類型Object的引用來(lái)實(shí)現(xiàn)參數(shù)的“任意化”(即“多態(tài)”),“任意化”帶來(lái)的缺點(diǎn)是要做顯式的強(qiáng)制類型轉(zhuǎn)換,而這種轉(zhuǎn)換是要求開發(fā)者對(duì)實(shí)際參數(shù)類型可以預(yù)知的情況下進(jìn)行的。對(duì)于強(qiáng)制類型轉(zhuǎn)換錯(cuò)誤的情況,編譯器可能不提示錯(cuò)誤,在運(yùn)行的時(shí)候才出現(xiàn)異常,這是一個(gè)安全隱患。不使用泛型的示例-1publicclassGenericDemo{publicstaticvoidmain(String[]args){ MyGenericgeneric1=newMyGeneric(newInteger(3)); generic1.showType(); intvalue1=(Integer)generic1.object;//JDK5之后增加的新特性,拆箱 System.out.println("===值為:"+value1); MyGenericgeneric2=newMyGeneric(newString("hello,thisisstring")); generic2.showType(); Stringvalue2=(String)generic2.object;//強(qiáng)制類型轉(zhuǎn)換 System.out.println("===值為:"+value2); }}例7-11GenericDemo.java程序代碼不使用泛型的示例-2classMyGeneric{ publicObjectobject; publicMyGeneric(Objectobj){ this.object=obj; } publicvoidshowType(){ System.out.println("T的數(shù)據(jù)類型是:"+object.getClass().getName()); } 【運(yùn)行結(jié)果】T的數(shù)據(jù)類型是:java.lang.Integer===值為:3T的數(shù)據(jù)類型是:java.lang.String===值為:hello,thisisstring【代碼說(shuō)明】①代碼第13行的類MyGeneric是被調(diào)用類,其構(gòu)造方法MyGeneric(Objectobj)(代碼第15行)中的參數(shù)使用了終極父類Object,以實(shí)現(xiàn)多態(tài)的效果;②代碼第19行的代碼,可以輸出成員object的數(shù)據(jù)類型;③代碼第5行,右側(cè)為Integer類型的返回值,可以直接賦值給左側(cè)的int型變量,這是在JDK5之后增加的新特性,叫做“拆箱”(詳見7.4節(jié)的介紹)。
數(shù)組、字符串與類型新特性-內(nèi)容目錄數(shù)組字符串泛型自動(dòng)裝箱與自動(dòng)拆箱類型安全的枚舉集合框架Lambda表達(dá)式7.4自動(dòng)裝箱和自動(dòng)拆箱基本數(shù)據(jù)(Primitive)類型的自動(dòng)裝箱(autoboxing)、拆箱(unboxing)是自J2SE5.0開始提供的功能。簡(jiǎn)單來(lái)說(shuō),裝箱就是將基本數(shù)據(jù)(Primitive)類型包裝為包裝類(WrapperClass)類型的操作,反之,則稱為“拆箱”。例如,在J2SE5.0之前,要使用以下語(yǔ)句才能將int包裝為一個(gè)Integer對(duì)象:Integerinteger=newInteger(10);而在J2SE5.0之后提供了”裝箱”的功能,您可以直接使用以下語(yǔ)句來(lái)打包基本數(shù)據(jù)類型:Integerinteger=10;7.4自動(dòng)裝箱和自動(dòng)拆箱同樣的動(dòng)作可以適用于boolean、byte、short、char、long、float、double等基本數(shù)據(jù)類型,分別會(huì)使用對(duì)應(yīng)的包裝類(WrapperClass)類型Boolean、Byte、Short、Character、Long、Float或Double。而“拆箱”,也就是將對(duì)象中的基本數(shù)據(jù)從對(duì)象中自動(dòng)取出,還原為基本數(shù)據(jù)類型。例如:IntegermyInteger=10;//裝箱intmyInt=myInteger;//拆箱數(shù)組、字符串與類型新特性-內(nèi)容目錄數(shù)組字符串泛型自動(dòng)裝箱與自動(dòng)拆箱類型安全的枚舉集合框架Lambda表達(dá)式7.5類型安全的枚舉在J2SE5.0中引入的類型安全枚舉的用法之前,我們知道,在C中,我們可以定義枚舉類型來(lái)使用別名代替一個(gè)集合中的不同元素,通常是用于描述那些可以歸為一類,而又有限數(shù)量的類別或者概念,如一周的每一天、月份、顏色、四則運(yùn)算、五大洲、四大洋、季節(jié)等。它們通??瓷先ナ沁@個(gè)樣子:typedefenum{SPRING,SUMMER,AUTUMN,WINTER}season;實(shí)質(zhì)上,這些別名被處理成int常量,比如0代表SPRING,1代表SUMMER,以此類推Java一開始并沒有考慮引入枚舉的概念,也許是出于維護(hù)Java語(yǔ)言簡(jiǎn)潔的考慮。對(duì)于描述簡(jiǎn)單的同類元素,Java采取了使用靜態(tài)常量(staticfinal)的方式完成,例如描述顏色,java.awt.Color類中的顏色值可以使用Color.Red來(lái)表示,實(shí)際上它是一個(gè)staticfinalColor型值。隨著程序開發(fā)者對(duì)枚舉的需求的增加,在J2SE5.0中,Sun引入了類型安全枚舉。下面是一個(gè)經(jīng)典的使用枚舉的例子:使用枚舉的實(shí)例-1publicenumOperation{ PLUS{doubleeval(doublex,doubley){returnx+y;}}, MINUS{doubleeval(doublex,doubley){returnx-y;}}, MULTIPLY{doubleeval(doublex,doubley){returnx*y;}}, DIVIDE{doubleeval(doublex,doubley){returnx/y;}}; abstractdoubleeval(doublex,doubley);
publicstaticvoidmain(Stringargs[]){ doublex=3,y=5; for(Operationop:Operation.values()){
System.out.println(x+""+op+""+y+"="op.eval(x,y));
} }}例7-13Operation.java程序代碼使用枚舉的實(shí)例-2【運(yùn)行結(jié)果】3.0PLUS5.0=8.03.0MINUS5.0=-2.03.0MULTIPLY5.0=15.03.0DIVIDE5.0=0.6【代碼說(shuō)明】①?gòu)哪撤N意義上講,enum關(guān)鍵字其實(shí)就是代表了一種新的類型的class,因?yàn)閺谋举|(zhì)上看,它就是一個(gè)類,而且是一個(gè)抽象類(AbstractClass),而四個(gè)枚舉項(xiàng)可以理解為它的四個(gè)子類,都分別實(shí)現(xiàn)了父類的抽象方法eval(doublex,doubley),如代碼第6行;②對(duì)于每一個(gè)枚舉類,都可以調(diào)用公用的方法,如values(),它返回一個(gè)包含了所有枚舉項(xiàng)的數(shù)組,見代碼第9行;另外,J2SE5.0的枚舉中,所有枚舉項(xiàng)都自動(dòng)默認(rèn)為static,也能夠調(diào)用基本的對(duì)象方法,如toString()。
數(shù)組、字符串與類型新特性-內(nèi)容目錄數(shù)組字符串泛型自動(dòng)裝箱與自動(dòng)拆箱類型安全的枚舉集合框架Lambda表達(dá)式7.6集合框架當(dāng)需要存儲(chǔ)類型相同且數(shù)量固定的數(shù)據(jù)時(shí),可以選擇數(shù)組,比如,存儲(chǔ)1~100之間的連續(xù)整數(shù)。但在實(shí)際編程中,我們會(huì)遇到很多復(fù)雜的情況,比如一個(gè)新聞網(wǎng)站每天動(dòng)態(tài)存儲(chǔ)和顯示新聞信息,每天的新聞數(shù)量動(dòng)態(tài)更新,無(wú)法確定新聞的條數(shù),因此就無(wú)法使用數(shù)組來(lái)存儲(chǔ);再比如,出版社的圖書管理系統(tǒng)有時(shí)候可能需要通過(guò)輸入圖書的ISBN號(hào)碼來(lái)獲取該本圖書的其它信息,這顯然也無(wú)法用數(shù)組來(lái)完成。Java為我們提供了一套處理復(fù)雜數(shù)據(jù)存儲(chǔ)問題的API,這就是Java集合框架,它包含了一套性能優(yōu)良,使用便捷的類和接口。Java的集合框架由三部分構(gòu)成:接口、接口的具體實(shí)現(xiàn)類、算法。集合框架結(jié)構(gòu)圖7.6.2ArrayList類例7-14:學(xué)生信息類StudentInfo.javapublicclassStudentInfo{ intid;//學(xué)號(hào) Stringname;//姓名 Stringtel;//聯(lián)系電話 publicStudentInfo(intid,Stringname,Stringtel){//自定義構(gòu)造 this.id=id; =name; this.tel=tel;
}… publicStringtoString(){//重寫繼承自O(shè)bject類的toString()方法 returnname+"的聯(lián)系電話是:"+tel; } }7.6.2ArrayList類例7-15:測(cè)試ArrayList的添加與獲取TestArrayList.java程序代碼importjava.util.ArrayList;importjava.util.List;publicclassTestArrayList{ publicstaticvoidprintInfo(ListarrList){//打印輸出指定列表的內(nèi)容 for(inti=0;i<arrList.size();i++){ StudentInfostu=(StudentInfo)arrList.get(i); System.out.println("學(xué)號(hào):"+stu.getId()+";姓名:"+stu.getName()+";電話號(hào)碼:"+stu.getTel()); } }
publicstaticvoidmain(String[]args){ StudentInfostu01=newStudentInfo(1,"張華","1111111");//創(chuàng)建對(duì)象 StudentInfostu02=newStudentInfo(2,"李平","2222222"); StudentInfostu03=newStudentInfo(3,"王杰","3333333");
ListstuList=newArrayList();//創(chuàng)建列表對(duì)象
stuList.add(stu01);//將StudentInfo對(duì)象添加到列表中 stuList.add(stu02); stuList.add(stu03);
printInfo(stuList);//打印列表信息 System.out.println(“總?cè)藬?shù)為:"+stuList.size()+"人");}}7.6.2List接口中定義的常用方法返回值方法說(shuō)明booleanadd(Objectobj)向列表的尾部添加指定的元素voidadd(intindex,Objectobj)在列表的指定位置插入指定元素Objectget(intindex)返回列表中指定位置的元素intsize()返回列表中的元素?cái)?shù)booleanremove(Objectobj)從列表中移除第一次出現(xiàn)的指定元素booleanremove(intindex)移除列表中指定位置的元素booleancontains(Objectobj)如果列表包含指定的元素,則返回trueIteratoriterator()返回列表元素按適當(dāng)順序存放的迭代器形式Object[]toArray()返回按適當(dāng)順序包含在列表中的所有元素的數(shù)組形式7.6.3LinkedList類例7-16:測(cè)試ArrayList,在指定位置插入和刪除TestArrayList02.java程序代碼publicclassTestArrayList02{ publicstaticvoidprintInfo(ListarrList){//打印輸出指定列表的內(nèi)容 for(inti=0;i<arrList.size();i++){ StudentInfostu=(StudentInfo)arrList.get(i); System.out.println("學(xué)號(hào):"+stu.getId()+";姓名:"+stu.getName()+";電話號(hào)碼:"+stu.getTel()); } }publicstaticvoidmain(String[]args){ StudentInfostu01=newStudentInfo(1,"張華","1111111");
… ListstuList=newArrayList(); stuList.add(stu01); … //創(chuàng)建并添加新同學(xué) StudentInfostu04=newStudentInfo(4,"陳波","4444444"); stuList.add(2,stu04);//在索引位置2(即第3個(gè))的位置添加
printInfo(stuList); if(stuList.contains(stu04)){//判斷是否有stu04同學(xué) … } //stuList.remove(1);//在索引1的位置刪除stu02同學(xué)
}}7.6.2LinkedList類例7-17:測(cè)試LinkedList,在集合首尾位置插入和刪除TestLinkedList.java程序代碼publicclassTestLinkedList{ publicstaticvoidprintInfo(Listlist){ for(inti=0;i<list.size();i++){ StudentInfostu=(StudentInfo)list.get(i); System.out.println("學(xué)號(hào):"+stu.getId()+";姓名:"+stu.getName()+";電話號(hào)碼:"+stu.getTel()); } }publicstaticvoidmain(String[]args){ StudentInfostu01=newStudentInfo(1,"張華","1111111"); …
LinkedListstuList=newLinkedList();
stuList.add(stu01); … StudentInfostu04=newStudentInfo(4,"陳波","4444444"); stuList.addFirst(stu04); stuList.removeLast(); printInfo(stuList); }7.6.3LinkedList類中定義的常用方法返回值方法說(shuō)明voidaddFirst(Objectobj)在列表的首部插入指定元素voidaddLast(Objectobj)在列表的尾部插入指定元素ObjectgetFirst()返回列表的首元素ObjectgetLast()返回列表的尾元素ObjectremoveFirst()從列表中移除首元素ObjectremoveLast()從列表中移除尾元素7.6.4HashMap類例7-18:測(cè)試HashMap,利用學(xué)號(hào)id查詢學(xué)生信息TestHashMap.javapublicclassTestHashMap{ publicstaticvoidmain(String[]args){ StudentInfostu01=newStudentInfo(1,"張華","1111111"); StudentInfostu02=newStudentInfo(2,"李平","2222222");
MapstuMap=newHashMap(); stuMap.put(1,stu01);//將學(xué)生對(duì)象放入集合,key為學(xué)號(hào),value為對(duì)象本身 stuMap.put(2,stu02); System.out.println("集合中包含的鍵有:"+stuMap.keySet()); System.out.println("集合中包含的值有:"+stuMap.values()); System.out.println(“當(dāng)前集合中的鍵值對(duì)為:”+stuMap); Integerkey=1;//裝箱,將基本數(shù)據(jù)類型int包裝成Integer對(duì)象 if(stuMap.containsKey(key)){ System.out.println(stuMap.get(key)); } stuMap.remove(key);//刪除指定key對(duì)應(yīng)的元素 System.out.println("當(dāng)前集合中的鍵值對(duì)為:"+stuMap); }7.6.4HashMap類中定義的常用方法返回值方法說(shuō)明Objectput(Objectkey,Objectvalue)以“鍵-值”對(duì)的形式存儲(chǔ)(鍵必須唯一,值可以重復(fù);如果添加重復(fù)的鍵,將覆蓋原鍵-值對(duì))Objectget(Objectkey)返回指定鍵對(duì)應(yīng)的值,如果不存在該鍵,則返回nullSetkeyset()返回集合中所有元素的鍵的集合Collectionvalues()返回集合中所有元素的值的集合booleancontainsKey(Objectkey)如果集合中存在指定鍵,則返回trueObjectremove(Objectkey)刪除指定鍵對(duì)應(yīng)的“鍵-值”對(duì)7.6.5TreeMap類例7-19:測(cè)試TreeMap,實(shí)現(xiàn)集合按鍵值有序存儲(chǔ)TestTreeMap.javapublicclassTestTreeMap{ publicstaticvoidmain(String[]args){Map<String,String>map=newTreeMap<String,String>(newComparator<String>(){publicintcompare(Strings1,Strings2){returnpareTo(s2);}});map.put("1","value1")
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工地渣土運(yùn)輸管理制度
- 公司園區(qū)出入管理制度
- 行政組織理論的企業(yè)應(yīng)用案例試題及答案
- 寶雞車站進(jìn)出管理制度
- 學(xué)校宿舍設(shè)備管理制度
- 公司進(jìn)料出料管理制度
- 員工自主餐廳管理制度
- 軟件測(cè)試中的案例分析技巧試題及答案
- 凈化車間施工管理制度
- 小區(qū)物業(yè)出入管理制度
- 多一些,少一些,多得多,少得多教案
- 高標(biāo)準(zhǔn)農(nóng)田施工安全教育
- 自然療法研究與培訓(xùn)中心行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025年砂石常規(guī)檢測(cè)試題及答案
- 專精特新申報(bào)的“秘籍”-液壓行業(yè)企業(yè)排行(智研咨詢發(fā)布)
- 機(jī)械設(shè)計(jì)制造及其自動(dòng)化畢業(yè)論文-溫室用小型電動(dòng)旋拼機(jī)設(shè)計(jì)
- 2025人教版七年級(jí)下冊(cè)生物期末學(xué)業(yè)質(zhì)量檢測(cè)試卷(含答案)
- 2025年1月四川八省聯(lián)考高考綜合改革適應(yīng)性測(cè)試物理試卷(含解析)
- 肝癌科普預(yù)防
- 競(jìng)聘移動(dòng)培訓(xùn)師
- 非標(biāo)機(jī)械設(shè)備工廠項(xiàng)目績(jī)效獎(jiǎng)激勵(lì)方案2023年
評(píng)論
0/150
提交評(píng)論