5Java基础第5章课件

上传人:工**** 文档编号:571062998 上传时间:2024-08-08 格式:PPT 页数:161 大小:5.60MB
返回 下载 相关 举报
5Java基础第5章课件_第1页
第1页 / 共161页
5Java基础第5章课件_第2页
第2页 / 共161页
5Java基础第5章课件_第3页
第3页 / 共161页
5Java基础第5章课件_第4页
第4页 / 共161页
5Java基础第5章课件_第5页
第5页 / 共161页
点击查看更多>>
资源描述

《5Java基础第5章课件》由会员分享,可在线阅读,更多相关《5Java基础第5章课件(161页珍藏版)》请在金锄头文库上搜索。

1、让IT教学更简单,让IT学习更有效让IT教学更简单,让IT学习更有效第五章数组、字符串及容器类String类和StringBuffer类System类和Runtime类Math类和Random类包装类Date类、Calendar类和DateFormat类让IT教学更简单,让IT学习更有效目录5.35.35.3 foreach语句语句5.55.5java.util.Arrays类类5.15.1一维数组一维数组5.25.2多维数组多维数组5.45.4数组的应用数组的应用5.65.65.75.7容器容器字符串字符串让IT教学更简单,让IT学习更有效数组是指一组数据的集合,数组中的每个数据被称作元素。

2、在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致。数组变量属引用类型引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组中的元素可以是可以任何数据类型,包括基本类型和引用类型。5.1一维数组让IT教学更简单,让IT学习更有效5.1一维数组5.1.1 一维数组的定义一维数组的定义在Java中,可以使用以下格式来定义一个数组。上述语句就相当于在内存中定义了100个int类型的变量,第一个变量的名称为x0,第二个变量的名称为x1,以此类推,第100个变量的名称为x99,这些变量的初始值都是0。让IT教学更简单,让IT学习更有效5.1一维数组5.1.1 一维

3、数组的定义一维数组的定义接下来,通过两张内存图来详细地说明数组在创建过程中内存的分配情况。让IT教学更简单,让IT学习更有效注意:注意:数据类型可以是8种基本数据类型,也可以是引用类型例如:inta;intb;Animaldog;Java语言中声明数组时不能指定其长度(数组中元素的个数),inta10;/错误5.1一维数组让IT教学更简单,让IT学习更有效注意:元素为引用数据类型的数组中的每一个元素都需要实例化。publicclassTestArrypublicstaticvoidmain(Stringargs)Datedays;days=newDate3;for(inti=0;i3;i+)d

4、aysi=newDate(2010,10,i+1);classDateintyear;intmonth;intday;Date(inty,intm,intd)year=y;month=m;day=d;Days:nullDays:xxxnullnullnullxxxxxxxxx2010101201010220101035.1.1 5.1.1 一维一维数组的定义数组的定义-元素为引用数据类型的数组元素为引用数据类型的数组5.1一维数组让IT教学更简单,让IT学习更有效5.1一维数组5.1.1 一维数组的定义一维数组的定义-默认值默认值让IT教学更简单,让IT学习更有效5.1.2 一维数组的初始化一

5、维数组的初始化Java中数组的初始化分为两种方式:静态初始化和动态初始化。动态初始化:为数组元素分配空间和赋值的操作分开进行,例如:5.1数组让IT教学更简单,让IT学习更有效5.1数组5.1.1 一维一维数组的初始化数组的初始化再例如:再例如:让IT教学更简单,让IT学习更有效5.1一维数组5.1.2 一维一维数组的初始化数组的初始化在初始化数组时还有一种方式叫做静态初始化,就是在定义数组的同时就为数组的每个元素赋值。数组的静态初始化有两种方式:但是为了简便,建议采用第二种方式。让IT教学更简单,让IT学习更有效5.1一维数组5.1.2 一维一维数组的初始化数组的初始化数组静态初始化的效果:

6、让IT教学更简单,让IT学习更有效5.1一维数组5.1.2 一维一维数组的初始化数组的初始化数组静态初始化的效果:值得注意的是,例程中的第3行代码千万不可写成intx=newint41,2,3,4;,这样写编译器会报错。原因在于编译器会认为数组限定的元素个数4与实际存储的元素1,2,3,4个数有可能不一致,存在一定的安全隐患。让IT教学更简单,让IT学习更有效脚下留心1、每个数组的索引都有一个范围,即0length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报错:运行结果中所提示的错误信息是数组越界异常ArrayIndexOutOfBoundsException,出现这个异常的原

7、因是数组的长度为4,其索引范围为03,例程中的第4行代码使用索引4来访问元素时超出了数组的索引范围。所谓异常指程序中出现的错误,它会报告出错的异常类型、出错的行号以及出错的原因,关于异常在后面的章节会有详细地讲解。让IT教学更简单,让IT学习更有效脚下留心2、在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常:让IT教学更简单,让IT学习更有效5.1一维数组5.1.3 数组的常见操作数组的常见操作1、一维数组遍历、一维数组遍历在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的

8、遍历。让IT教学更简单,让IT学习更有效2.8数组2.7.2 数组的常见操作数组的常见操作2、数组最值、数组最值在操作数组时,经常需要获取数组中元素的最值。让IT教学更简单,让IT学习更有效5.1一维数组5.1.3 数组的常见操作数组的常见操作3、一维数组排序、一维数组排序在操作数组时,经常需要对数组中元素进行排序。冒泡排序冒泡排序:在排序过程中,不断地比较数组中相邻的两个元素,较小者向上浮,较大者往下沉:第一步,从第一个元素开始,将相邻的两个元素依次进行比较,直到最后两个元素完成比较。如果前一个元素比后一个元素大,则交换它们的位置。整个过程完成后,数组中最后一个元素自然就是最大值,这样也就完

9、成了第一轮比较。第二步,除了最后一个元素,将剩余的元素继续进行两两比较,过程与第一步相似,这样就可以将数组中第二大的数放在了倒数第二个位置。第三步,以此类推,持续对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较为止。让IT教学更简单,让IT学习更有效5.1一维数组5.1.3 数组的常见操作数组的常见操作3、数组排序、数组排序在操作数组时,经常需要对数组中元素进行排序。让IT教学更简单,让IT学习更有效5.1一维数组5.1.3 数组的常见操作数组的常见操作3、数组排序、数组排序在操作数组时,经常需要对数组中元素进行排序。bubbleSort()方法中通过一个嵌套for循环实现了冒泡排

10、序。让IT教学更简单,让IT学习更有效5.1数组5.1.3 数组的常见操作数组的常见操作3、数组排序、数组排序在操作数组时,经常需要对数组中元素进行排序。2628行代码实现了数组中两个元素的交换。让IT教学更简单,让IT学习更有效练习题练习题定义一个对象数组Studentstus=newStudent5;每个元素中存储学生信息姓名(String),年龄(int),成绩(int)然后按成绩给这个数组排序。让IT教学更简单,让IT学习更有效5.2多维数组5.2.1 二维数组的声明二维数组的声明多维数组可以简单地理解为在数组中嵌套数组。在程序中比较常见的就是二维数组。二维数组的定义有很多方式:让IT

11、教学更简单,让IT学习更有效5.2.1 二维数组的声明二维数组的声明二维数组可以看成以数组为元素的数组。例如:Inta=1,3,3,5,6,7,2,6,3;Java中多维数组的声明和初始化应从最左边维数从最左边维数进行,例如:inta=newint3;a0=newint2;a1=newint3;a2=newint4;intb=newint3;/非法也可以同时指定所有的维数:inta=newint35;5.2多维数组让IT教学更简单,让IT学习更有效5.2多维数组5.2.1 二维数组的声明二维数组的声明所以,二维数组也可以如下定义:让IT教学更简单,让IT学习更有效5.2多维数组5.2.2 二维

