1、Java面向对象程序设计第5章 常用类和集合 教学内容掌握Java系统包中String、StringBuffer等常用的类的应用掌握Collection、List和Set集合接口的应用常用类 常用类是在我们学习和开发Java程序中,常常用到的类,例如:字符与不同数据之间的转换,随机数等,这些类Java系统中提供的。本小节我们将学几个主要的常用类。String类1、String类中的常用构造方法如表类中的常用构造方法如表5.1所示所示:表表5.1构造方法构造方法主要功能主要功能public String()public String()创建一个空的字符串对象。创建一个空的字符串对象。public
2、 String(byte public String(byte bytes)bytes)通过通过bytebyte数组构造字符串对象。数组构造字符串对象。public String(char public String(char value,int offset,value,int offset,int count)int count)从字符数组的第从字符数组的第offsetoffset位将字符串的位将字符串的countcount个字节个字节转化为字符串转化为字符串(从从0 0开始计数开始计数)。public public String(StringBuffer String(StringBuf
3、fer buffer)buffer)通过通过StringBufferStringBuffer数组构造字符串对象。数组构造字符串对象。【例5-1】:通过案例来掌握String类的常用构造方法public class Demo5_01 public static void main(String args)byte b=a,b,c,d,e,f,g,h;char c=0,1,2,3,4,5,6,7,8,9;String sb=new String(b);String sb_b=new String(b,2,4);String sc=new String(c);String sc_c=new Stri
4、ng(c,2,4);String sb_copy=new String(sb);System.out.println(sb:+sb);System.out.println(sb_b:+sb_b);System.out.println(sc:+sc);System.out.println(sc_c:+sc_c);System.out.println(sb_copy:+sb_copy);程序运行结果:1、String类中常用的方法如表5.2所示:表表5.2方法主要功能public char charAt(int index)取字符串中的某一个字符,其中的参数index指的是字符串中序数。字符串的序
5、数从0开始到length()-1public int compareTo(String anotherString)当前String对象与anotherString比较。相等关系返回;不相等时,从两个字符串第0字符开始比较,返回第一个不相等的字符差,另一种情况,较长字符串的前面部分恰巧是较短的字符串,返回它们的长度差public String concat(String str)将该String对象与str连接在一起public boolean endsWith(String suffix)该String对象是否以suffix 结尾public boolean equals(Object an
6、Object)当anObject不为空并且与当前String对象一样,返回true;否则,返回falsepublic void getChars(int srcBegin,int srcEnd,char dst,int dstBegin)该方法将字符串拷贝到字符数组中。其中,srcBegin为拷贝public int indexOf(String str)从左到右配字符串位置public int indexOf(String str,int fromIndex)从fromIndex开始从左到右配字符串位置public int lastIndexOf(String str)从右到左找第一个匹配字
7、符串位置public int lastIndexOf(String str,int fromIndex)从fromIndex开始从右到左找第一个匹配字符串位置public.int length()返回当前字符串长度public boolean startsWith(String prefix)该String对象是否以prefix开始public boolean startsWith(String prefix,int toffset)该String对象从toffset位置算起,是否以prefix开始public String substring(int beginIndex)取从beginIn
8、dex位置开始到结束的子字符串public String substring(int beginIndex,int endIndex)取从 beginIndex位置开始到endIndex位置的子字符串public char toCharArray()将该String对象转换成char数组【例5-2】:通过案例来掌握String类的常用方法public class Demo5_02 public static void main(String arg)String s1=abcdefghijklmn;char c1=s1.charAt(2);int compareTo=pareTo(bcdl);
9、String concat=s1.concat(ABCD);boolean endsWith1=s1.endsWith(mn);boolean endsWith2=s1.endsWith(m);boolean equals=s1.equals(abcdefghijklmn);String s2=abcdefabcdefabcdef;int indexOf1=s2.indexOf(de);int indexOf2=s2.indexOf(de,6);int lastIndexOf1=s2.lastIndexOf(cd);int lastIndexOf2=s2.lastIndexOf(cd,11);
10、int length=s2.length();boolean startsWith1=s2.startsWith(ab);boolean startsWith2=s2.startsWith(ab,6);String substring1=s2.substring(6);String substring2=s2.substring(6,6);char c2=s1.toCharArray();System.out.println(c1=+c1);System.out.println(compareTo=+compareTo);System.out.println(concat=+concat);S
11、ystem.out.println(endsWith1=+endsWith1);System.out.println(endsWith2=+endsWith2);System.out.println(equals=+equals);System.out.println(indexOf1=+indexOf1);System.out.println(indexOf2=+indexOf2);System.out.println(lastIndexOf1=+lastIndexOf1);System.out.println(lastIndexOf2=+lastIndexOf2);System.out.p
12、rintln(length=+length);System.out.println(startsWith1=+startsWith1);System.out.println(startsWith2=+startsWith2);System.out.println(substring1=+substring1);System.out.println(substring2=+substring2);for(char c:c2)System.out.print(c+);程序运行结果:将int、char、boolean、long、float和double六种类型的变量转换为String类型的对象。pu
13、blic static String valueOf(int i)public static String valueOf(boolean b)public static String valueOf(char c)public static String valueOf(double d)public static String valueOf(float f)public static String valueOf(long l)public static String valueOf(Object obj)将String类型的对象转换为int、char、boolean、long、floa
14、t和double六种类型的变量。public static int parseInt(String s);Integer.parseInt(s);public static byte parseByte(String s);Byte.parseByte(s);public static short parseShort(String s);Short.parseShort(s);public static long parseLong(String s);Long.parseLong(s);public static float parseFloat(String s);Float.parse
15、Float(s);public static double parseDouble(String s);Double.parseDouble(s);StringBuffer类当对字符串进行修改的时候,需要使用 StringBuffer 类。和 String 类不同的是,StringBuffer类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuffer可以完成完成字符串的动态添加、插入和替换等操作。StringBuffer类类的造方法的造方法如表如表5.3所示所示:表表5.3构造方法主要功能Public StringBuffer()无参构造方法Public StringBuff
16、er(int capacity)指定容量的字符串缓冲区对象Public StringBuffer(String str)指定字符串内容的字符串缓冲区对象 StringBuffer类类的常用方法的常用方法如表如表5.4所示所示:表表5.4方法主要功能PublicsubString(intstart)返回一个新的String,它包含此序列当前所包含的字符子序列。PubliccharcharAt(intindex)返回此序列中指定索引处的char值Publicappend(Stringstring)将参数里指定的内容追加到此序列中PubliccharcharAt(intindex)返回此序列中指定索
17、引处的char值Publicdelete(intstart,intend)移除此序列的子字符串中的字符。PublicdeletecharAt(intindex)移除此序列指定位置的char。Publicinsert(intoffset,str)表示将括号里的某种数据类型的变量插入某一序列中PublicStringBufferreplace(intstart,intend,Stringstr)用指定的String中的字符替换此序列的子字符串中的StringPublicStringtoString()返回表示此顺序中的数据的字符串。Publicintlength()返回长度(字符数)。【例5-3】
18、:通过案例来掌握StringBuffer类的常用方法public class Demo5_03 public static void main(String args)System.out.println(test1:);test1();System.out.println(test2:);test2();System.out.println(test3:);test3();System.out.println(test4:);test4();System.out.println(test5:);test5();System.out.println(test6:);test6();public
19、 static void test1()StringBuffer sb=new StringBuffer();sb.append(This is a StringBuffer);System.out.print(sb.substring(4)=+sb.substring(4);System.out.println(sb.substring(4,9)=+sb.substring(4,9);public static void test2()StringBuffer sb=new StringBuffer(This is a StringBuffer);System.out.println(sb.
20、charAt(sb.length()-1);public static void test3()StringBuffer sb=new StringBuffer(This is a StringBuffer!);sb.delete(0,5);sb.deleteCharAt(sb.length()-1);System.out.println(sb.toString();public static void test4()StringBuffer sb=new StringBuffer(This is a StringBuffer!);sb.insert(1,W);sb.insert(2,newc
21、har A,B,C);sb.insert(8,abc);sb.insert(6,8);sb.insert(2,true);System.out.println(Insert:+sb.toString();public static void test5()StringBuffer sb=new StringBuffer(This is a StringBuffer!);sb.replace(10,sb.length(),Integer);System.out.println(Replace:+sb.toString();public static void test6()StringBuffe
22、r sb=new StringBuffer(This is a StringBuffer!);System.out.println(sb.reverse();程序运行结果:Math类Math类本身不是静态的,但它的方法以及成员变量都是静态的。Math类的常用方法如表5.5所示:表表5.5方法主要功能public static double abs(double a)返回一个参数的绝对值public static double cbrt(double a)返回参数的立方根public static double ceil(double a)返回大于或等于参数的最小(最接近负无穷大)double值
23、,并等于数学整数public static double floor(double a)返回小于或等于参数的最大(最接近正无穷大)double值,等于数学整数public static double max(double a,double b)返回两个参数值中的较大值public static double min(double a,double b)返回两个参数的较小值public static double pow(double a,double b)将第一个参数的第二个参数次幂public static double random()返回一个double值为正号,大于等于0.0,小于1.
24、0(伪随机选择的)public static double rint(double a)返回与a最接近值的double值,等于数学整数(注意.5的时候会取偶数)public static double sqrt(double a)返回a的正平方根【例5-4】:通过案例来掌握Math类的常用方法public class Demo5_04 public static void main(String args)System.out.print(01abs=+Math.abs(-20.1)+);System.out.println(02abs=+Math.abs(20.1)+);System.out
25、.print(03ceil=+Math.ceil(-20.2)+);System.out.print(04ceil=+Math.ceil(20.8)+);System.out.print(05ceil=+Math.ceil(-0.8)+);System.out.print(06ceil=+Math.ceil(0.0)+);System.out.println(07ceil=+Math.ceil(-0.0)+);System.out.print(08floor=+Math.floor(-60.2)+);System.out.print(09floor=+Math.floor(60.8)+);Sy
26、stem.out.print(10floor=+Math.floor(-0.8)+);System.out.print(11floor=+Math.floor(0.0)+);System.out.println(12floor=+Math.floor(-0.0)+);System.out.print(13max=+Math.max(-60.1,-50)+);System.out.print(14max=+Math.max(50.7,50)+);System.out.println(15max=+Math.max(0.0,-0.0)+);System.out.print(16min=+Math.
27、min(-60.1,-50)+);System.out.print(17min=+Math.min(50.7,50)+);System.out.println(18min=+Math.min(0.0,-0.0)+);System.out.print(19random=+Math.random()+);System.out.println(20random=+Math.random()+);System.out.print(21rint=+Math.rint(80.2)+);System.out.print(22rint=+Math.rint(80.8)+);System.out.print(2
28、3rint=+Math.rint(81.5)+);System.out.print(24rint=+Math.rint(80.5)+);System.out.println(25rint=+Math.rint(80.51)+);System.out.print(26rint=+Math.rint(-80.5)+);System.out.print(27rint=+Math.rint(-81.5)+);System.out.print(28rint=+Math.rint(-80.51)+);System.out.print(29rint=+Math.rint(-80.6)+);System.ou
29、t.println(30rint=+Math.rint(-80.2)+);System.out.print(31round=+Math.round(80.2)+);System.out.print(32round=+Math.round(80.8)+);System.out.print(33round=+Math.round(80.5)+);System.out.print(34round=+Math.round(80.51)+);System.out.println(35round=+Math.round(-80.5)+);System.out.print(36round=+Math.rou
30、nd(-80.51)+);System.out.print(37round=+Math.round(-80.6)+);System.out.println(38round=+Math.round(-80.2)+);System.out.print(39cbrt=+Math.cbrt(36)+);System.out.print(40sqrt=+Math.sqrt(8)+);程序运行结果:Random类Random类的实例用于生成伪随机数的流。Random类的构造方法如表类的构造方法如表5.6所示:所示:表表5.6构造方法主要功能Public Random()该构造方法使用一个和当前系统时间对应
31、的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。Public Random(long seed)该构造方法可以通过制定一个种子数进行创建,种子数只是随机算法的起源数字,和生成的随机数字的区间无关。Random类的常用方法如表类的常用方法如表5.7所示:所示:表表5.7方法主要功能protected int next(int bits)生成下一个伪随机数。当被所有其他方法使用时,子类应该重写此方法public int nextInt()返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。nextInt 的常规协定是,伪随机地生成并返回一个 int 值。所
32、有 232 个可能 int 值的生成概率(大致)相同public float nextFloat()返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 float 值public double nextDouble()返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 double 值【例5-5】:通过案例来掌握Random类的常用方法import java.util.Random;public class text5_5 public static void main(String args)Random rand1
33、=new Random();Random rand2=new Random(20);for(int i=0;i10;i+)int m=rand1.nextInt(20);int n=rand2.nextInt(20);System.out.println(第+(i+1)+次 m=+m+,n=+n);程序运行结果:Date类我们经常要处理有关日期和时间的信息,这时候你可以使用java.util中的Date类,Date类并不仅仅表示日期,而是精确到毫秒。此外,由于在java.sql中存在一个同名的Date类,此类是用来描述数据库中的时间字段 1、Date的常用构造方法如表5.8所示:表表5.8构造
34、方法主要功能public Date()构造一个Date对象并对其进行初始化以反映当前时间public Date(long date)构造一个Date对象,并根据相对于GMT 1970年1月1日00:00:00的毫秒数对其进行初始化 2、Date的常用的方法如表5.9所示:表表5.9方法主要功能public boolean before(Date when)测试此日期是否在指定日期之前public boolean after(Date when)测试此日期是否在指定日期之后public long getTime()返回自1970年1月1日以来,由 Date对象表示的00:00:00 GMT的毫秒
35、数public void setTime(long time)按照相对于GMT 1970年1月1日00:00:00的毫秒数设置这个Date对象public int compareTo(Date anotherDate)比较两个日期进行订购public String toString()格式化日期转义格式yyyy-mm-dd【例5-6】:通过案例来掌握Date类的常用方法import java.util.Date;public class Demo5_06 public static void main(String args)Date date=new Date();System.out.pr
36、intln(toString:+date.toString();System.out.println(getTime:+date.getTime();date.setTime(999101585);System.out.println(toString:+date.toString();System.out.println(getTime:+date.getTime();程序运行结果:Vector类Vector的构造方法如表5.10所示:表表5.10构造方法主要功能public Vector()构造一个空向量,使其内部数据数组的大小为 10,标准容量增量为零public Vector(inti
37、nitialCapacity)构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零public Vector(int initialCapacity,int capacityIncrement)使用指定的初始容量和容量增量构造一个空的向量 Vector类的常用方法如表类的常用方法如表5.11所示:所示:表表5.11方法主要功能public boolean add(E e)将指定的元素追加到此Vector的末尾public void add(int index,E element)在此Vector中的指定位置插入指定的元素public void clear()从此Vector中删除
38、所有元素。此调用返回后,Vector将为空(除非引发异常)public boolean removeAll(Collection c)从此Vector中删除指定集合中包含的所有元素public int indexOf(Object o)返回此向量中指定元素的第一次出现的索引,如果此向量不包含元素,则返回-1public int indexOf(Object o,int index)返回此向量中指定元素的第一次出现的索引,从index向前index,如果未找到该元素,则返回-1。public int lastIndexOf(Object o)返回此向量中指定元素的最后一次出现的索引,如果此向量不
39、包含元素,则返回-1public int lastIndexOf(Object o,int index)返回此向量中指定元素的最后一次出现的索引,从index,如果未找到该元素,则返回-1public int size()返回此向量中的组件数public void setSize(int newSize)设置此向量的大小public E get(int index)返回此向量中指定位置的元素【例5-7】:通过案例来掌握Vector类的常用方法import java.util.Vector;public class Demo5_07 public static void main(String
40、args)Vector v=new Vector(4);v.add(ABC);v.add(def);v.add(ghi);v.add(jkl);v.add(mno);int size1=v.size();System.out.println(size1:+size1);for(int i=0;i v.size();i+)System.out.print(i+:+v.get(i)+);System.out.println();v.remove(jkl);v.remove(0);int size2=v.size();System.out.println(size2:+size2);for(int
41、i=0;i v.size();i+)System.out.print(i+:+v.get(i)+);程序运行结果:集合集合类存放于java.util包中。集合就是存放数据的容器,集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。集合类型主要有3种:set(集)、list(列表)和map(映射)。集合比数组的优势:1、集合可以存储任意类型的对象数据,数组只能存储同一种数据类型的数据。2、集合的长度是会发生变化的,数组的长度是固定的。CollectionCollection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空
42、、遍历(读取)、是否为空、获取大小、是否保护某元素等等。Collection接口的所有子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。带参数的构造函数,可以用来转换Collection的类型。在Collection接口之中一共定义了15个方法,在所有的方法之中,只有两个方法最为常用:add()、iterator()。不过很少会去直接使用Collection,都会使用Collection的两个子接口:List、Set。Collcetion接口要实现的方法如表接口要实现的方法如表5.12所示:所示:表表5.12方法主要功能boolea
43、n add(E e)确保此集合包含指定的元素(可选操作)boolean addAll(Collection c)将指定集合中的所有元素添加到此集合(可选操作)void clear()从此集合中删除所有元素(可选操作)boolean contains(Object o)如果此集合包含指定的元素,则返回 trueboolean containsAll(Collection c)如果此集合包含指定 集合中的所有元素,则返回trueboolean equals(Object o)将指定的对象与此集合进行比较以获得相等性int hashCode()返回此集合的哈希码值boolean isEmpty()如
44、果此集合不包含元素,则返回 trueIterator iterator()返回此集合中的元素的迭代器default Stream parallelStream()返回可能并行的 Stream与此集合作为其来源boolean remove(Object o)从该集合中删除指定元素的单个实例(如果存在)(可选操作)boolean removeAll(Collection c)删除指定集合中包含的所有此集合的元素(可选操作)default boolean removeIf(Predicate filter)删除满足给定谓词的此集合的所有元素boolean retainAll(Collection c
45、)仅保留此集合中包含在指定集合中的元素(可选操作)int size()返回此集合中的元素数default Spliterator spliterator()创建一个Spliterator在这个集合中的元素default Stream stream()返回以此集合作为源的顺序 StreamObject toArray()返回一个包含此集合中所有元素的数组 T toArray(T a)返回包含此集合中所有元素的数组;返回的数组的运行时类型是指定数组的运行时类型List在实际的应用中如果使用到队列,栈,链表,首先可以想到使用List。不同的场景下面使用不同的工具,效率才能更高!List是一个有序,可
46、以方重复的数据的集合。1、当集合中对插入元素数据的速度要求不高,但是要求快速访问元素数据,则使用ArrayList!2、当集合中对访问元素数据速度不做要求不高,但是对插入和删除元素数据速度要求高的情况,则使用LinkedList!3、当集合中有多线程对集合元素进行操作时候,则使用Vector!但是现在BVector现在一般不再使用,如需在多线程下使用,可以用CopyOnWriteArrayList,在java.util.concurrent包下。4、当集合中有需求是希望后保存的数据先读取出来,则使用Stack!按照面向对象的概念来讲,现在使用ArrayList主要的目的是为List接口实例化,
47、所有的操作方法都以List接口为主。List的方法大部分是从Collection继承而来的。【例5-8】:通过案例来掌握List类的使用方法import java.util.ArrayList;import java.util.List;interface Animal public String getName();public int getAge();class Dog implements Animal private String name;private int age;public Dog(String name,int age)this.name=name;this.age=a
48、ge;public String getName()return this.name;public int getAge()return this.age;public String toString()return狗的信息名字:+name+,年龄:+age;public boolean equals(Object obj)if(this=obj)return true;if(obj=null)return false;if(!(obj instanceof Dog)return false;Dog dog=(Dog)obj;if(this.name.equals(dog.name)&this
49、.age=dog.age)return true;return false;class Cat implements Animal private String name;private int age;public Cat(String name,int age)this.name=name;this.age=age;public String getName()return this.name;public cint getAge()return this.age;public String toString()return猫的的信息名字:+name+,年龄:+age;public boo
50、lean equals(Object obj)if(this=obj)return true;if(obj=null)return false;if(!(obj instanceof Cat)return false;Cat c=(Cat)obj;if(this.name.equals(c.name)&this.age=c.age)return true;return false;public class Demo5_08 public static void main(String args)List zooList=new ArrayList();zooList.add(new Dog(牧