工具类及常用算法.ppt
Java程序设计第7章 工具类及常用算法Java基础类库nJDK中提供的基础类库又称为JFC(java Foundation Class Library),其中包含很多包,每个包中都有若干特定功能和相互关系的类和接口。一些经常使用的包为:java.lang包包/默认加载的包默认加载的包java.io包包java.util包包java.awt包包java.applet包包包包 Java语言基础类n java.lang这个包包含了运行程序不可少的类,包括基本数据类,基本数学类,字符串处理,异常处理等等。该包在程序时自动引入。n java.io标准的输入输出类库,包含程序与系统,用户以及其他程序做的数据交换使用的类,包括基本I/O,文件I/O等。完成与操作系统有关的I/O操作需要用到该包。Java语言基础类n java.util包括一些实用工具,如Date类,Vector类,Stack类等。使用它们可以方便编程。n java.awt图形用户界面(GUI)类库。包括许多界面和资源,如Graphics类,Container类等等。可以利用该包编写标准化的应用程序界面。n java.applet用来实现运行于浏览器中的Java Applet的工具类库,常用的类是。Java语言基础类n其他包还有一些其他的包,如java.rmi是实现远过程调用功能,可以在远程机器上创建对象,在本地机器上使用;java.sql包是实现JDBC的类库。利用这个包可以是程序访问不同类型的数据库。只要安装了对应的驱动程序,同一个程序就可以访问不同的数据库。如果想要详细了解这些系统的类库,可以参考JDK的文档。Java语言基础类nObject类Object类是所有类的直接或间接父类,也是类库当中所有类的父类,可以和任意类型的对象匹配。所以可以用它作为形参的类型,那么不论何种类型的实际参数都可以与这个形参匹配,从而扩大了方法得适用范围。常用得方法:protected Object clone();/生成当前对象得备份public boolean equals(Object obj);/比较两个对象public String toString();/返回当前对象得相关信息 Java语言基础类n equals方法该方法用来比较两个对象是否相同,相同返回true,否则返回false。如果一个类没有覆盖equals方法,那么这时候的相等是指两个引用相等,也就是说他们引用的是同一个对象。Java语言基础类n equals方法运算符关系运算符生成的是一个“布尔”结果。它评价的是运算对象值之间的关系。运算符适用于所有对象,但它的含义通常会使人找不到北。(见例子)一般人都会认为输出结果肯定先是true,再是false,因为两个Integer对象都是相同的。但尽管对象的内容相同,句柄却是不同的,而=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。Java语言基础类n equals方法若想对比两个对象的实际内容实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()。(例子)正如我们预计的那样,此时得到的结果是true。但事情并未到此结束!假设您创建了自己的类,就象下面这样(举例)此时的结果又变回了false!这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals(),否则不可能表现出我们希望的行为。大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。Java语言基础类n equals方法总结的来讲,也就是说:equals()默认的是比较句柄,因为JDK中的许多类在实现的时候都覆盖了equals()方法,所以一般使用java类库中的equals时,比较的是对象的内容;但是,如果用户自己定义一个类,又没有改写equals()方法,那么它比较的是句柄,除非用户自己写equals()方法来使得它的功能为比较对象的内容。Java语言基础类n toString()toString()方法用来返回对象的字符串表示,可以用来显示一个对象。System.out.println()方法如果带的参数是一个对象对象的话,那么它会自动调用对象的toString()方法,那么它显示的将是“类名内存地址”。在自定的类中一般来讲覆盖toString()方法。(举例 2个)Java语言基础类n 基本数据类型包装类java中提供了基本数据类型的包装类,以于面向对象的思想一致。对应的也有8种:Character,Byte,Short,Integer,Long,Float,Double,Boolean。他们都是作为类来使用。1、提供一些常数方便使用,Integer.MAX_VALUE,Double.NaN等。2、提供valueOf(String),toString()3、通过xxxValue()得到所包装的值4、对toString(),equals()等方法进行覆盖 (举例)例7-4nclass DoubleString nnpublic static void main(String args)nnndouble d;nString s;n/double转换成转换成String的几种方法的几种方法nd=3.1415926;ns=+d;ns=Double.toString(d);ns=new Double(d).toString();ns=String.valueOf(d);n /string转换成转换成double的几种方法的几种方法ns=3.1414926;ntrynd=Double.parseDouble(s);nd=new Double(s).doubleValue();nd=Double.valueOf(s).doubleValue();n catch(NumberFormatException e)nn e.printStackTrace();nnn n补充:装包与拆包nJDK1.5之前,基本数据类型和包装类不能对等使用。Integer i=new Integer(3);装包int iv=i.intValue();拆包nJDK1.5之后,可以自动的进行装包和拆包:自动装包是指基本类型自动转化为包装类型,自动拆包指包装类自动转化为基本类型。Integer i=3;int iv=I;Java语言基础类n Math类该类提供了一些不同标准的数学函数的方法,这些都是static方法,所以使用的时候不用创建Math类的对象,可以直接通过类名来调用这些方法:Math.所要用的方法。方便编程。关于具体的方法和属性,可以查询JDK的帮助文档。(举例)例7-5nclass TestMath nnpublic static void main(String args)nnint a=3;ndouble b=1.5,c=32.2;ndouble f=0.0;nf=1.0/2*(a+Math.sqrt(b*Math.sin(c);nSystem.out.println(f=+f);nSystem.out.println(Math.ceil(3.1415)=+Math.ceil(3.1415);nSystem.out.println(Math.floor(3.1415)=+Math.floor(3.1415);nSystem.out.println(Math.round(987.654)=+Math.round(987.654);nSystem.out.println(Math.max(-987.654,301)=+Math.max(-987.654,301);nSystem.out.println(Math.PI=+Math.PI);nnJava语言基础类nSystem类该类是一个非常有用的特殊类,提供了标准输入/输出、运行时系统信息等工具。由于该类的一些属性和方法这些都是static的,所以使用的时候不能创建System类的对象,可以直接通过类名来调用这些方法:System.所要用的方法。Java语言基础类n用system类获得标准输入输出public static InputStream in;public static PrintStream out;public static PrintStream err;使用这些可以从标准输入读入数据或向标准输出输出数据。n用system类的方法获得系统信息system类提供一些与运行时系统交互的方法,可以利用它们获得解释器或系统的信息,也可以向运行系统发出指令。public static long current TimeMillis();public static void exit(int status);示例7-6n主要用来测试主要用来测试System类的基本属性及功能类的基本属性及功能*/nimport java.util.*;nclass TestSystem nnpublic static void main(String args)nnProperties a;nEnumeration ps;nIterator pi;na=System.getProperties();na.setProperty(test_path,2);n/System.setProperties(a);nSystem.out.println(System.getProperty(test_path);nSystem.out.println(System.getProperty(java.version);n/*npi=a.entrySet().iterator();nwhile(pi.hasNext()nSystem.out.println(pi.next();n */n ps=a.propertyNames();n while(ps.hasMoreElements()n Object obj=ps.nextElement();n Object objVal=a.get(obj);n System.out.println(+obj+=+objVal);n nn字符数组与字符串字符数组与字符串 字符串是字符的序列,它是组织字符的基本数据结字符串是字符的序列,它是组织字符的基本数据结构,从某种程度上来说有些类似于字符的数组。构,从某种程度上来说有些类似于字符的数组。char country=C,h,i,n,a;C+?C+?在在Java中,字符串被当作对象来处理。程序中需要用中,字符串被当作对象来处理。程序中需要用到的字符串可以分为两大类,一类是创建之后不会再做修到的字符串可以分为两大类,一类是创建之后不会再做修改和变动的改和变动的String类类;另一类是创建之后允许再做更改和;另一类是创建之后允许再做更改和变化的变化的StringBuffer类类。Java会自动为字符串常量生成一个会自动为字符串常量生成一个String类的类的对象,所以可以直接初始化对象,所以可以直接初始化String对象,如:对象,如:String s=“SCEMI XMJ!”u用一个已创建的字符串创建另一个字符串,如:用一个已创建的字符串创建另一个字符串,如:String s1=new String(s);创建字符串对象创建字符串对象u使用使用String类的构造方法创建字符串对象,如:类的构造方法创建字符串对象,如:String s=new String(“We are Chinese);uString(char a):用一个字符数组:用一个字符数组a 创建一个字符创建一个字符串对象,如:串对象,如:char a=X,M,J;String s=new String(a);uString(char a,int startIndex,int count):提取字:提取字符数组符数组a 中的一部分字符创建一个字符串对象,如:中的一部分字符创建一个字符串对象,如:char a=S,C,E,M,I,X,M,J;String s=new String(a,5,3);String类常用方法类常用方法public int length()获取字符串的长度获取字符串的长度 public boolean equals(String s)比较当前字符串对象的实体是否与参数指定的比较当前字符串对象的实体是否与参数指定的字符串字符串s的实体相同的实体相同 public boolean startsWith(String s)public boolean endsWith(String s)判断当前字符串对象的前缀判断当前字符串对象的前缀后缀后缀是否是参数指是否是参数指定的字符串定的字符串spublic int compareTo(String s)比较大小比较大小 等等 0;大;大 正;小正;小 负负String s1=new String(“中国中国.四川四川”);String s2=new String(“中国中国.四川四川”);String s3=new String(“中国中国”);String s4=new String(“四川四川”);System.out.println(s1.length();/?System.out.println(s3.length();/?System.out.println(s1=s2);/?System.out.println(s1.equals(s2);/?System.out.println(s1=s2);/?System.out.println(s1=s2);/?System.out.println(s1.equals(s2);/?System.out.println(s1.startsWith(s3);/?System.out.println(s1.endsWith(s4);/?System.out.println(pareTo(s2);/?System.out.println(pareTo(s4);/?5 52 2falsefalsetruetrue中国中国中国中国.四川四川四川四川truetruetruetruetruetruetruetrue0 0-2222-2222JAVA程序设计程序设计2006.02 By SCEMI XMJString类常用方法类常用方法public int indexOf(String s,int startpoint)public int lastIndexOf(String s)返回首次出现返回首次出现s的位置。的位置。没有没有-1。public String substring(int startpoint,int end)从从start处截取到尾部处截取到尾部end处处所得到的字符串。所得到的字符串。public String trim()去掉前后空格去掉前后空格public String replaceAll(String old,String new)用参数用参数new指定的字符串替换由指定的字符串替换由old指定的所有字符串指定的所有字符串public char charAt(int index)返回第返回第index个字符个字符String s1=new String(“中国中国.四川四川.攀枝花攀枝花”);String s2=new String(“We are like Java”);System.out.println(s1.indexOf(“china”);/对对?System.out.println(s2.indexOf(a);/对对?System.out.println(s2.indexOf(“a”);/?System.out.println(s2.lastIndexOf(“a”);/?System.out.println(s2.indexOf(“a”,6);/?System.out.println(s2.indexOf(“Java”);/?System.out.println(s1.charAt(6);/?System.out.println(s2.charAt(12);/?System.out.println(s1.substring(3);/?System.out.println(s1.substring(3,5);/?System.out.println(s1.replaceAll(.,);/对对?System.out.println(s1.replaceAll(“.”,“#”);/?System.out.println(s2.replaceAll(“a”,“b”);/?-1-1 3 33 3151513131212攀攀攀攀J J 四川四川四川四川.攀枝花攀枝花攀枝花攀枝花 四川四川四川四川 语法错语法错语法错语法错#We bre like JbvbWe bre like Jbvb字符串与基本数据的相互转换字符串与基本数据的相互转换将基本类型数据转换为将基本类型数据转换为String型:型:String.valueOf(基本数据类型基本数据类型)例:例:String.valueOf(0.34)“0.34”将将String型转换为基本类型数据:型转换为基本类型数据:03-1803-18提及提及提及提及 Integer.parseInt(String s)Double.parseDouble(String s)例:例:Double.parseDouble(“12.34”)12.34对象的字符串表示对象的字符串表示 对象名对象名.toString()Date date=new Date()date.toString()JAVA程序设计程序设计StringBuffer类类创建创建StringBuffe对象对象uStringBuffer()uStringBuffer(int size)uStringBuffer(String s)length()字符个数字符个数StringBuffer sb=new StringBuffer()sb.length()/0StringBuffer sb=new StringBuffer(32)sb.length()/0 sb.capacity()/32StringBuffer sb=new StringBuffer(“SCEMI XMJa”)sb.length()/9 sb.capacity()/25=9+16StringBuffer类常用方法类常用方法void setCharAt(int n,char ch)用字符用字符ch替换第替换第n个字符个字符StringBuffer insert(int index,String str)将字符串将字符串str插入从插入从index起的当前字符串中起的当前字符串中append 数据转化后数据转化后追加追加public StringBuffer reverse()字符翻转字符翻转StringBuffer delete(int startpos,int endpos)删除删除startpos到到endpos-1子串子串StringBuffer replace(int n,int m,String str)用串用串str替换当前串从替换当前串从n到到m-1的子串的子串StringBuffer str=new StringBuffer(“123”)str.append(456);/对吗对吗?str=str+“789”/对吗对吗?str.append(“789”);/str?System.out.println(str.setCharAt(0,a);/错错 void str.setCharAt(0,a);/str?System.out.println(str);/?str.insert(1,“*”);/str?str.delete(1,4);/str?str.reverse();/str?str.replcae(0,2,“#”);/对吗对吗?str.replcae(5,7,“#”);/str?str.length()/?str.capacity()/?对对 str=“123456”错错str=“12346789”str=“a2346789”str=“a*23456789”str=“a23456789”str=“98765432a”对对 str=“#765432a”str=“#76#32a”10192006.02 By SCEMI XMJStringTokenizer类类分解字符串成可被独立使用的单词分解字符串成可被独立使用的单词 java.util包包创建创建StringTokenizer对象对象 StringTokenizer(String s)StringTokenizer(String s,String delim)StringTokenizer类常用方法类常用方法 countTokens()单词计数变量单词计数变量hasMoreTokens()countTokens0 truenextToken()逐个获取单词逐个获取单词import java.util.*;public class ST public static void main(String args)String str=“中国中国.四川四川.攀枝花攀枝花”;StringTokenizer st=new StringTokenizer(str,“.”);int number=st.countTokens();System.out.println(“共有单词共有单词:”+number);while(st.hasMoreTokens()System.out.print(number-st.countTokens()+“:”);System.out.println(st.nextToken();共有单词共有单词:3 0:中国中国 1:四川四川 2:攀枝花攀枝花字符串数组字符串数组字符串数组:可以表示一组字符串字符串数组:可以表示一组字符串public class StrArray public static void main(String args)for(int i=0;iargs.length;i+)System.out.println(argsi);javac StrArray.javajava StrArray 1st 2nd 3rd集合类n狭义来讲,集合实际上是用一个数组代表一组对象,在集合中的每一个对象称为一个元素。n在集合中的各个元素的具体类型可以不同,一般说来,它们都是由相同的类派生出来的,换言之,它们将其当作Object类型处理(Object类型是Java中所有类的“根”类)。n在集合中检索出各个元素以后,一般来讲需要根据具体类型的不同而进行相应的类型转换。Collection API中的接口和类主要位于java.util包中,其中最主要的接口是Collection,它将一组对象以集合元素的形式组织到一起,然后在其子接口中分别实现不同的组织方式。它的子接口有:Set:不记录元素的保存顺序,且不允许有重复的元素。List:记录元素的保存顺序,且允许有重复的元素。其中,实现Set接口的比较重要的类是HashSet;实现List接口的重要的类有ArrayList,Vector,LinkedList。Collection API 层次结构Collection+add(element:Object):boolean+remove(element:Object):boolean+size():int+isEmpty():boolean+contains(element:Object):boolean+iterator():IteratorSetHashSetListArrayListVector集合类nCollection的方法Public boolean add(Object o);Public boolean remove(Object o);Public void clear();Public boolean contains(Object o);Public int size();Public boolean isEmpty();Public Iterator iterator();集合类nSet接口以及HashSet类Set接口是Collection的子接口,拥有与Collection完全相同的接口,它没有什么额外的功能。完全就是一个Collection,只是具有不同的行为而HashSet是实现Set接口的一个类。Set记录的是不重复元素的集合。它里面也可以包含null对象,但一样不可以重复。集合类nList接口及ArrayList,Vector类List接口也是Collection的子类,它表示对象可重复的集合。对于实现List接口的比较重要的类有:ArrayList,Vector,LinkedList。ArrayList、Vector可以说是java中的“动态数组”。数组在用new创建后,其大小是不能改变的,而ArrayList和Vector中的元素的个数是可变的,可以随时添加和删除。Iterator接口Iterator接口定义了对Collection类型对象中所含元素的遍历等增强处理功能可以通过Collection接口中定义的iterator()方法获得一个对应的Iterator(实现类)对象Set(实现类)对象对应的Iterator仍然是无序的List(实现类)对象对应的ListIterator对象可以实现对所含元素的双向遍历:使用next()方法和previous()方法Iterator接口层次Iterator+hasNext():boolean+next():boolean+remove()ListIterator+hasPrevious():boolean+previous():Object+add(element:Object)+set(element :Object)集合类nIterator 和Enumeration存取集合中的元素可以有多种方法。对于ArrayList和Vector类,他们的元素与位置有关,所以可以用与位置相关的方法来取得元素。所有的Collection都可以用Iterator来列举元素,Vector类可以用Enumeration来列举元素。前者中还有remove方法可用,所以功能更多。An Iterator is an object that moves sequentially from one component to the next through a collection structure,providing access to its elements.集合类使用Iterator接口很常见。对于实现Collection接口的类,都可以用。Iterator的方法有三个:Public boolean hasNext();Public Object next();Public remove();对于List,可以通过方法:listIterator()来得到一个ListIterator接口,从而取得元素的索引。ListIterator是Iterator的子接口,出上面三个方法外,还有:集合类 boolean hasPrevious();Object previous();void add(Object o);void set(Object o);等等 对于Vector类,可以使用elements()方法返回一个 Enumeration接口,其方法有:boolean hasMoreElements();Object nextElement();(举例)例7-11nimport java.util.*;npublic class TestListAllElementsnnpublic static void main(String args)nnVector h=new Vector();nh.add(lst);nh.add(java);nh.add(c);nh.add(basic);nprintAll(Object)h);nprintAll(Collection)h);nprintAll(List)h);nprintAll(Vector)h);nnn public static void printAll(Object obj)n n System.out.println(obj);n npublic static void printAll(Collection s)nn Iterator it=s.iterator();n while(it.hasNext()nSystem.out.println(it.next();n n public static void printAll(List s)nn ListIterator it=s.listIterator();n while(it.hasNext()n n System.out.println(it.next();n n while(it.hasPrevious()nn System.out.println(it.previous();nn npublic static void printAll(Vector s)nn Enumeration e=s.elements();n while(e.hasMoreElements()nn System.out.println(e.nextElement();n nn集合类nMap接口及Hashtable类Map接口提供了一组“关键字-值”的集合。A table(also called map)is a container that allows direct access by any index type.a good analogy is a dictionary;the index variable is the word being looked up,and the element that it indexes is its dictionary definition.A table is a sequence of pairs.The first component of the pair is called key.The second component is called the value of its key component.A table is also called a map because we think of the keys being mapped into their values,like a mathematical function:f(key)=value.集合类n Map接口及Hashtable类Map接口的重要实现类有:Hashtable类。Hashtable中的每个关键字的元素都实现了hashCode()方法,为每一个元素返回一个对应的值。该类的主要方法有:public void put(Object key,Object value);public Object get(Object key);public Object remove(Object key);public Enumeration kyes();例7-12nimport java.util.*;nclass TestHashtable nnpublic static void main(String args)nnHashtable ht=new Hashtable();nht.put(one,new Integer(1);nht.put(two,new Integer(2);nht.put(three,new Integer(3);nht.put(four,new Integer(4);nht.put(five,new Integer(5);nEnumeration em=ht.keys();nwhile(em.hasMoreElements()nObject key=em.nextElement();n Object value=ht.get(key);n System.out.println(+key+=+value);nnn7.7.1 泛型n泛型(Generic)是JDK5.0增加的最重要的Java语言特性。使用泛型可以解决这种问题:程序可以针对不同的类有相同的处理办法,但这些类之间不一定有继承关系。nVector v=new Vector();nv.addElement(“one”);nString s=v.elementAt(0);7.7.2 增强的for语句nfor(Photo photo:album)nSystem.out.println(photo.toString();nnimport java.util.*;nclass Student n nString name;nint age;npublic Student(String name,int age)n this.name=name;n this.age=age;nnpublic void printInfo()n System.out.println(name:+name+age:+age);nnclass EnrollmentCollectionnprivate Vector students;n nEnrollmentCollection()nnstudents=new Vector();nn public boolean enroll(Student s)nnif(students.contains(s)return false;nif(students.size()8)return false;nstudents.add(s);nreturn true;nn public boolean unenroll(Student s)n n if(students.contains(s)n students.remove(s);n return true;nelsenreturn false;nnpublic int getTotalEnrollment()nnreturn students.size();n npublic Student getNthStudent(int n)n return(Student)students.elementAt(n);n n;n n nclass Coursen n String courseName;n double credits;n private EnrollmentCollection enrolledStudents;n Course(String name,double credits)n courseName=name;n this.credits=credits;n enrolledStudents=new EnrollmentCollection();n n public boolean enroll(Student s)n n return enrolledStudents.enroll(s);n n public boolean unenroll(Student s)n n return enrolledStudents.unenroll(s);n n public EnrollmentCollection getRegisteredStudent()n return enrolledStudents;n n n;n public class TestCourseVectorn npublic static void main(String args)nnint i;nCourse c=new Course(java,1.0);nStudent s1=new St