1、第第5 5章章 常用系统类常用系统类 5.1 5.1 基本数据类型包装类基本数据类型包装类 5.2 5.2 字符串字符串 5.3 Collection API5.3 Collection API简介简介 5.4 Stream5.4 Stream5.5 5.5 日期和时间日期和时间 5.1 5.1 基本数据类型包装类基本数据类型包装类基本数据类型 数据类型包装类boolean Boolean char Character double Double float Float long Long int Integer short Short byte Byte(1)(1)包装类的构造方法包装类的构
2、造方法 例:Integer类public Integer(int value)public Integer(String s)举例,Integer x=new Integer(123);创建一个包装了整数创建一个包装了整数123123的的IntegerInteger对象对象(2)(2)从包装对象中抽取相应的数据从包装对象中抽取相应的数据每个包装类均提供有相应的方法Boolean类的对象,可以调用booleanValue()方法 Integer类的对象,可以调用intValue()方法Character的对象,可以调用charValue()方法例如:Integer x=new Integer(3
3、46);int m=x.intValue();(3)(3)包装类的包装类的STATICSTATIC方法方法Character类提供有isDigit(char ch)可判断某字符是否为数字;isLetter(char ch)可判断某字符是否为字母。除Character类外的所有包装类均提供有静态方法 valueOf(String s),它将得到一个相应类型的对象。例如:Long.valueOf(23)返回包装了数据值23的Long类型对象。静态方法静态方法:PARSEPARSEXXX()XXX()方法方法 static byte Byte.parseByte(String s)static sh
4、ort Short.parseShort(String s)static int Integer.parseInt(String s)static long Long.parseLong(String s)static float Float.parseFloat(String s)static double Double.parseDouble(String s)补充:别的进制数据分析Integer.parseInt(Strings,intradix)例如,int x=Integer.parseInt(a8,16);将数字字符串分析得到整数 某个进制,例:2,8,16x的值为168Integ
5、er类的toString(inti,intradix)方法返回一个整数的某种进制表示形式。例如:Integer.toString(12,8)的结果为14 Integer.toString(12,16)的结果为 C八进制十六进制写出程序的运行结果写出程序的运行结果public class test public static void main(String args)String s=12;int x=Integer.parseInt(s);boolean y=Character.isDigit(s.charAt(0);System.out.println(x+1);System.out.pr
6、intln(s+1);System.out.println(y);13121true S STRINGTRING类主要用于对字符串内容的检索、比较类主要用于对字符串内容的检索、比较等操作,操作的结果通常得到一个新字符串,但等操作,操作的结果通常得到一个新字符串,但不不会改变源串的内容会改变源串的内容 .构造方法有如下4个:public String()public String(String s)public String(StringBuffer buf)public String(char value)5.2.1 String类类 字符串类字符串类举例:举例:String s=new St
7、ring(ABC);String s=ABC;char helloArray=h,e,l,l,o;String helloString=new String(helloArray);String类类比较两个字符串比较两个字符串 boolean equals(Object anObject)int compareTo(String anotherString)boolean equalsIgnoreCase(String anotherString)String类类 INTINT COMPARECOMPARET TO O(S(STRINGTRING ANOTHERANOTHERS STRINGT
8、RING)public class TestString public static void main(String a)String x=hello1;String y=hello2;int result=pareTo(y);System.out.println(result);-1String类类 BOOLEANBOOLEAN EQUALSEQUALS(O(OBJECTBJECT ANANO OBJECTBJECT)String s1=Hello!World;String s2=Hello!World;boolean b1=s1.equals(s2);boolean b2=(s1=s2)
9、;String类类String s1=Hello!World;String s2=new String(Hello!World);boolean b1=s1.equals(s2);boolean b2=(s1=s2);String类类3.3.字符串的其它常用方法字符串的其它常用方法 (1)求字符串长度 length()String s=Hello!;System.out.println(s.length();(2)字符串的连接,利用“+”运算符 String s=4+3=;s=s.concat(7);(3)前缀和后缀的处理 boolean startsWith(String prefix)bo
10、olean endsWith(String prefix)String trim()String类类3.3.字符串的其它常用方法字符串的其它常用方法(续续1)1)(4)字符串中单个字符ch的查找 int indexOf(int ch)int lastIndexOf(int ch)int indexOf(int ch,int fromIndex)int lastIndexOf(int ch,int fromIndex)String类类考察以下程序的运行结果考察以下程序的运行结果 String s=Java 是面向对象的语言,Javascript是脚本语言;int k=-1;do k=s.inde
11、xOf(是,k+1);System.out.print(k+t);while(k!=-1);运行结果为:运行结果为:5 24 -1 String类类3.3.字符串的其它常用方法字符串的其它常用方法 (续续2 2)(5)字符串中子串str的查找 int indexOf(String str)int lastIndexOf(String str)int indexOf(String str,int fromIndex)int lastIndexOf(String str,int fromIndex)String类类考虑以下程序段运行结果考虑以下程序段运行结果 String s=Java是面向对象的
12、语言,Javascript是脚本语言;String sub=语言;for(int i=s.length();i!=-1;)i=s.lastIndexOf(sub,i-1);System.out.print(i+t);结果为:结果为:26 10 -1 String类类3.3.字符串的其它常用方法字符串的其它常用方法 (续续3 3)(6)字符串的替换与提取String replace(char oldchar,char newchar)String replaceAll(String regex,String replacement)char charAt(int index)String sub
13、string(int beginIndex,int endIndex)String substring(int beginIndex)String类类例例5-1 5-1 从一个代表带有路径的文件名中分离出文件名从一个代表带有路径的文件名中分离出文件名和路径和路径 public class GetFilename private String fullpath;private final char pathSeparator=;public GetFilename(String fname)fullpath=fname;/*获取文件名,文件名是最后一个分隔符后面的子串*/public Strin
14、g getname()int pos=fullpath.lastIndexOf(pathSeparator);if(pos=-1)return fullpath;return fullpath.substring(pos+1);转义字符转义字符String类类例例5-2 5-2 从一个代表带有路径的文件名中分离出文从一个代表带有路径的文件名中分离出文件名和路径件名和路径 (续)续)public String getPath()int pos=fullpath.lastIndexOf(pathSeparator);if(pos=-1)return null;return fullpath.sub
15、string(0,pos);public static void main(String ags)GetFilename fn=new GetFilename(d:javaexampletest.java);System.out.println(filename=+fn.getname();System.out.println(filepath=+fn.getPath();d:javaexampleTest.javaString类类 SPLITSPLIT用来根据指定分隔符分离字符串用来根据指定分隔符分离字符串格式:public String split(String regex)例如:对于字符
16、串str=boo:and:foo:bye split(“:”)的结果为:boo,and,foo,“bye 而split(“o”)的结果为:b,:and:f,:bye String类类1.1.创建创建S STRINGTRINGB BUFFERUFFER对象对象 public StringBuffer()public StringBuffer(int length)public StringBuffer(String str)5.2.2 StringBuffer类类 2.S2.STRINGTRINGB BUFFERUFFER的主要方法的主要方法 public StringBuffer append
17、(Object obj)public StringBuffer insert(int position,Object obj)public StringBuffer setCharAt(int position,char ch)public StringBuffer deleteCharAt(int position)StringBuffer replace(int start,int end,String str)String substring(int start,int end)StringBuffer类类思考以下代码段对应的运行结果思考以下代码段对应的运行结果 StringBuffer
18、 str1=new StringBuffer();str1.append(Hello,mary!);str1.insert(6,30);System.out.println(str1.toString();结果为:结果为:Hello,30mary!StringBuffer类类例例5-2 5-2 将一个字符串反转将一个字符串反转 public class StringsDemo public static void main(String args)String s=Dot saw I was Tod;int len=s.length();StringBuffer dest=new String
19、Buffer(len);for(int i=(len-1);i=0;i-)dest.append(s.charAt(i);System.out.println(dest.toString();StringBuffer类类String des=;for(int i=(len-1);i=0;i-)des=des+s.charAt(i);C COLLECTIONOLLECTION API API的接口层次的接口层次 (1 1)C COLLECTIONOLLECTION接口接口 boolean add(Object o)boolean contains(Object o)boolean isEmpty
20、()Iterator iterator():boolean remove(Object o)int size()Object toArray()void clear()(2 2)S SETET接口接口 是数学上集合模型的抽象,特点有两个:一是不含重复元素,二是无序(3)List接口接口 类似于数学上的数列模型,也称序列。其特点是类似于数学上的数列模型,也称序列。其特点是可含重复元素可含重复元素,而且是,而且是有序有序的。用户可以控制向的。用户可以控制向序列中某位置插入元素。并可按元素的顺序访问序列中某位置插入元素。并可按元素的顺序访问它们。它们。【例例5-3 5-3】S SETET接口用法接口
21、用法 import java.util.*;public class TestSet public static void main(String args)HashSet h=new HashSet();h.add(Str1);h.add(new Integer(12);h.add(new Double(4.2);h.add(Str1);h.add(new String(Str1);System.out.println(h);4.2,str1,12 4.2,str1,12表1 LIST接口中定义的常用方法方方 法法功功 能能void add(E void add(E elemelem)在尾部
22、添加元素在尾部添加元素void void add(add(intint pospos,E,E elemelem)在指定位置增加元素在指定位置增加元素E E getget(intint pospos)获取指定位置元素获取指定位置元素E setE set(intint pospos,E,E elemelem)修改指定位置元素修改指定位置元素E E remove(remove(intint pospos)删除指定位置元素删除指定位置元素intint indexOfindexOf(Object(Object objobj,intint start_posstart_pos)从某位置开始向后查找元素位置
23、从某位置开始向后查找元素位置intint lastIndexOflastIndexOf(Object(Object objobj,intint start_posstart_pos)从某位置开始由尾向前查找元素位置从某位置开始由尾向前查找元素位置ListIteratorListIterator listIteratorlistIterator()()返回列表的返回列表的ListIteratorListIterator对象对象(returns the item removed)A ARRAYRRAYL LISTIST类和类和L LINKEDINKEDL LISTIST类类import java.
24、util.*;public class TestList public static void main(String args)ArrayList a=new ArrayList();a.add(Str1);a.add(12);a.add(4.2);a.add(Str1);a.add(new String(Str1);Iterator p=a.iterator();while(p.hasNext()System.out.print(p.next()+,);【例5-4】ArrayList的使用Str1,12,4.2,Str1,Str1,【例例5-55-5】A ARRAYRRAYL LISTIS
25、T和和L LINKEDINKEDL LISTIST的使用测试。的使用测试。import java.util.*;public class ListDemo static final int N=50000;static long timeList(List st)long start=System.currentTimeMillis();for(int i=0;i N;i+)st.add(0,new Integer(i);return System.currentTimeMillis()-start;public static void main(String args)System.out.
26、println(time for ArrayList=+timeList(new ArrayList();System.out.println(time for LinkedList=+timeList(new LinkedList();修改为add(obj),如何?写出程序运行结果写出程序运行结果import java.util.*;public class Test2 public static void main(String args)ArrayList a=new ArrayList();a.add(new Integer(12);a.add(hello);a.add(23);Ite
27、rator p=a.iterator();while(p.hasNext()System.out.print(p.next();12hello23I ITERATORTERATOR接口接口 boolean hasNext()判断容器中是否存在下一个可访问元素 Object next()返回要访问的下一个元素 void remove()用于删除迭代子返回的最后一个元素。该方法只能在每次执行next()后执行一次 5.3.25.3.2 C COLLECTIONSOLLECTIONS类类 它包含有针对Collection(收集)操作的众多静态方法addAll(Collection c,T.eleme
28、nts):将指定元素添加到指定收集中。sort(List list):根据元素的自然顺序对指定列表按升序进行排序。sort(List list,Comparator c):根据指定比较器产生的顺序对指定列表进行排序。max(Collection coll):根据元素的自然顺序,返回给定收集的最大元素。min(Collection coll):根据元素的自然顺序返回给定收集的最小元素。disjoint(Collection c1,Collection c2):如果两个指定收集中没有相同的元素,则返回 true,否则返回falsefrequency(Collection c,Object o):返
29、回指定收集中等于指定对象的元素数。【例例5-65-6】列表元素的排序测试列表元素的排序测试import java.util.*;public class CollectionsTest public static void main(String args)List mylist=new ArrayList();for(char i=a;i g;i+)mylist.add(String.valueOf(i);Collections.addAll(mylist,S,12);Collections.sort(mylist);System.out.println(mylist);Collection
30、s.sort(mylist,new Comparator1();System.out.println(mylist);用比较算子排序自然排序class Comparator1 implements Comparator public int compare(String s1,String s2)s1=s1.toLowerCase();/字符串全部字符换小写s2=s2.toLowerCase();return pareTo(s2);【运行结果】12,S,a,b,c,d,e,f12,a,b,c,d,e,f,S5.3.3 M5.3.3 MAPAP 接口及实现层次接口及实现层次 Map中实际上包括了
31、关键字、值以及它们的映射关系的集合,可分别使用如下方法得到:public Set keySet():关键字的集合。public Collection values():值的集合。public SetMap.Entry entrySet():关键字和值的映射关系的集合。姓名姓名(Key)(Key)考试成绩考试成绩(Value)(Value)张三83李四65王五78MMAPAP中还定义了对中还定义了对MMAPAP数据集合的操作方法数据集合的操作方法publicvoidclear():清空整个数据集合;publicVget(Kkey):根据关键字得到对应值;publicVput(Kkey,Vvalu
32、e):加入新的“关键字-值”;publicVremove(Objectkey):删除Map中关键字所对应的映射关系;publicbooleanequals(Objectobj):判断Map对象与参数对象是否等价,两个Map相等,当且仅当其entrySet()得到的集合是一致的。publicbooleancontainsKey(Objectkey):判断在Map中是否存在与关键字匹配的映射关系。publicbooleancontainsValues(Objectvalue):判断在Map中是否存在与键值匹配的映射关系。实现Map接口的类有很多,其中最常用的有HashMap和HashTable,两
33、者使用上的最大差别是HashTable是线程访问安全的。HashTable还有个子类Properties,关键字和值只能是String,经常被用来读取配置信息。【例例5-7 5-7】MMAPAP接口的使用接口的使用import java.util.*;public class MapDemo public static void main(String args)Map m=new HashMap();m.put(2003011,张三);m.put(2003012,李四);m.put(2003013,王五);Set allEntry=m.entrySet();for(Iterator i=al
34、lEntry.iterator();i.hasNext();)System.out.println(i.next();System.out.println(m.get(2003012);2003011=张三2003012=李四2003013=王五李四5.4 Stream API Java 8 中的 Stream 是对集合对象功能的增强。Stream 表示能应用在一组元素上执行的操作序列。Stream 的创建需要指定一个数据源.如,Collection的子类,List或者Set,Map不支持。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stre
35、am本身。Stream的操作可以串行执行或者并行执行。有多种方式生成 STREAM 源通过调用Collection接口的默认方法stream()或parallelStream()方法可分别创建串行流和并行流。并行流也可以在创建流后通过执行parallel()方法得到。例如,以下代码由字符串列表创建流。List str=Arrays.asList(bird,boy,word,book,work);Stream strStream=str.stream();Stream接口提供的of(T)方法也可创建流对象等。例如:Stream stream=Stream.of(a,b,c);对于基本数据类型的数
36、据,还有IntStream、LongStream、DoubleStream 等原生流。以下代码创建一个Stream,然后转换为原生流IntStream。Stream integerstream=Stream.of(1,2,3);IntStream intstream=integerstream.mapToInt(Integer:parseInt);Arrays.stream(T array)用于由数组创建流对象。例如:int arr=1,2,3,4,5,6,7,8;IntStream stream=Arrays.stream(arr);Stream操作可以是中间操作,也可以是最终操作。Stre
37、am 操作如果有参数的话,必须是Lambda 表达式形式。最终操作会返回一个某种类型的值,而中间操作可有多个,它们返回变换后的流对象中间操作有filter()、sorted()、map()、distinct()等,一般是对数据集的整理(过滤、排序、匹配、抽取等),返回值一般也是数据集。中间操作(1)filter操作操作filter方法接受方法接受Predicate接口类型的参数,将所有流对象接口类型的参数,将所有流对象中的元素进行过滤。例如中的元素进行过滤。例如:strStream.filter(s)-s.startsWith(w)/以字符以字符w开头的开头的单词单词.forEach(Syst
38、em.out:println);在输出结果中包含的单词有在输出结果中包含的单词有:word,work。map方法含Function类型的参数,对流中每个元素按指定的函数进行转换。例如:strStream.map(String:toUpperCase)/所有字符转为大写.forEach(System.out:println);在输出结果中单词依次为:BIRD,BOY,WORD,BOOK,WORK。与map类似的操作还有mapToInt、mapToLong、mapToDouble,它们会通过ToIntFunction、ToLongFunction、ToDoubleFunction类型的参数将流转换
39、为原生流。每个转换会接受一个T,并返回相应的基本类型值(2)map操作操作(3)distinct操作从流中删除重复元素。根据equals方法,所有重复元素只保留一个。例如:strStream.map(s)-s.substring(0,1)/结果串为串的首字符.distinct().forEach(System.out:println);输出内容按次序为:b,w。(4)sorted操作用于对流数据排序,返回一个排过序的流对象。该操作有两种形态,一种是无参,会默认按照自然顺序对流中的元素进行排序,第2种形态是含有一个Comparator类型的参数,按指定的Comparator所定义的规则进行排序。
40、例如:strStream.sorted()/按自然顺序排序.forEach(System.out:println);在输出结果中单词依次为:bird,book,boy,word,work。例5-8 计算数据排序开销import java.util.*;class SortTime public static void main(String agrs)int max=100000;/10万个数据List a=new ArrayList();for(int i=0;i max;i+)int x=(int)(Math.random()*8000);a.add(x);long t0=System.c
41、urrentTimeMillis();/排序前时刻long count=a.parallelStream().sorted().count();/并行/long count=a.stream().sorted().count();/串行System.out.println(System.currentTimeMillis()-t0)+ms);最终方法有:forEach(),allMatch()、anyMatch()、findAny()、findFirst(),count()、max()、min()、reduce()、collect()等。其中,findAny、max/min、reduce 等方
42、法等返回 Optional 值。count()返回Stream中元素的个数,返回值类型是long。reduce()方法的主要作用是把 Stream 元素组合起来。依照运算规则和 Stream 的第一个、第二个、第 n 个元素组合。collect()方法可将流转换为其它数据结构。List list1=stream.collect(java.util.stream.Collectors.toList();(1)match操作 match操作有多种不同的类型,分别是allMatch()、anyMatch()、noneMatch(),其中均含有Predicate类型的参数,所有的match操作返回一个
43、boolean类型的结果。anyMatch在找到与规则匹配的元素时返回true,否则返回false;allMatch找到不满足规则的元素时返回true,否则返回false;noneMatch找到满足规则的元素时返回false,否则返回true。例如:boolean r1=strStream.anyMatch(s)-s.startsWith(w);System.out.println(r1);/结果为true(2)汇集方法 该类方法完成数据的各类统计处理,count()操作返回一个数值,用来标识当前流对象中包含的元素数量。例如:long x1=strStream.filter(s)-s.star
44、tsWith(b).count();System.out.println(x1);/输出结果为3 对于IntStream、LongStream和DoubleStream等原类型流,提供有sum()用于求和,它返回的是相应类型的数据值。而max()、min()、average()则分别用于求最大、最小和平均值,这几个方法返回 Optional 值,Optional是一个可以包含null值在内的容器对象,用其get()方法可获取容器的对象,它的ifPresent(Consumer)方法在值存在时将容器元素提供给参数Consumer处理。【例】求最大整数import java.util.*;publ
45、ic class B public static void biggest(Integer.numbers)List x=Arrays.asList(numbers);Optional c=x.stream().max(Integer:compareTo);System.out.println(result is:+c);public static void main(String args)biggest(7,13,32,5,17,5,4,7,7);Optional是一个可以为null的容器对象。用其get()方法获取内容。result is:Optional32特别地,对于IntStrea
46、m等原生流,max()操作不带参数,其结果为OptionalInt对象,可通过getAsInt()方法获取整数值。average()操作的结果是OptionalDouble对象,要获取其中的数据需要通过getAsDouble()方法。以下代码求一组整数的平均值。IntStream stream=IntStream.of(1,2,3,4);/原生流OptionalDouble r=stream.average();double x=r.getAsDouble();System.out.println(平均:+x);(3)reduce操作reduce方法的参数为BinaryOperator类型,r
47、educe方法用于通过某一个方法,对元素进行归并处理,最后的结果为Optional类型的值。IMPORT JAVA.UTIL.*;PUBLIC CLASS B PUBLIC STATIC VOID MAIN(STRING ARGS)LIST X=ARRAYS.ASLIST(100,200,300,400);INT BILL=X.STREAM().REDUCE(SUM,COST)-SUM+COST).GET();SYSTEM.OUT.PRINTLN(TOTAL:+BILL);结果:TOTAL:1000【例5-10】汇总求和累加所有元素值(4)collect操作collect操作将流所有数据值收集
48、到可变容器中,该方法的参数是Collector接口的实例,通常采用Collectors类的如下几个静态方法作为collect操作的参数。Collectors.toSet():结果收集到集合中;Collectors.toList():结果收集到列表中;Collectors.toMap(Function,Function):结果收集到Map中。流的每个成员均接收一个从T到K的键抽取函数以及从T到U的值抽取函数。例如,以下代码将前面定义流的数据收集到列表中。List r=strStream.collect(Collectors.toList();System.out.println(r);则输出结果
49、为:bird,boy,word,book,work5.5.1 D5.5.1 DATEATE类类 Date():创建一个代表当前时间的日期对象;Date(long date):根据毫微秒值创建日期对象。执行日期对象的toString()方法将按星期、月、日、小时、分、秒、年的默认顺序输出相关信息,例如:Sun Oct 31 16:28:04 CST 2004 int compareTo(Date anotherDate):结果为0代表相等;为负数代表日期对象比参数代表的日期要早;为正数则代表日期对象比参数代表的日期要晚。5.5.25.5.2 C CALENDARALENDAR类类 Calenda
50、r是一个抽象类,不能直接创建对象,但可以使用静态方法获得代表当前日期的日历对象。Calendar rightNow=Calendar.getInstance();void set(int year,int month,int date)void set(int year,int month,int date,int hour,int minute,int second)int get(int field)其中,参数field的值由Calendar类的静态常量决定,例如:YEAR代表年;MONTH代表月;DAY_OF_WEEK代表星期几;HOUR代表小时;MINUTE代表分;SECOND代表秒等