12、数组的初始化二维数组的初始化静态初始化:适用于数组元素个数较少的情况intintArray=1,2,2,3,3,4;String22stringArray=“Hello”,“world”,“java”,“test”;/错误,不能指定维数。让IT教学更简单,让IT学习更有效动态初始化:(1)直接为每一维分配空间,其语法格式为:数据类型数组名=new数据类型行数列数;如:inta=newint34;a:xxx0000000000005.2.2 二维数组的初始化二维数组的初始化5.2多维数组让IT教学更简单,让IT学习更有效AS:xxxnull null null nullnull null nul

13、l nullnull null null null再如:StringAS=newString34;5.2.2 二维数组的初始化二维数组的初始化5.2多维数组让IT教学更简单,让IT学习更有效(2)从最高维开始(而且必须从最高维开始),分别为每一维分配空间,此时二维数值中每行的元素个数可以不相等。如:inta=newint3;a0=newint2;a1=newint3;5.2.2 二维数组的初始化二维数组的初始化5.2多维数组让IT教学更简单,让IT学习更有效a:xxxa0:xxxa1:xxxa2:null00000inta=newint3;a0=newint2;a1=newint3;5.2.2

14、 二维数组的初始化二维数组的初始化5.2多维数组让IT教学更简单,让IT学习更有效例例1:让IT教学更简单,让IT学习更有效统计一个公司三个销售小组三个季度中每个小组的总销售额以及整个公司的销售额。例例2:让IT教学更简单,让IT学习更有效例例3:让IT教学更简单,让IT学习更有效注意:二维数组名.length方式返回的将是该二维数值的行数,使用“二维数组名index1.length”返回的是该二维数组第index1行的元素数(即该行的列数)。【书例5.2】MultiMatrixDemo.java5.2.3 二维数组的访问二维数组的访问5.2多维数组让IT教学更简单,让IT学习更有效ufore

15、ach语句用于循环遍历数组或集合中的各个元素。语法格式为:语法格式为:for(数据类型变量:数组集合)如:intintArray=1,2,3,4,5; /声明变量声明变量 i 的类型要与数组或集合的数据类型一致;的类型要与数组或集合的数据类型一致;for(inti:intArray)/系统自动帮我们完成循环的循环条件、迭代语句。系统自动帮我们完成循环的循环条件、迭代语句。System.out.println(i);5.3foreach语句让IT教学更简单,让IT学习更有效循环变量是临时变量,不是数组元素,系统会把数组中的值依次赋给这个临时变量。虽然允许为此临时变量赋值,但是无法来修改数组的值,

16、而且极易出错。5.3foreach语句【书例5.3】ForeachDemo.java让IT教学更简单,让IT学习更有效5.5 Arrays工具类java.util包中还提供了一个专门用于操作数组的工具类Arrays。Arrays工具类提供了大量的静态方法。1、使用、使用Arrays的的sort()方法排序方法排序在前面学习数组时,要想对数组进行排序就需要自定义一个排序方法,其实也可以使用Arrays工具类中的静态方法sort()来实现这个功能,接下来通过一个案例来学习sort()方法的使用。让IT教学更简单,让IT学习更有效5.5 Arrays工具类2、使用、使用Arrays的的binaryS

17、earch(Object a, Object key)方法查找元素方法查找元素程序开发中,经常会在数组中查找某些特定的元素,如果数组中元素较多时查找某个元素就会非常繁琐,为此,Arrays类中提供还了一个方法binarySearch(Objecta,Objectkey)用于查找元素,接下来通过一个案例来学习该方法的使用。让IT教学更简单,让IT学习更有效5.5 Arrays工具类2、使用、使用Arrays的的binarySearch(Object a, Object key)方法查找元素方法查找元素所谓二分法查找就是每次将指定元素和数组中间位置的元素进行比较,从而排除掉其中的一半元素,这样的查

18、找是非常高效的。接下来通过一个图例来演示二分法查找元素的过程。让IT教学更简单,让IT学习更有效5.5 Arrays工具类3、使用、使用Arrays的的copyOfRange(int original, int from, int to)方法拷贝元素方法拷贝元素在程序开发中,经常需要在不破坏原数组的情况下使用数组中的部分元素,这时可以使用Arrays工具类的copyOfRange(intoriginal,intfrom,intto)方法将数组中指定范围的元素复制到一个新的数组中,该方法中参数original表示被复制的数组,from表示被复制元素的初始索引(包括),to表示被复制元素的最后索引

19、(不包括),接下来通过一个案例来学习如何拷贝数组。让IT教学更简单,让IT学习更有效5.5 Arrays工具类4使用使用Arrays的的fill(Object a, Object val)方法填充元方法填充元素素程序开发中,经常需要用一个值替换数组中的所有元素,这时可以使用Array的fill(Objecta,Objectval)方法,该方法可以将指定的值赋给数组中的每一个元素,接下来通过一个案例来演示如何填充元素。让IT教学更简单,让IT学习更有效5.5 Arrays工具类5使用使用Arrays的的toString(int arr)方法把数组转换为字方法把数组转换为字符串符串在程序开发中,经

20、常需要把数组以字符串的形式输出,这时就可以使用Arrays工具类的另一个方法toString(intarr)。需要注意的是,该方法并不是对Object类toString()方法的重写,只是用于返回指定数组的字符串形式,接下来通过一个案例来演示如何将数组转换为字符串。让IT教学更简单,让IT学习更有效练习:练习:给定数组9,3,5,6,2,11,5,6,进行如下操作(1)排序,并输出排序后的结果(2)再定义一个数组9,3,5,6,2,11,5,6,比较这两个数组是否相同。(3)查找数字5,并返回其下标(4)使用数字8填充数组中的第3-5元素,并输出结果。(5)拷贝数组中的前5个值到另外一个数组。

21、并输出该数组中的值。让IT教学更简单,让IT学习更有效5.5 Arrays工具类注意:注意:Arrays类为我们提供了大量操作数组的方法,实际项目开发中,推荐使用Arrays类的静态方法来完成数组的操作,这样既快捷又不会发生错误,但是面试的时候,如果出现对数组操作的题目,就绝不允许是用Arrays类提供的方法,因为面试官考察的是我们对数组的操作能力,而不是对Arrays类的应用。让IT教学更简单,让IT学习更有效u 字符串是字符的序列,它是组织字符的基本数据结构, 从 某种程度上来说有些类似于字符的数组。u 在Java中,字符串被当作对象来处理。u 程序中需要用到的字符串可以分为两大类,一类是

22、创建之后不会再做修改和变动的字符串常量字符串常量;另一类是创建之后允许再做更改和变化的字符串变量字符串变量。u 在Java中,存放字符串常量的对象用String类,对于字符串变量,由于程序中经常需要对它做添加,插入,修改等操作,一般存放在StringBuffer类的对象中。它们都位于java.lang包中,因此不需要导包就可以直接使用。5.6字符串让IT教学更简单,让IT学习更有效String字符串常量使用双引号括住的一串字符,比如: Hello world! Java编译器自动为每一个字符串常量生成一个String类的实例,因此可以用字符串常量直接初始化一个String对象,如: Strin

