1、Chap6 工具类与算法,语言基础类库,Object 类 是java程序中所有类的直接或间接父类,也是类库中所有类的父类。 public class Object Class Object is the root of the class hierarchy. Every class has Object as a superclass.All objects, including arrays,implement the methods of this class. 主要方法:protected Object clone( ) public boolean equals( Object ob
2、j) public final Class getClass()返回对象所属类信息protected void finalize( )终结器 public String toString( ) 返回对象本身的信息,protected Object clone() throws CloneNotSupportedExceptionCreates and returns a copy of this object. The precise meaning of “copy“ may depend on the class of the object. The general intent is t
3、hat, for any object x, the expression :x.clone() != x will be true,and that the expression: x.clone().getClass() = = x.getClass() will be true, but these are not absolute requirements. While it is typically the case that: x.clone().equals(x) will be true, this is not an absolute requirement.,public
4、class ex public static void main(String args)boolean f;Integer n1=new Integer(100); Integer n2=new Integer(100);f=n1.equals(n2); System.out.println(f);f=n1=n2; System.out.println(f);xy xy1= new xy(); xy xy2= new xy();xy1.i=10; xy2.i=10; f=xy1.equals(xy2); System.out.println(f); f=xy1=xy2; System.out
5、.println(f); class xy int i; ,Microsoft Windows XP 版本 5.1.2600 (C) 版权所有 1985-2001 Microsoft Corp. C:Documents and Settingsaae: E:cd java E:javajavac ex.java E:javajava ex 运行结果 true f=n1.equals(n2); false f=n1=n2; false f=xy1.equals(xy2); false f=xy1=xy2; equals方法默认的操作是比较对象的内存和属性是否相同,系统中的类重写了这个方法使他只比
6、较属性。=是比较对象的内存和属性,数据类型类(引用数据类型),基本数据类型的第一个字母大写 主要方法和属性: 两个属性MAX_VALUE和MIN_VALUE 其中Integer Byte这两个属性类型是int的,Long - long 构造函数 Byte(byte x), Byte(String s) (doc) Byte(byte x) 用x初始化类的对象 Byte(String s) 用字符串对象s初始化对象 数据类型之间的相互转换方法 byteValue() doubleValue() intValue()longValue()shortValue() 字符串类型与数据类型间的转换,数据
7、类型类(引用数据类型),字符转数据 Integer.parseInt(String s) Float.parseFloat(String s) Integer.valueOf(String s).intValue();Double.valueOf(String s).doubleValue();返回一个对象 返回对象的值 数据转字符串 D1.toString( ) Double.toString(double d) public String toString(); public static String toString(double d);,class java.lang.Object
8、class java.lang.Boolean (implements java.io.Serializable) class java.lang.Character (implements java.lang.Comparable, java.io.Serializable) class java.lang.Character.Subset class java.lang.Character.UnicodeBlock class java.lang.Class (implements java.io.Serializable) class java.lang.ClassLoader clas
9、s java.lang.Compiler class java.lang.Math class java.lang.Number (implements java.io.Serializable) class java.lang.Byte (implements java.lang.Comparable) class java.lang.Double (implements java.lang.Comparable) class java.lang.Float (implements java.lang.Comparable) class java.lang.Integer (implemen
10、ts java.lang.Comparable) class java.lang.Long (implements java.lang.Comparable) class java.lang.Short (implements java.lang.Comparable) class java.lang.Package,Math类,用来完成一些常用的数学运算,是Object的子类 Math类的方法都是static的,可以直接通过类名直接引用,另外,Math类是最终类。 主要属性和方法: public final static double Epublic final static static
11、double PI double abs(double a) 求绝对值 double rint(double a) 对a四舍五入 double sqrt(double a)求平方根 double pow(double a,double b) 求a的b次方 double random( );产生一个01间的随机数(不含1),System类,java.lang.Object java.lang.System public final class System extends Object The System class contains several useful class fields a
12、nd methods. It cannot be instantiated. Among the facilities provided by the System class are standard input, standard output, and error output streams; access to externally defined “properties“; a means of loading files and libraries; and a utility method for quickly copying a portion of an array.,S
13、ystem类,提供标准的输入输出工具,错误信息的输入输出 不能被实例化,只有类方法和类属性,引用时以System为前缀。 三个属性 public static PrintStream err public static InputStream in public static PrintStream out 用System类的方法获取系统信息,完成系统操作。public static void System.exit(0),public static void exit(int status) Terminates the currently running Java Virtual Mach
14、ine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination. This method calls the exit method in class Runtime. This method never returns normally. The call System.exit(n) is effectively equivalent to the call: Runtime.getRuntime().exit(n),public s
15、tatic void gc() Runs the garbage collector. Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has
16、made a best effort to reclaim space from all discarded objects. The call System.gc() is effectively equivalent to the call: Runtime.getRuntime().gc(),Applet类与Applet小程序,Applet的基本工作原理 Applet类 Class Hierarchy class java.lang.Object class java.awt.Component class java.awt.Container class java.awt.Panel
17、(implements javax.accessibility.Accessible) class java.applet.Applet,html文件 applet,www浏览器,服务器,2下载文件,html文件 applet,3请求applet文件,4下载applet,1请求html文件,5解释执行applet文件,Applet类的主要方法,init()方法 用来完成主类实例的初始化工作。用户可重载此方法,来完成创建和初始化对象等操作。 start()方法 用来启动浏览器运行applet的主线程,浏览器将在调用init方法之后,接着自动调用start方法.用户可以重载此方法。除此之外,app
18、let被重新启动时也会被系统自动调用 造成apple重启动的两种情况:一是使用了reload操作二是转向其他的html页面后,又返回。,paint(Graphics g)方法 主要作用是在applet界面中显示图形文字和其他界面元素,在applet启动后,由浏览器自动调用。导致浏览器调用paint方法的情况有三种:applet被启动后,自动调用来重新描绘自己的界面applet所在浏览器窗口改变时applet的其他相关方法被调用时,如repaint()方法被调用时,系统首先调用update()方法将applet所占空间的屏幕清空,然后再调用paint方法。,paint方法固定参数Graphics
19、 g 。Graphics 用来完成较低级的图形用户界面操作的类,可以画点,线,圆,多边形,输出文字等。它是一个抽象类!用户不可以创建它的对象。,stop()方法 当用户离开该网页时,执行stop方法 destroy()方法 当用户退出浏览器时,浏览器中的applet的实例也在内存中被删除,在这之前浏览器会自动调用此方法,完成释放资源和关闭连接等操作,Applet的生命周期和绘图周期,当一个Applet开始运行时,会启动两个线程并执行:一个是主线程-生命周期,一个是AWT线程绘图周期 主线程包括init(),start(), stop(),destroy()分别对应生命周期的初始化、启动、终止和
20、消亡各阶段 AWT线程包括paint(),repaint()和update()方法,绘图周期图,初始化init(),启动start(),终止stop(),消亡destroy(),第一次载入,启动并执行applet,转向其他网页时,applet暂停执行,回到本网页时,重新激活applet,关闭浏览器,repaint(),update(),paint(),第一次绘制,当某些操作破坏了显示,须重新绘制时,1.擦除并填充成背景颜色,2.调用paint(),编程控制,绘图周期的几个主要方法,update()方法:用于更新图形,它首先清除背景,在调用paint()方法完成组建中的具体绘图。通常不改变upd
21、ate()方法. repaint()方法:主要用于重新绘图,在组件外形发生变化,repaint方法被系统自动调用。本方法将调用update方法实现对组件的更新。repaint方法有多种重载的方法 paint()方法: 一个AWT线程要处理各种组件的绘图工作,并负责其输入事件,因此在paint和update方法的程度尽量短,不要只形太耗时的操作,HTML文件参数传递,除了前面用过的CODE HEIGHT WIDTH之外,还有以下的参数: CODEBASE :当字节码文件与HTML文件保存位置不同时,给出地址URL形式 ALT 解释HTML页面的浏览器不包含JAVA解释器时,将信息显示给用户。 A
22、LIGN 界面在浏览器中的对齐方式。 ALIGN=LEFT 以上三个参数同CODE 一样包含在内部向APPLET传递参数,HTML文件参数传递,HTML文件可以向所嵌入的APPLET程序传递参数,通过标记来完成参数名 参数值 在APPLET程序中利用getParameter(String name)来去的参数值(例myhmlpara) 同时实现APPLET与APPLICATION(例appletcation),同时实现APPLET与APPLICATION,实现方式有两种 在已经成型的application的基础上进行改造,把它修改成一个applet 在一个已经成型的applet的基础上进行改造
23、,把它修改成一个application 对于application只要求一个main方法,而applet可以有多个入口和方法。所以,后者,即在applet基础上改造成application较实用,import java.awt.*;import java.awt.event.*;import java.applet.Applet; public class appletcation extends Applet public static void main(String args) Frame frm=new Frame(“this is application“); appletcatio
24、n app=new appletcation(); frm.add(“Center“,app); frm.setSize(200,200); frm.validate(); frm.setVisible(true); frm.addWindowListener(new WindowControl(app); app.init(); app.start(); public void paint(Graphics g)g.drawString(“hello“,50,50); public void destroy()System.exit(0);class WindowControl extend
25、s WindowAdapter Applet c; public WindowControl(Applet c) this.c=c;public void windowClosing(WindowEvent e)c.destroy();,数组,数组是相同数据类型的元素的集合 数组中的各个元素是有先后顺序的,它们在内容中按照这个先后顺序连续存放在一起 每个数组元素用整个数组的名字和它自己在数组中的顺序位置来表达 a0,声明数组 数组元素类型 数组名; String args;或者 数组元素类型 数组名; int ary1;注:元素类型可以是基本数据类型也可是对象 Employee aryemp;
26、创建数组空间 即给数组分配内存空间数组名=new 数组元素类型数组元素的个数 或把声明数组和创建数据空间一起完成数组元素类型 数组名=new 数组元素类型xe.g int myinary=new int100;Employ aryemp=new Employ10; 注意java不支持变长数组,创建空间必须指明数组长度 对于基本数据类型还可以直接赋初值int myintary=1,2,3,4,5,6,7,8,9,创建数组元素并初始化 数组元素为基本数据类型则可以不用进行初始化 否则,当数组的元素是某类的对象时,必须创建并初始化数组。 employee(String name ,double in
27、itsal,char sex) employee myaryemp=employee10 for (int i=0;i10;i+) employeei=new employee(null,300,m); 如果强行使用未经初始化的数组会抛出NullPointException异常,数组,几点注意事项: 数组的下标是从0开始,最末下标:个数1 所有的数组都有一个length属性 java系统能自动检查是否有数组下标越界的情况,此时会抛出系统异常数组下标越界异常,因此在程序中要利用length来控制数组下标的上界。 数组实际上是一种隐含的“数组类”的实例,向量(Vector),向量是java.uti
28、l包中的一个工具类 与数组类似,用来顺序存储的数据结构 与数组不同的是支持变长数组,允许不同类型元素共存的,而且封装了许多的方法 向量中不允许使用基本数据类型的元素 数组和向量的使用情况,向量和数组使用情况,数组 元素为基本数据类型 元素的数目基本固定,插入、删除和查找操作少 向量 元素不能为基本数据类型 需处理的对象的数目不定 元素类型不同,都是对象 插入删除操作较多 经常需要定位查找 不同类之间传递大量的数据,创建向量及常用方法,创建格式 Vector 对象名=new Vector()(向量是一个类因此创建一个向量类的对象同前面一样) 构造函数有四个,Vector( int initCap
29、acity,int capacityIncrement) 1开始创建时Vector含有的元素数目 2一次追加元素的数目 Vector myvect=new Vector(100,50) 开始100,150,200.,向量中添加元素的方法有两种: addElement(Object obj) 在向量的尾部插入对象obj insertElement(Object obj,int index) 在向量的指定位置插入对象obj,Vector myvector=new Vector(10,10); for (int i=1;i=10;i+) myvector.addElement(new D200_ca
30、rd(“200”,50.0) ,向量名 添加的元素即对象 构造函数对对象进行初始化,myvector.insertElement(new D200_card(“200”,50.0),0),要插入的对象 插入位置:第一个,向量中修改和删除元素的方法 修改 void setElement(Object obj,int index) 在向量序列中指定位置的元素设置为obj 删除 boolean removeElement(Object obj) 删除向量中与指定的对象obj相同的第一个元素,同时将后面的元素提前补上空位,若不存在这样的元素,则返回false. void removeElement(i
31、nt index)删除指定位置的向量 void removeElements()删除向量中所有的元素,myvector.setElement(new D200_card(“300”,50.0), 0),查找向量序列中的元素 Object elementAt(int index)返回指定位置的元素 boolean contains(Object obj)检查向量序列中是否包含指定的对象元素obj,是则返回true否则返回false int indexOf(Object obj, int start_index)从指定位置start_index开始向后搜索,返回第一个与指定对象obj相同的元素的下
32、标位置。若不存在则返回-1 int lastIndexOf(Object obj, int start_index)从指定的位置start_index开始向前搜索,返回第一个与指定对象obj相同的元素的下标位置。若不存在则返回-1,字符串,String类 StringBuffer类 Java Application命令行参数,String类,创建字符串常量String对象格式:String mystr=new String()String mystr=“ xyz” 构造函数(共有11) String() 创建一个空的字符串常量String(String value) String(char v
33、alue)用一个字符数组的元素初始化String(StringBuffer buffer) String类封装的方法 字符串常量的操作 int length() (注意与数组中的Length属性的不同),判断字符串的前缀和后缀 public boolean startsWith(String prefix)是否以prefix为前缀 public boolean endsWith(String suffix)是否以suffix为后缀 字符串中单个字符的查找 int indexOf(int ch); 从头向后查找,返回第一个与字符ch相同的字符的位置 (从零开始) 注意参数类型 String s1
34、=“abcedeio” ; s1.indexOf(int)e) int indexOf(int ch, int fromIndex) 从指定的位置fromIndex开始向后查找ch第一个出现的位置,从字符串的尾部开始比较的两个方法:int lastIndexOf(int ch) int lastIndexOf(int ch, int fromIndex),字符串中子串的查找 indexOf方法的重载 indexOf(String str) indexOf(String str, int fromIndex) lastindexOf(String str) lastindexOf(String
35、str, int fromIndex),两个字符串的比较int compareTo(String anotherString)若两个字符串相同则返回0,若按字母需当前字符串大于参数字符串返回一个大于0的整数,若小于参数字符串返回一个小于0的整数 boolean equals(obj) 重写了Object的方法 boolean equalsIgnorCase(String anotherString)(不区分大小写),连接两个字符串 String concat(String str)将当前字符串与参数字符串连接,并返回这个连接后的字符串,但是当前字符串本身并不发生改变String s=“abc”
36、;String s1=s.concat(“xyz”); s1=“abcxyz” s=“abc”,数字类型转化成字符串类型 valueOf方法 toString 方法,StringBuffer,String 字符串已经创建其长度和内容都不能更改,而且要求必须赋初值 StringBuffer表示的是可以扩充、修改的字符串,创建的时候不一定要给出初值 构造函数 StringBuffer() StringBuffer(int length)确定字符串的长度StringBuffer(String str) 用str来初始化 StringBuffer 的字符串对象,对字符串变量的扩充、修改与操作Strin
37、gBuffer append(参数类型 参数对象名)在原字符串后面加由参数转化成的字符串 StringBuffer insert(int 插入位置,参数类型 参数名)在指定的位置后加字符串,如果要将StringBuffer在屏幕显示出来必须先用toString方法转换成String类型的,因为Print方法不接受StringBuffer类型的参数 StringBuffer sb1=new StringBuffer(“abced”) System.out.println(sb1); String s1=sb1.toString(),setCharAt(int index, char ch)用来修
38、改指定位置index的字符用所给字符ch替换 StringBuffer sb1=new StringBuffer(“aaaaaa”) sb1.setCharAt(0,b),字符串的赋值和加法 String mystr=“java” mystr=mystr +” program”,Java Application命令行参数,applet程序可以通过html传递参数,application可以通过命令行参数传递数据 命令行参数通过main方法的数组参数args传递,在运行命令之后紧跟参数,参数之间用空格分隔。如果命令行参数中有空格,则可以用双引号将整个参数括起来以示区别。 命令行参数的类型均为字符
39、串型 例子6-4,因为main方法的参数args是字符串类型的数组,因此每个元素的类型为字符串型,输入几个参数,数组中就有几个元素,在使用命令行参数时,要注意数组越界问题。运行程序时,系统会自动检查数组是否越界,并抛出越界异常。所以在程序中要检查用户输入的参数是否满足要求。,由于下标越界产生的系统异常,使用数组的时候一定要注意数组下标越界的问题。通过利用length属性来解决,关于向量的追加元素问题,与数组不同,向量中的元素数目是可以变化的,虽然有的构造函数说明的增量为零,也不会影响运行。,递归,程序自己调用自己 直接递归和间接递归两种,f1(n) if (n=1) return else f
40、2(n-1)*n f2(n) if (n=1) return 2 elsef1(n-2) 间接递归,t(n) if (n=1) return 1 elset(n-1)+n 直接递归,递归的一般结构 F(n) /参数n通常是问题的规模 if 出口 简单操作,程序结束/程序出口点else简单操作,F(n-1)/参数缩小,改变问题规模 特点:结构相对简单但是内存耗费多,求斐波那契级数,fibonacii(n)=n-1 n=1,2 fibonacii(n)=fibonacci(n-1)+fibonacci(n-2) n2 求fibonacii(n)的值,public class myf public
41、static void main(String args)int n=1;if (args.length!=1) System.out.println(“please input a number”);System.exit(0);else n=Integer.parseInt(args0);System.out.println(fibonacci(n); public long fibonacci(int n)if(n=1|n=2)return n-1 ;elsereturn fibonacci(n-1)+fibonacci(n-2); ,排序,排序的方法有多种,下面是三种最基本的方法: 冒
42、泡排序 选择排序 插入排序,冒泡排序,水泡从底向上冒 当前数据序列中相邻的数据两两比较, 不符合要求的交换顺序,直到所有数据均符合要求.从头到尾的两两比较和交换称为一趟,一趟确定出当前的最大(小)值,下一趟减少一个数据,直到未排序数为0或者某一趟无交换,排序结束。 设序列长度为n,通常要进行n 趟 第i趟参加比较的数据个数为 :n-i;i从0开始 对应数组下标为a0an-i-1,P171例6-6,选择排序,将序列分为有序序列和无序序列,开始,有序序列为空,从无序序列选择最小的放入有序序列,这是一次选择。然后重复这个过程,不断将无序序列中选择最小的放入有序序列的尾部,直到无序序列没有元素。 P174 例6-7,插入排序,将序列分为有序序列和无序序列,开始,有序序列只有一个数据,即,序列的第一个数据,然后取无序序列第一个数据与有序序列中的数据比较(从后向前),找到一个合适的位置。反复执行,直到无序序列为空。,查找,在数据序列中,查找匹配的关键字或数据 顺序查找 从头到尾挨个比较 二分查找 在有序序列(如,升序)中查找a,先跟中间的比较,若a大在后一半二分找,若a小在前一半二分找。,