23、g s=Hello world! ;5.6字符串让IT教学更简单,让IT学习更有效要创建类String的一个对象并进行初始化,需要调用类String的构造方法。类String中提供了下面的一些构造方法:String( ):无参数的缺省的构造方法用来创建一个空串。 String s = new String( ); String( String value):利用已经存在的字符串常量创建一个新的String对象,该对象的内容与给出的字符串常量一致。 String s=new String(“hello”);String( char value ):通过给构造方法传递一个字符数组可以创建一个非空串

24、。char chars = a , b , c ; String s = new String( chars ) ; String5.6字符串让IT教学更简单,让IT学习更有效String( char , int startIndex, int numChars ):这种方法用来创建一个非空串,并且指明所创建的字符串在字符数组中的起始地址以及所包含的字符个数。char chars = a , b , c , d , e , f ;String s = new String ( chars , 2 , 3 ); 该方法生成的串s为“cde”。(注意数组的下标从0开始)String5.6字符串让I

25、T教学更简单,让IT学习更有效String( byte mybyte):从byte型数组进行初始化的构造方法。byte mybyte = 97 , 98 , 99 ; String s = new String( mybyte);该方法构造的字符串s是“abc”。String(StringBuffer buffer):这个构造函数利用一个已经存在的StringBuffer对象为新建的String对象初始化。String5.6字符串让IT教学更简单,让IT学习更有效 1. length public int length( ) 此方法返回字符串的字符个数,如:String s = abc; Sy

26、stem.out.println( s.length( ) ); 则将显示字符个数为3。StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效2. charAt public char charAt (int index )该方法返回字符串中index位置上的字符。String s1 = here it is; System.out.println(s1.charAt(3);运行结果:e3. getCharspublic void getchars (int srcbegin,int end,char buf,int dstbegin)将字符从此字符串复制到目标

27、字符数组。StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效4. indexOf和lastIndexOf int indexOf ( int ch) int lastIndexOf ( int ch) 返回字符ch在字符串中出现的第一个和最后一个位置。Strings1=Iamastudent;System.out.println(s1.indexOf(a);/或aSystem.out.println(s1.lastIndexOf(a);运行结果:2 5StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效int indexOf

28、(String str)int lastindexOf(String str)返回子串str中第一个字符在字符串中出现的始末位置。int indexOf ( int ch, int fromIndex) int lastIndexOf ( int ch, int fromIndex)返回字符ch在字符串中位置fromIndex以后出现的始末位置。int indexOf (String str,int fromIndex) int lastIndexOf (String str , int fromIndex)返回子串str中的第一个字符在字符串中位置fromIndex以后出现的始末位置。Str

29、ingString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效5. publicbooleanstartsWith(Stringprefix) public boolean startsWith(String prefix,int toffset) 测试字符串是否以指定前缀开始。第二个重载函数是以 指定索引开始,如字符串以prefix为前缀返回true,否则 返回false public boolean endsWith(String suffix) 测试该字符串是否以suffix后缀结束,如是返回true,否 则返回falseStrings1=Iamastudent;Sys

30、tem.out.println(s1.startsWith(I);System.out.println(s1.endsWith(student);运行结果:truetrueStringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效6. 在Java中,运算符“”可以用来实现字符串的连接,如:String s = “He is” + age + “years old.”假设整数型变量age的值为15,那么,s的值为“He is 15 yearsOld”。7. compareTopublic int compareTo ( String str ) 该方法按字典次序比较两

31、个字符串的大小,如果源串较小,则返回一个小于0的值,如相等则返回0,否则返回一个大于0的值。StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效8. regionMatchesboolean regionMatches( int toffset , String other , int ooffset , int len ) boolean regionMatches( boolean ignoreCase , int toffset , String other , int ooffset , int len ) 上述两个方法都是用来进行模式匹配的,匹配成功

32、则返回true,否则返回false。其中,toffset和ooffset分别指明当前字符串和参数字符串中所要比较的子串的起始索引位置,len指明比较的长度,而ignoreCase指明比较时是否区分大小写。对于第一种方法,比较是区分大小写的。StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效例如:Strings4=tsinghua;Strings5=itisTsingHua;System.out.println(s4.regionMatches(0,s5,6,7);System.out.println(s4.regionMatches(true,0,s5,6,

33、7);StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效 9. equals和equalsIgnoreCasepublic boolean equals( object str) public boolean equalsIgnoreCase( object str )判断两个字符串是否相等,则可以用此方法。相等则返回 true,不等则返回false,两种方法的区别在于 equalsIgnoreCase不区分字母大小写,而equals则须区分。10.其他方法public String replace(char oldChar,char newChar)将串中

34、出现的特定字符用新的字符代替。StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效public public StringString substring(int beginIndex) substring(int beginIndex)Thesubstringbeginswiththecharacteratthespecifiedindexandextendstotheendofthisstring.public public StringString substring(int beginIndex,int endIndex) substring(int

35、beginIndex,int endIndex)returnsanewstringthatisasubstringofthisstring.ThesubstringbeginsatthespecifiedbeginIndexandextendstothecharacteratindexendIndex-1.StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效public String toLowerCase()把串中的所有字符转换成小写public String toUpperCase()把串中的所有字符转换成大写public String trim()清除字

36、符串两端的空白public char toCharArray()返回字符串的字符数组形式StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效Strings1=henanuniversity;Strings2=s1.toUpperCase();System.out.println(s2);System.out.println(s2.toLowerCase();Strings3=zhanglin1987;System.out.println(s3.trim();chars4=s3.toCharArray();System.out.println(Arrays.to

37、String(s3.toCharArray();System.out.println(s3.length();/s4.lengthSystem.out.println(s1.equals(s2);System.out.println(s3.replace(zhanglin,zhaojing);System.out.println(s1.substring(2,8); /包括包括beginIndex,不包括不包括endIndexHENANUNIVERSITYhenanuniversityzhanglin1987,z,h,a,n,g,l,i,n,1,9,8,7,15falsezhaojing198

38、7nanun让IT教学更简单,让IT学习更有效public String concat(String str);将当前字符串对象与给定的字符串str连接起来。public String split(String regex)将字符串根据给定的正则表达式进行拆分,举例如下:Thestringboo:and:foo,forexample,yieldsthefollowingresultswiththeseexpressions:RegexResult:boo,and,fooob,:and:fpublic static String valueOf(type types)该返回types的字符串形式

39、StringString基本方法基本方法5.6字符串让IT教学更简单,让IT学习更有效publicstaticvoidmain(Stringargs)Stringstr=cares.concat(s);StringSt=to.concat(get).concat(her);System.out.println(str+St);intt=341435;floatf=23.4f;StringsNumber=String.valueOf(t);System.out.println(String.valueOf(f)+“,t的位数+sNumber.length();StringS=boo:is:foo

40、;StringsPlit=S.split(:);for(inti=0;isPlit.length;i+)System.out.println(sPliti);让IT教学更简单,让IT学习更有效Stringname=”ray“;name.concat(”long“);/字符串连接System.out.println(name);/输出name,还是”ray“name=name.concat(”long“);/把字符串对象连接的结果赋给了name引用System.out.println(name);/输出name,oh!,变成了”raylong“分析输出结果分析输出结果让IT教学更简单,让IT学习

41、更有效脚下留心String字符串在获取某个字符时,会用到字符的索引,当访问字符串中的字符时,如果字符的索引不存在,则会发生StringIndexOutOfBoundsException(字符串角标越界异常)可以看出,访问字符串中的字符时,不能超出字符的索引范围,否则会出现可以看出,访问字符串中的字符时,不能超出字符的索引范围,否则会出现异常,这与数组中的角标越界异常非常相似。异常,这与数组中的角标越界异常非常相似。让IT教学更简单,让IT学习更有效(1)给定字符串“abcde”,将该字符串转换为字符数组,并将其输出,输出的格式为:a,b,c,d,e.(2)给定字符串“篮球-足球-乒乓球”,将字

42、符串进行分割,最后得到输出格式为:篮球,足球,乒乓球。(3)对给定的10个国家名,按其字母的顺序输出。(4)求输入英文句子单词的平均长度。(5)从文件路径中提取出文件名(包含后缀)。比如从c:ab.txt中提取出b.txt这个文件名出来。练习题练习题让IT教学更简单,让IT学习更有效5.6.2 StringBuffer类类为了便于对字符串的修改,在JDK中提供了一个StringBuffer类(也称字符串缓冲区)。StringBuffer类和String类最大的区别在于它的内容和长度都是可以改变的。StringBuffer类似一个字符容器,当在其中添加或删除字符时,并不会产生新的StringBu

43、ffer对象。5.6字符串StringBuffer让IT教学更简单,让IT学习更有效5.6字符串5.6.2 StringBuffer类类例程中涉及到例程中涉及到StringBuffer类的很多方法,其中类的很多方法,其中append()和和insert()方法是最方法是最常用的,并且这两个方法有很多重载形式,它们都用于添加字符。不同的是,常用的,并且这两个方法有很多重载形式,它们都用于添加字符。不同的是,append()方法始终将这些字符添加到缓冲区的末尾,而方法始终将这些字符添加到缓冲区的末尾,而insert()方法则可以在指定的方法则可以在指定的位置添加字符。位置添加字符。让IT教学更简单

44、,让IT学习更有效5.6.2 StringBuffer类类StringBuffer类和String类有很多相似之处,初学者使用时容易混淆。1、String类表示的字符串是常量,一旦创建后,内容和长度都是无法改变的。StringBuffer表示字符容器,其内容和长度都可以随时修改。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类即可,但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer类。2、String类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖Object类的equals()方法3、String类对象可以用操作符“

45、+”进行连接,而StringBuffer类对象之间不能5.6字符串让IT教学更简单,让IT学习更有效常用类一:System类与Runtime类1、System类类System类对大家来说并不陌生,因为之前在打印结果时,使用的都是“System.out.println()”语句。这句代码中就使用了System类。System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的,因此,想要引用这些属性和方法,直接使用System类调用即可。让IT教学更简单,让IT学习更有效1、 System类类(1)getProperties()方法方法System类的getProperties()

46、方法用于获取当前系统的全部属性,该方法会返回一个Properties对象,其中封装了系统的所有属性,这些属性是以键值对的形式存在常用类一:System类与Runtime类让IT教学更简单,让IT学习更有效1、 System类类(2)currentTimeMillis()currentTimeMillis()方法返回一个long类型的值,该值表示当前时间与1970年1月1日0点0分0秒之间的时间差,单位是毫秒,习惯性地被称作时间戳。例程例程6-10中,演示了数字的求和操作,程序在求和开始和结束时,分别调用了中,演示了数字的求和操作,程序在求和开始和结束时,分别调用了currentTimeMill

47、is()方法分别获得了两个时间戳,两个时间戳之间的差值便是求和操作耗费的时方法分别获得了两个时间戳,两个时间戳之间的差值便是求和操作耗费的时间。间。常用类一:System类与Runtime类让IT教学更简单,让IT学习更有效1、System类类3arraycopy(Object src,int srcPos,Object dest,int destPos,int length) arraycopy()方法用于将一个数组中的元素快速拷贝到另一个数组。其中的参数具体作用如下:src:表示源数组dest:表示目标数组srcPos:表示源数组中拷贝元素的起始位置destPos:表示拷贝到目标数组的起始

48、位置length:表示拷贝元素的个数 需要注意的是,在进行数组复制时,目标数组必须有足够的空间来存放拷贝需要注意的是,在进行数组复制时,目标数组必须有足够的空间来存放拷贝的元素,否则会发生角标越界异常。的元素,否则会发生角标越界异常。常用类一:System类与Runtime类让IT教学更简单,让IT学习更有效1、 System类类3arraycopy(Object src,int srcPos,Object dest,int destPos,int length) 例程例程6-11中,创建了两个数组中,创建了两个数组fromArray和和toArray,分别代表源数组和目标,分别代表源数组和目

49、标数组,当调用数组,当调用arraycopy()方法进行元素拷贝时,由于指定了从源数组中索引方法进行元素拷贝时,由于指定了从源数组中索引为为2的元素开始拷贝,并且拷贝的元素开始拷贝,并且拷贝4个元素存放在目标数组中索引为个元素存放在目标数组中索引为3的位置,的位置,因此,在打印目标数组的元素时,程序首先打印的是数组因此,在打印目标数组的元素时,程序首先打印的是数组toArray的前三个的前三个元素元素201、202、203,然后打印的是从,然后打印的是从fromArray中拷贝的四个元素。中拷贝的四个元素。常用类一:System类与Runtime类让IT教学更简单,让IT学习更有效2、 Run

50、time类类Runtime类用于表示虚拟机运行时的状态,它用于封装JVM虚拟机进程。每次使用java命令启动虚拟机都对应一个Runtime实例,并且只有一个实例,因此该类采用单例模式进行设计,对象不可以直接实例化。若想在程序中获得一个Runtime实例,只能通过以下方式:由于Runtime类封装了虚拟机进程,因此,在程序中通常会通过该类的实例对象来获取当前虚拟机的相关信息。常用类一:System类与Runtime类让IT教学更简单,让IT学习更有效2、Runtime类类例程例程6-12中,通过中,通过“Runtime.getRuntime()”方式创建了一个方式创建了一个Runtime的实的实

51、例对象,并分别调用该对象的例对象,并分别调用该对象的availableProcessors()方法、方法、freeMemory()方方法和法和maxMemory()方法,将当前虚拟机的处理器个数、空闲内存数和可用最方法,将当前虚拟机的处理器个数、空闲内存数和可用最大内存数的信息打印出来。大内存数的信息打印出来。常用类一:System类与Runtime类让IT教学更简单,让IT学习更有效2、 Runtime类类Runtime类中提供了一个exec()方法,该方法用于执行一个dos命令,从而实现和在命令行窗口中输入dos命令同样的效果。例程例程6-13中,调用了中,调用了Runtime对象的对象的

52、exec()方法,并将系统命令方法,并将系统命令notepad.exe作为参数传递给方法。运行程序会在桌面上打开一个记事本作为参数传递给方法。运行程序会在桌面上打开一个记事本常用类一:System类与Runtime类让IT教学更简单,让IT学习更有效2、 Runtime类类接下来通过一个案例来实现打开的记事本并在3秒后自动关闭例程例程6-14中,通过调用中,通过调用Process对象的对象的destroy()方法,将打开的记事本关闭方法,将打开的记事本关闭了。为了突出演示的效果,使用了了。为了突出演示的效果,使用了Thread类的静态方法类的静态方法sleep(long millis)使使程序

53、休眠了程序休眠了3秒,因此,程序运行后,会看到打开的记事本在秒,因此,程序运行后,会看到打开的记事本在3秒后自动关闭秒后自动关闭了。了。常用类一:System类与Runtime类让IT教学更简单,让IT学习更有效常用类二:Math类与Random类3、 Math类类Math类是数学操作类,提供了一系列用于数学运算的静态方法,包括求绝对值、三角函数等。Math类中有两个静态常量PI和E,分别代表数学常量和e。例程例程6-15对对Math类的常用方法进行了演示。从运行结果中可以看出每个方法类的常用方法进行了演示。从运行结果中可以看出每个方法的作用。需要注意的是,的作用。需要注意的是,round()

54、方法用于对某个小数进行四舍五入,此方法方法用于对某个小数进行四舍五入,此方法会将小数点后面的数字全部忽略,返回一个会将小数点后面的数字全部忽略,返回一个int值。而值。而ceil()方法和方法和floor()方法方法返回的都是返回的都是double类型的数,这个数在数值上等于一个整数。类型的数,这个数在数值上等于一个整数。让IT教学更简单,让IT学习更有效4、 Random类类在JDK的java.util包中有一个Random类,它可以在指定的取值范围内随机产生数字。在Random类中提供了两个构造方法表中列举了表中列举了Random类的两个构造方法,其中第一个构造方法是无参的,通类的两个构造

55、方法,其中第一个构造方法是无参的,通过它创建的过它创建的Random实例对象每次使用的种子是随机的,因此每个对象所产实例对象每次使用的种子是随机的,因此每个对象所产生的随机数不同。如果希望创建的多个生的随机数不同。如果希望创建的多个Random实例对象产生相同序列的随实例对象产生相同序列的随机数,则可以在创建对象时调用第二个构造方法,传入相同的种子即可。机数,则可以在创建对象时调用第二个构造方法,传入相同的种子即可。常用类二:Math类与Random类让IT教学更简单,让IT学习更有效4、 Random类类从运行结果可以看出,例程从运行结果可以看出,例程6-16运行两次产生的随机数序列是不一样

56、的。这是运行两次产生的随机数序列是不一样的。这是因为当创建因为当创建Random的实例对象时,没有指定种子,系统会以当前时钟作为种的实例对象时,没有指定种子,系统会以当前时钟作为种子,产生随机数。子,产生随机数。常用类二:Math类与Random类让IT教学更简单,让IT学习更有效4、 Random类类接下来将例程6-16稍作修改,采用第二种构造方法产生随机数从运行结果可以看出,当创建从运行结果可以看出,当创建Random类的实例对象时,如果指定了相同的种类的实例对象时,如果指定了相同的种子,则每个实例对象产生的随机数具有相同的序列。子,则每个实例对象产生的随机数具有相同的序列。常用类二:Ma

57、th类与Random类让IT教学更简单,让IT学习更有效4、 Random类类相对于Math的random()方法而言,Random类提供了更多的方法来生成各种伪随机数,不仅可以生成整数类型的随机数,还可以生成浮点类型的随机数表中列出了表中列出了Random类常用的方法,其中,类常用的方法,其中,Random类的类的nextDouble()方法方法返回的是返回的是0.0和和1.0之间之间double类型的值,类型的值,nextFloat()方法返回的是方法返回的是0.0和和1.0之间之间float类型的值,类型的值,nextInt(int n)返回的是返回的是0(包括)和指定值(包括)和指定值

58、n(不包括)(不包括)之间的值。之间的值。常用类二:Math类与Random类让IT教学更简单,让IT学习更有效4、 Random类类相对于Math的random()方法而言,Random类提供了更多的方法来生成各种伪随机数,不仅可以生成整数类型的随机数,还可以生成浮点类型的随机数从运行结果可以看出,例程从运行结果可以看出,例程6-18中通过调用中通过调用Random类不同的方法分别产生了类不同的方法分别产生了不同类型的随机数。不同类型的随机数。常用类二:Math类与Random类让IT教学更简单,让IT学习更有效常用类三:Date类、Calendar类与DateFormat类5、 Date类

59、类在JDK的java.util包中提供了一个Date类用于表示日期和时间。Date类中大部分构造方法都被声明为已过时,只有两个构造方法是建议使用的,一个是无参的构造方法Date(),用来创建当前日期时间的Date对象。另一个是接收一个long型参数date的构造方法Date(longdate),用于创建指定时间的Date对象,其中date参数表示1970年1月1日0时0分0(称为历元)以来的毫秒数,即时间戳。让IT教学更简单,让IT学习更有效5、 Date类类例程例程6-22中,打印中,打印date1得到的是当前计算机的日期和时间,打印得到的是当前计算机的日期和时间,打印date2则是则是自自

60、1970年年1月月1日日00:00:00以来以来966666666666l毫秒后的日期和时间。因此,毫秒后的日期和时间。因此,大家可以根据需求选择不同的方式创建大家可以根据需求选择不同的方式创建Date对象。对象。常用类三:Date类、Calendar类与DateFormat类让IT教学更简单,让IT学习更有效6、 Calender类类Calendar类用于完成日期和时间字段的操作,它可以通过特定的方法设置和读取日期的特定部分,比如年、月、日、时、分和秒等。Calendar类是一个抽象类,不可以被实例化,在程序中需要调用其静态方法getInstance()来得到一个Calendar对象,然后调

61、用其相应的方法,具体示例如下:常用类三:Date类、Calendar类与DateFormat类让IT教学更简单,让IT学习更有效6、 Calender类类接下来通过一个案例来学习下Calender类如何获取当前计算机的日期和时间例程例程6-23中,调用中,调用Calendar的的getInstance()方法创建一个代表默认时区内当方法创建一个代表默认时区内当前时间的前时间的Calendar对象。然后调用该对象的对象。然后调用该对象的get(int field)方法,通过传入不方法,通过传入不同的常量字段值来分别得到日期、时间各个字段的值,特别需要注意的是,同的常量字段值来分别得到日期、时间各

62、个字段的值,特别需要注意的是,获取的获取的Calendar.MONTH字段值需要加字段值需要加1才表示当前时间的月份。才表示当前时间的月份。常用类三:Date类、Calendar类与DateFormat类让IT教学更简单,让IT学习更有效6、 Calender类类接下来就通过调用Calendar类的set()和add()方法来实现上述过程例程例程6-24中调用中调用Calendar的的set()方法将日期设置为方法将日期设置为2008年年8月月8号,然后调用号,然后调用add()方法在方法在Calendar.Date字段上增加字段上增加100,从第,从第10行的打印结果可以看出,增行的打印结果

63、可以看出,增加加100天的日期为天的日期为2008年年11月月16日。日。常用类三:Date类、Calendar类与DateFormat类让IT教学更简单,让IT学习更有效7、 DateFormat类类如果要将Date对象表示的日期以指定的格式输出,例如输出中文格式的时间,就需要用到DateFormat类。DateFormat类专门用于将日期格式化为字符串或者将用特定格式显示的日期字符串转换成一个Date对象。DateFormat是抽象类,不能被直接实例化,但它提供了静态方法,通过这些方法可以获取DateFormat类的实例对象,并调用其它相应的方法进行操作表中列出了DateFormat类的四

64、个静态方法,这四个方法都是用于获得DateFormat类的实例对象,每种方法返回的对象都具有不同的作用,它们可以分别对日期或者时间部分进行格式化。在DateFormat类中定义了四个常量值用于作为参数传递给这些方法,其中包括FULL、LONG、MEDIUM和SHORT。FULL常量用于表示完整格式,LONG常量用于表示长格式,MEDIUM常量用于表示普通格式,SHORT常量用于表示短格式。常用类三:Date类、Calendar类与DateFormat类让IT教学更简单,让IT学习更有效7、 DateFormat类类接下来通过一个案例针对表中的方法进行演示例程例程6-26中演示了四种格式下时间和

65、日期格式化输出的效果,其中调用中演示了四种格式下时间和日期格式化输出的效果,其中调用getDateInstance()方法获得的实例对象用于对日期部分进行格式化,方法获得的实例对象用于对日期部分进行格式化,getDateTimeInstance()方法获得的实例对象可以对日期和时间部分进行格式化。方法获得的实例对象可以对日期和时间部分进行格式化。常用类三:Date类、Calendar类与DateFormat类让IT教学更简单,让IT学习更有效7、 DateFormat类类DateFormat中还提供了一个parse(Stringsource)方法,能够将一个字符串解析成Date对象,但是它要求

66、字符串必须符合日期/时间的格式要求,否则会抛出异常。例程例程6-27,使用,使用LONG样式常量创建了一个样式常量创建了一个DateFormat对象,然后调用对象,然后调用format()方法与它格式对应的时间字符串方法与它格式对应的时间字符串2008年年8月月8日日解析成了解析成了Date对象。对象。常用类三:Date类、Calendar类与DateFormat类让IT教学更简单,让IT学习更有效8、 SimpleDateFormatJDK中提供了一个SimpleDateFormat类,该类是DateFormat类的子类。SimpleDateFormat类可以使用new关键字创建实例对象,它

67、的构造方法接收一个格式字符串参数,表示日期格式模板例程例程6-28中,在创建中,在创建SimpleDateFormat对象时传入日期格式模板对象时传入日期格式模板“Gyyyy年年MM月月dd日:今天是日:今天是yyyy年的第年的第D天,天,E” ,调用,调用SimpleDateFormat的的format()方法,将方法,将Date对象格式化成如模板格式的对象格式化成如模板格式的“公元公元2013年年09月月06日:今天日:今天是是2013年的第年的第249天,星期五天,星期五”字符串形式。字符串形式。常用类三:Date类、Calendar类与DateFormat类让IT教学更简单,让IT学习

68、更有效包装类在Java中,很多类的方法都需要接收引用类型的对象,此时就无法将一个基本数据类型的值传入。为了解决这样的问题,JDK中提供了一系列的包装类,通过这些包装类可以将基本数据类型的值包装为引用数据类型的对象。表中列举了八种基本数据类型及其对应的包装类。其中,除了表中列举了八种基本数据类型及其对应的包装类。其中,除了Integer和和Character类,其它包装类的名称和基本数据类型的名称一致,只是类名的第类,其它包装类的名称和基本数据类型的名称一致,只是类名的第一个字母大写即可。一个字母大写即可。让IT教学更简单,让IT学习更有效IntegerInteger包装类常见包装类常见属性和方

69、法属性和方法其它包装类的相关方法参看API文档让IT教学更简单,让IT学习更有效包装类接下来通过一个案例实现在屏幕上打印“*”矩形,其中宽和高由运行时传入的参数来决定在运行例程6-21时,需要传入参数宽和高,具体命令如下:在例程在例程6-21中,程序运行时从键盘输入了两个参数,其中第一个参数作为矩形中,程序运行时从键盘输入了两个参数,其中第一个参数作为矩形的宽度,第二个参数作为矩形的高度,由于键盘输入的参数都是字符串类型,的宽度,第二个参数作为矩形的高度,由于键盘输入的参数都是字符串类型,不能直接使用,因此,通过调用包装类不能直接使用,因此,通过调用包装类Integer的的parseInt()

70、方法将字符串转为方法将字符串转为整数,从而实现了矩形的打印。整数,从而实现了矩形的打印。让IT教学更简单,让IT学习更有效使用基础类型创建使用基础类型创建包装类类型包装类类型基础类型包装类格式:格式:包装类包装类 类变量类变量 = new 包装类包装类(初始化值)(初始化值)让IT教学更简单,让IT学习更有效通过包装类获取基本类型通过包装类获取基本类型包装类基础类型格式:格式:基础类型基础类型 变量变量 =包装类型变量包装类型变量.xxxValue()让IT教学更简单,让IT学习更有效自动装箱和拆箱自动装箱和拆箱从JDK5.0之后,Java提供了自动装箱和拆箱。自动装箱和拆箱是指:基本数据类型

71、和对应的包装类之间能够直接转换。Integerint_num=newInteger(2);inti=int_num;让IT教学更简单,让IT学习更有效包装类转换包装类转换包装类主要提供了基本数据类型数值和字符串之间的转换。Strings_date=20090122;intk=Integer.parseInt(s_date);当然包装类也可以把基础类型转换为字符串类型doubled2string=12.2;Stringvar=String.valueOf(d2string);让IT教学更简单,让IT学习更有效例子:例子:让IT教学更简单,让IT学习更有效包装类在使用包装类时,需要注意以下几点:包

72、装类都重写了Object类中的toString()方法,以字符串的形式返回被包装的基本数据类型的值。除了Character外,包装类都有valueOf(Strings)方法,可以根据String类型的参数创建包装类对象,但参数字符串s不能为null,而且字符串必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错。除了Character外,包装类都有parseXXX(Strings)的静态方法,将字符串转换为对应的基本类型的数据。参数s不能为null,而且同样必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错。让IT教学更简单,让IT学习更有效JDK7新特性sw

73、itch语句支持字符串类型在JDK7中,switch语句的判断条件增加了对字符串类型的支持。由于字符串的操作在编程中使用频繁,这个新特性的出现为Java编程带来了便利。例程例程6-30中,中,switch语句条件表达式的值为语句条件表达式的值为“Friday”,与,与17行行case条件条件中的字符串中的字符串“Friday”相匹配,因此打印出相匹配,因此打印出“星期五星期五”。让IT教学更简单,让IT学习更有效在前面的章节中介绍过在程序中可以通过数组来保存多个对象,但在某些情况下无法确定到底需要保存多少个对象,此时数组将不再适用,因为数组的长度不可变。JDK中提供了一系列特殊的类,这些类可以

74、存储任意类型的对象,并且长度可变,统称为集合。集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map,5.7容器让IT教学更简单,让IT学习更有效Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是List和Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序并且不可重复。List接口的主要实现类有ArrayList和LinkedList,Set接口的主要实现类有HashSet和TreeSet。Map:双列集合类的根接口,用于存储具有键(Key)、值(Value)映射关系的元素,每个元素都包含一

75、对键值,在使用Map集合时可以通过指定的Key找到对应的Value,例如根据一个学生的学号就可以找到对应的学生。Map接口的主要实现类有HashMap和TreeMap。5.7容器让IT教学更简单,让IT学习更有效集合体系架构图5.7.1容器类介绍让IT教学更简单,让IT学习更有效5.7.2Collection接口Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。让IT教学更简单,让IT学习更有效举例:让IT教学更简单,让IT学习更有效5.7.3List接口List接口简介接口简介List接

76、口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。List不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法。让IT教学更简单,让IT学习更有效List接口简介接口简介5.7.3List接口让IT教学更简单,让IT学习更有效5.7.3List接口1、 ArrayList集合集合ArrayList

77、是List接口的一个实现类,它是程序中最常见的一种集合在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组ArrayList集合中大部分方法都是从父类Collection和List继承过来的,其中add()方法和get()方法用于实现元素的存取。让IT教学更简单,让IT学习更有效5.7.3List接口1、 ArrayList集合集合接下来通过一个案例来学习ArrayList集合如何存取元素让IT教学更简单,让IT学习更有效5.7.3List接口2、

78、LinkedList集合集合List接口的另一个实现类LinkedList,克服了ArrayList集合在查询元素时速度很快,但在增删元素时效率较低的局限性。该集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修改元素之间的这种引用关系即可,删除一个节点也是如此。让IT教学更简单,让IT学习更有效5.7.3List接口2、 LinkedList集合集合LinkedList集合添加元素和删除元素的过程如图。让IT教学更简单,让IT学习更有效5.7.3List接口2、 LinkedList

79、集合集合LinkedList集合除了具备增删元素效率高的特点,还专门针对元素的增删操作定义了一些特有的方法。让IT教学更简单,让IT学习更有效5.7.3List接口2、 LinkedList集合集合接下来通过一个案例来学习这些方法的使用。让IT教学更简单,让IT学习更有效注意:在实际应用中,究竟选取哪种List类型的集合?实现List接口的实现类有两个:ArrayList和LinkedList。选取哪一种取决于特定的需要。如果要支持随机访问,而不必在除尾部的任何位置插入或删除元素,那么选用ArrayList;如果要频繁地从列表的中间位置插入或删除元素,并且只要求以顺序的方式访问列表元素,那么最

80、好是选择LinkedList。让IT教学更简单,让IT学习更有效5.7.4Iterator接口Iterator集合集合Iterator接口也是Java集合框架中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。通过一个案例来学习如何使用Iterator迭代集合中的元素。让IT教学更简单,让IT学习更有效Iterator集合集合5.7.4Iterator接口需要特别说明的是,当通过迭代器获取ArrayList集合中的元素时,

81、都会将这些元素当做Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型转换。让IT教学更简单,让IT学习更有效5.7.4List接口 Iterator集合集合Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程。让IT教学更简单,让IT学习更有效5.7.5foreach循环JDK5.0新特性新特性foreach循环循环虽然Iterator可以用来遍历集合中的元素,但写法上比较繁琐,为了简化书写,从JDK5.0开始,提供了foreach循环。foreach

82、循环是一种更加简洁的for循环,也称增强for循环。foreach循环用于遍历数组或集合中的元素,其具体语法格式如下:让IT教学更简单,让IT学习更有效5.7.5foreach循环JDK5.0新特性新特性foreach循环循环与for循环相比,foreach循环不需要获得容器的长度,也不需要根据索引访问容器中的元素,但它会自动遍历容器中的每个元素。让IT教学更简单,让IT学习更有效脚下留心1、foreach循环虽然书写起来很简洁,但在使用时也存在一定的局限性。当使用foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改,接下来以一个String类型的数组为例来进行演

83、示。让IT教学更简单,让IT学习更有效脚下留心2、在使用Iterator迭代器对集合中的元素进行迭代时,如果调用了集合对象的remove()方法去删除元素,会出现异常。接下来通过一个案例来演示这种异常。假设在一个集合中存储了学校所有学员的姓名,由于一个名为Annie的学生中途转学,这时就需要在迭代集合时找出该元素并将其删除,具体代码如例程7-6所示。例程7-6在运行时出现了并发修改异常ConcurrentModificationException。这个异常是迭代器对象抛出的,出现异常的原因是集合中删除了元素会导致迭代器预期的迭代次数发生改变,导致迭代器的结果不准确。为了解决上述问题,可以采用两

84、种方式:让IT教学更简单,让IT学习更有效脚下留心第一种方式:从业务逻辑上讲只想将姓名为Annie的学生删除,至于后面还有多少学生我们并不关心,所以只需找到该学生后跳出循环不再迭代即可,也就是在第13行代码下面增加一个break语句,代码如下:在使用break语句跳出循环以后,由于没有继续使用迭代器对集合中的元素进行迭代,因此,集合中删除元素对程序没有任何影响,不会出现异常。让IT教学更简单,让IT学习更有效脚下留心第二种方式:如果需要在集合的迭代期间对集合中的元素进行删除,可以使用迭代器本身的删除方法,将例程7-6中第13行代码替换成it.remove()即可解决这个问题,代码如下:让IT教

85、学更简单,让IT学习更有效5.7.6Set接口Set接口简介接口简介Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。Set接口主要有两个实现类,分别是HashSet和TreeSet。其中,HashSet是根据对象的哈希值来确定元素在集合中的存储的位置,因此具有良好的存取和查找性能。TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行

86、排序。让IT教学更简单,让IT学习更有效5.7.6Set接口1、 HashSet集合集合HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后再调用对象的equals()方法来确保该位置没有重复元素。接下来通过一个案例来演示HashSet集合的用法:让IT教学更简单,让IT学习更有效5.7.6Set接口1、 HashSet集合集合HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作。当调用HashSet集合的add()方法存入

87、元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃。让IT教学更简单,让IT学习更有效5.7.6Set接口1、 HashSet集合集合根据前面的分析不难看出,当向集合中存入元素时,为了保证HasheSet正常工作,要求在存入对象时,需要重写Object类中的hashCode()和equals()方法。

88、例程7-9中将字符串存入HashSet时,String类已经重写了hashCode()和equals()方法。但是如果将Student对象存入HashSet,结果又如何呢?让IT教学更简单,让IT学习更有效5.7.6Set接口1、 HashSet集合集合接下来针对例程7-10中的Student类进行改写,假设id相同的学生就是同一个学生,改写后的代码如例程7-11所示。让IT教学更简单,让IT学习更有效5.7.6Set接口2、 TreeSet集合集合TreeSet是Set接口的另一个实现类,它内部采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,并且可以对元素进行

89、排序。所谓二叉树就是说每个节点最多有两个子节点的有序树,每个节点及其子节点组成的树称为子树,通常左侧的子节点称为“左子树”,右侧的节点称为“右子树”,其中左子树上的元素应小于它的根结点,而右子树上的元素应大于它的根结点。让IT教学更简单,让IT学习更有效5.7.6Set接口2、 TreeSet集合集合二叉树中元素的存储过程:当二叉树中存入新元素时,新元素首先会与第1个元素(最顶层元素)进行比较,如果小于第1个元素就执行左边的分支,继续和该分支的子元素进行比较。如果大于第1个元素就执行右边的分支,继续和该分支的子元素进行比较。如此往复,直到与最后一个元素进行比较时,如果新元素小于最后一个元素就将

90、其放在最后一个元素的左子树上,如果大于最后一个元素就将其放在最后一个元素的右子树上。让IT教学更简单,让IT学习更有效5.7.6Set接口2、TreeSet集合集合假设向集合中存入8个元素,依次为13、8、17、17、1、11、15、25,如果以二叉树的方式来存储,在集合中的存储结构会形成一个树状结构。让IT教学更简单,让IT学习更有效5.7.6Set接口2、 TreeSet集合集合通过一个案例来演示TreeSet对元素的排序效果。让IT教学更简单,让IT学习更有效5.7.6Set接口2、 TreeSet集合集合在TreeSet集合中存放Student类型对象时,如果Student类没有实现C

91、omparable接口,则Student类型的对象将不能进行比较,这时,TreeSet集合就不知道按照什么排序规则对Student对象进行排序,最终导致程序报错。因此,为了在TreeSet集合中存放Student对象,必须使Student类实现Comparable接口。让IT教学更简单,让IT学习更有效5.7.6Set接口2、 TreeSet集合集合定义的类没有实现Comparable接口或者对于实现了Comparable接口的类而不想按照定义的compareTo()方法进行排序,例如,希望字符串可以按照长度来进行排序,这时,可以通过自定义比较器的方式对TreeSet集合中的元素排序,即实现C

92、omparator接口,在创建TreeSet集合时指定比较器。接下来通过一个案例来实现TreeSet集合中字符串按照长度进行排序。让IT教学更简单,让IT学习更有效5.7.7Map接口 Map接口简介接口简介在现实生活中,每个人都有唯一的身份证号,通过身份证号可以查询到这个人的信息,这两者是一对一的关系。在应用程序中,如果想存储这种具有对应关系的数据,则需要使用JDK中提供的Map接口。Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value。让IT教学更简单,

93、让IT学习更有效5.7.7Map接口 Map接口简介接口简介首先了解一下Map接口中定义的一些通用方法。Map接口提供了大量的实现类,最常用的有HashMap和TreeMap,接下来针对这两个类进行详细地讲解。让IT教学更简单,让IT学习更有效5.7.7Map接口1、 HashMap集合集合HashMap集合是Map接口的一个实现类,它用于存储键值映射关系,但必须保证不出现重复的键。让IT教学更简单,让IT学习更有效5.7.7Map接口1、 HashMap集合集合现对例程7-15进行修改,在第7行代码下面增加一行代码,如下所示:map.put(3,Mary);让IT教学更简单,让IT学习更有效

94、5.7.7Map接口1、 HashMap集合集合在程序开发中,经常需要取出Map中所有的键和值,那么如何遍历Map中所有的键值对呢?有两种方式可以实现,第一种方式第一种方式就是先遍历Map集合中所有的键,再根据键获取相应的值。让IT教学更简单,让IT学习更有效5.7.7Map接口1、 HashMap集合集合在程序开发中,经常需要取出Map中所有的键和值,那么如何遍历Map中所有的键值对呢?Map集合的另外一种遍历方式另外一种遍历方式是先获取集合中的所有的映射关系,然后从映射关系中取出键和值。让IT教学更简单,让IT学习更有效5.7.7Map接口1、 HashMap集合集合在Map中,还提供了一

95、个values()方法,通过这个方法可以直接获取Map中存储所有值的Collection集合。让IT教学更简单,让IT学习更有效5.7.7Map接口1、 HashMap集合集合从上面的例子可以看出,HashMap集合迭代出来元素的顺序和存入的顺序是不一致的。如果想让这两个顺序一致,可以使用Java中提供的LinkedHashMap类,它是HashMap的子类,和LinkedList一样也使用双向链表来维护内部元素的关系,使Map元素迭代的顺序与存入的顺序一致。让IT教学更简单,让IT学习更有效5.7.7Map接口2、 TreeMap集合集合TreeMap集合是用来存储键值映射关系的,其中不允许

96、出现重复的键。在TreeMap中是通过二叉树的原理来保证键的唯一性,这个TreeSet集合存储的原理一样,因此TreeMap中所有的键是按照某种顺序排列的。让IT教学更简单,让IT学习更有效5.7.7Map接口2、 TreeMap集合集合在使用TreeMap集合时,也可以通过自定义比较器的方式对所有的键进行排序。让IT教学更简单,让IT学习更有效5.7.7Map接口3、 Properties集合集合Map接口中还有一个实现类Hashtable,它在存取元素时速度很慢,目前基本上被HashMap类所取代。但Hashtable类有一个子类Properties在实际应用中非常重要,Propertie

97、s主要用来存储字符串类型的键和值,在实际开发中,经常使用Properties集合来存取应用的配置项。假设有一个文本编辑工具,要求默认背景色是红色,字体大小为14px,语言为中文,其配置项应该是下面的样子:让IT教学更简单,让IT学习更有效5.7.7Map接口3、 Properties集合集合在程序中可以使用Prorperties集合对这些配置项进行存取,接下来通过一个案例来学习:让IT教学更简单,让IT学习更有效5.7.8JDK5.0新特性泛型1、 为什么使用泛型为什么使用泛型当把一个对象存入集合后,集合会“忘记”这个对象的类型,将该对象从集合中取出时,这个对象的编译类型就变成了Object类

98、型。换句话说,我们在程序中无法确定一个集合中的元素到底是什么类型的。那么在取出元素时,如果进行强制类型转换就很容易出错。让IT教学更简单,让IT学习更有效5.7.8JDK5.0新特性泛型1、 为什么使用泛型为什么使用泛型为了解决这个问题,在Java中引入了“参数化类型(parameterizedtype)”这个概念,即泛型。它可以限定方法操作的数据类型,在定义集合类时,可以使用“”的方式指定该类中方法操作的数据类型。上面这种写法就限定了ArrayList集合只能存储String类型元素,将改写后的程序再次编译,程序在编译时期就会出现错误提示。让IT教学更简单,让IT学习更有效5.7.8JDK5

99、.0新特性泛型1、为什么使用泛型、为什么使用泛型程序编译报错的原因是修改后的代码限定了集合元素的数据类型,ArrayList这样的集合只能存储String类型的元素,程序在编译时,编译器检查出Integer类型的元素与List集合的规定的类型不匹配,编译不通过,这样就可以在编译时期解决错误,避免程序在运行时期发生错误。接下来使用泛型再次对例程7-23进行改写让IT教学更简单,让IT学习更有效5.7.8JDK5.0新特性泛型2、自定义泛型、自定义泛型那么泛型的作用是什么,在程序中是否能自定义泛型呢?让IT教学更简单,让IT学习更有效5.7.8JDK5.0新特性泛型2、自定义泛型、自定义泛型从运行

100、结果可以看出,程序在编译时期就报错,这是因为在代码第13行处存入了一个Integer类型的数据,在代码第14行处取出这个数据时,将该数据转换成了String类型,出现了类型不匹配的错误。为了避免这个问题,就可以使用泛型,如果在定义一个类CachePool时使用声明参数类型,(T其实就是Type的缩写,这里也可以使用其它字符,为了方便理解都定义为T),将save()方法的参数类型和get()方法的返回值类型都声明为T,那么在存入元素时元素的类型就被限定了,容器中就只能存入这种T类型的元素,在取出元素时就无需进行类型转换。让IT教学更简单,让IT学习更有效5.7.8JDK5.0新特性泛型2、 自定

101、义泛型自定义泛型通过一个案例来看一下如何自定义泛型。让IT教学更简单,让IT学习更有效5.8Collections工具类JDK提供了一个工具类专门用来操作集合,这个类就是Collections,它位于java.util包中。Collections类中提供了大量的方法用于对集合中元素进行排序、查找和修改等操作,接下来对这些常用的方法进行介绍。让IT教学更简单,让IT学习更有效5.8Collections工具类1、 排序操作排序操作Collections类中提供了一系列方法用于对List集合进行排序让IT教学更简单,让IT学习更有效5.8Collections工具类1、 排序操作排序操作Colle

102、ctions类中提供了一系列方法用于对List集合进行排序让IT教学更简单,让IT学习更有效5.8Collections工具类2、查找、替换操作、查找、替换操作Collections类还提供了一些常用方法用于查找、替换集合中的元素让IT教学更简单,让IT学习更有效5.8Collections工具类2、查找、替换操作、查找、替换操作Collections类还提供了一些常用方法用于查找、替换集合中的元素让IT教学更简单,让IT学习更有效本章小结本章首先介绍了什么是API,然后对API中最常用的一些类逐一进行了介绍,了解了String和StringBuffer类的不同、System类和Runtime

103、类常用方法的使用、Math类常用方法的使用、Random类如何产生随机数、BigDecimal如何精确地表示和操作小数以及日期类Data和Calendar类的相关知识,并学会使用DateFormat类和SimpleDateFormat类格式化Date对象以及将特定格式的日期字符串解析成Date对象等等,这些类在编程中都有着很重要的作用,然而Java的API非常多,不可能也没有必要把所有的类全部学习不可能也没有必要把所有的类全部学习,最聪明的人是最会利用资源和工具的人,在需要使用这些类时,可以通过上一些技术论坛或者利用搜索引擎参看一些范例参看一些范例,再通过查看查看API文档文档就能很容易掌握这些类的用法。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号