1、第6章 工具类与算法,6.1 语言基础类库 6.2 Applet类与Applet程序 6.3 数组 6.4 向量 6.5 字符串 6.6 递归 6.7 排序 6.8查找 6.9 链表,6.10 队列 6.11 堆栈 6.12 二叉树,6.1 语言基础库类,Object 类Object类是Java程序中所有类的直接或间接父类,也是类库中所有类的父类。(1) protected Object clone( ): 生成当前对象的一个拷贝,并返回这个复制对象。 (2) public boolean equals(Object obj): 比较两个对象是否相同,是则返回true。 (3) public
2、final Class getClass( ): 获取当前对象所属的类信息,返回Class对象。 (4) protected void finalize( ): 定义回收当前对象时所需完成的清理工作。 (5) public String toString( ): 返回当前对象本身的有关信息,按字符串对象返回。,数据类型类,数据类型类是一个类,有自己的方法,这些方法主要用来操作和处理它所对应的基本数据类型量。 比如: Integer类 (1) MAX-VALUE域和MIN-VALUE域分别规定了int类型量的最大值和最小值。 (2) 构造函数public Integer( int value )
3、 public Integer( String s ) (3) 数据类型转换方法分别将当前对象所对应的int量转换成其他基本数据类型的量,并返回转换后的值。public double doubleValue( )public int intValue( )public long longValue( ),(4) 字符串与int量相互转化的方法 public String toString( )方法将当前Integer对象对应的int量转化成字符串。 public static int parseInt(String s)int i = Integer.parseInt(123); public
4、 static Integer valueOf(String s) int i = Integer.valueOf(123).intValue( );,Math类Math类用来完成一些常用的数学运算,它提供了若干实现不同标准数学函数的方法。,public final static double E; / 数学常量epublic final static double PI; / 圆周率常量public static double abs(double a); / 绝对值public static double acos(double a); / 反余弦public static double
5、exp(double a); / e的参数次幂public static double floor(double a); public static double log(double a); / 自然对数public static double max(double a, double b); public static float min(float a, float b); public static double pow(double a, double b); / 乘方public static double random( ); / 产生0和1(不含1)之间的伪随机数public
6、static double rint(double a); / 四舍五入public static double sqrt(double a); / 平方根,int i = 9, j = 7, k ;k = Math . max( i, j ) ;int i = (int )(Math.random( ) * 10)+1;,System类System是一个功能强大、非常有用的特殊的类,这个类不能实例化,即不能创建System类的对象,所以它所有的属性和方法都是static的,引用时以System为前缀即可。,1. 用System类获取标准输入/输出System类的属性有三个,分别是系统的标准输
7、入、标准输出和标准错误输出:public static PrintStream err ;public static InputStream in ;public static PrintStream out ; System . out .println ( Hello World ) ;,2. 用System类的方法获取系统信息,完成系统操作 (1)public static long currentTimeMillis( ) (2) public static void exit(int status) (3) public static void gc( ),6.2 Applet类与A
8、pplet小程序,Applet类,Applet类是Java的另一个系统类java.awt.panel的类: 包容和排列其他的界面元素; 响应它所包容范围之内的事件或把事件向更高层次传递。 import java.applet.Applet;public class MyApplet extends Applet,Applet类的主要方法 init( )完成Applet类实例的初始化工作。由浏览器或 applet viewer 调用,通知此 applet 它已经加载到系统中。它经常在第一次调用 start 方法前被调用。 如果 Applet 的子类要执行初始化,则应该重写此方法。例如,带有线程的
9、 applet 将使用 init 方法来创建线程,使用 destroy 方法销毁它们。 start( )用来启动浏览器运行Applet的主线程。在init()初始化之后被调用,Applet重启:使用了浏览器的Reload操作或用户将浏览器转向其他的页面又返回。,paint()在Applet中显示文字、图形和其他组件。Applet被启动之后或是Applet所在的浏览器窗口改变,都会自动调用paint()来重新描绘自己的界面。repaint()方法:update()屏幕清空,然后调用paint()重画之。 stop( )类似于start()方法的逆操作,当用户浏览其它页时,浏览器将首先自动调用该方
10、法停止执行Applet的主线程。 destroy( )当用户退出浏览器时,浏览器中运行的Applet实例也相应被消灭,即被内存删除。在消灭Applet之前,浏览器会自动调用destroy()方法来完成释放资源、关闭连接之类的操作。,Java Applet的生命周期与主要方法,例6-2,InitCnt = 0; StartCnt = 0; StopCnt = 0;DestroyCnt = 0;PaintCnt = 0; public void init()InitCnt+; / init()方法执行次数加一 DestroyCnt+; StartCnt+; StopCnt+; g.fillRect
11、(25,200-InitCnt*30,40,InitCnt*30);,Life.java,HTML文件参数传递,APPLET和是嵌入Applet的标记,其中至少需包括三个参数:code,height和width。 (1) codebase:当Applet字节码文件的保存位置与它所嵌入的HTML文档不同时,应使用参数codebase来指明字节码文件的位置,这个位置应使用URL的格式。例如:codebase = http:/www.illusion.org/Applet/aint.class(2) alt:如果解释HTML页面的是一个不包含Java解释器的浏览器,那么它将不能执行字节码,而是把al
12、t参数指明的信息显示给用户。alt = This a Java Applet your browser can not understand. (3) align:表示Applet界面区域在浏览器窗口的对齐情况。align = CENTER,参数的传递,s = getParameter ( vstring ) x = Integer.parseInt ( getParameter ( x ) ) ; y = Integer.parseInt ( getParameter ( y ) ) ;,例子6-3,6.3 数组,数组的主要特点如下: (1) 数组是相同数据类型的元素的集合。 (2) 数组中
13、的各元素是有先后顺序的。它们在内存中按照这个顺序连续存放在一起。 (3) 每个数组元素用整个数组的名字和它自己在数组中的位置表达。,1. 声明数组数组元素类型 数组名 ;数组元素类型 数组名; 2. 创建数组空间 数组名 = new 数组元素类型 数组元素的个数 ; 3. 创建数组元素并初始化,声明: int num ; int num;创建:num=new int3; int num =new int3;赋值: num0=1; num1=4;int num =1,2, 6;省略 new int num =new int 1,2,3; 错误:int num3; int num ; num=1,
14、2,3;int num =new int31,2,3;,Java数组时需要注意的几个问题: (1) 数组元素的下标(即数组元素方括号内的数字,代表了数组元素在数组中的位置)从0开始,直到数组元素个数减1为止。 (2) 所有的数组都有一个属性length,这个属性存储了数组元素的个数,利用它可以方便地完成许多操作。 (3) Java系统能自动检查是否有数组下标越界的情况。,6.4 向量,向量(Vector) java.util包 不同类型元素共存的变长数组。 适用的情况 (1) 需要处理的对象数目不定,序列中的元素都是对象,或可以表示为对象。 (2) 需要将不同类的对象组合成一个数据序列。 (3
15、) 需要做频繁的对象序列中元素的插入和删除。 (4) 经常需要定位序列中的对象或其他查找操作。 (5) 在不同的类之间传递大量的数据。,数组适用情况: (1) 序列中的元素是简单数据类型的数据。 (2) 序列中元素的数目相对固定,插入、删除和查找操作较少。,1. 创建向量类的对象 public Vector (); public Vector (int initCapacity); public Vector ( int initCapacity, int capacityIncrement ) ; 2. 向向量序列中添加元素 addElement( )方法将新元素添加在向量序列的尾部 ins
16、ertElement( )方法将新元素插入在序列的指定位置处。addElement ( Object obj ) ;insertElement ( Object obj, int index ) ; 其中obj是加入到向量序列中的对象,index是插入的位置(0为第一个位置)。,Vector MyVector = new Vector ( ) ;for ( int i=1; i=10; i+)MyVector . addElement ( new D200- Card(200180000+i,1111,50.0,200,0.1);MyVector . insertElement ( new I
17、P- Card(12345678,1234,100.0,200), 0) ;,3. 修改或删除向量序列中的元素 (1) void setElementAt( Object obj, int index ) 将向量序列index位置处的对象元素设置成为obj,如果这个位置原来有元素则被覆盖。 (2) boolean removeElement( Object obj) 删除向量序列中第一个与指定的obj对象相同的元素,同时将后面元素前提补上空位。 (3) void removeElementAt (int index) 删除index指定位置处的元素,同时将后面的元素向前提。 (4) void
18、removeAllElements( ) 清除向量序列中的所有元素。,4. 查找向量序列中的元素 (1) Object elementAt ( int index ) 返回指定位置处的元素。 String str = (String)MyVector . elementAt (0); (2) boolean contains ( Object obj ) 检查向量序列中是否包含指定的对象元素obj,是则返回true,否则返回false。 (3) int indexOf ( Object obj, int start-index ) ; 从指定的start-index位置开始向后搜索,返回所找到
19、的第一个与指定对象obj相同的元素的下标位置。若指定对象不存在,则返回-1。 (4) int lastIndexOf ( Object obj, int start-index ) 从指定的start-index位置开始向前搜索,返回所找到的第一个与指定对象obj相同的元素的下标位置。若指定对象不存在,则返回-1。,int i = 0 ; while ( (i = MyVector . indexOf ( Welcome, i ) != -1 )System . out . println ( i ) ; 使用Vector时,一个需要特别注意的问题就是一定要先创建后使用。,6.5 字符串,St
20、ring类:字符串常量 StringBuffer类:字符串变量 注意: 字符串常量与字符常量的不同 Java中的字符串常量,表面上与其他语言中的字符串常量没有什么不同,但在具体实现上却有较大的差异。,String类,1. 构造函数 (1) public String( )创建一个空的字符串常量 (2) public String(String value)这个字符串常量可以是另一个String对象,也可以是一个用双引号括起的直接常量。 (3) public String(StringBuffer buffer)这个构造函数利用一个已经存在的StringBuffer对象为新建的String对象初
21、始化。 (4) public String(char value)这个构造函数利用已经存在的字符数组的内容初始化新建的String对象。,String s ; s = new String (ABC) ; String s = new String ( ABC ) ; String s = ABC ;,2. 字符串常量的操作public int length ( ) ;String s = Hello!System . out . println ( s . length ( ) ) ;,3. 判断字符串的前缀和后缀public boolean startsWith(String prefix
22、);public boolean endsWith(String suffix);if (s. endsWith(0) | s.endsWith(2) | s.endsWith(4) | s.endsWith(6)| s.endsWith(8) System . out. println ( 此人是女性 ) ;,4. 字符串中单个字符的查找public int indexOf(int ch);public int indexOf(int ch, int fromIndex);String s = Java是面向对象的语言,JavaScript是脚本语言;int idx = s . indexO
23、f ( (int)J ) ; int i= -1;do i = s . indexOf ( (int)a, i+1 ) ;System . out . print ( i + t) ;while(i!=-1);,public int lastIndexOf(int ch);public int lastIndexOf(int ch, int fromIndex);do i = s . lastIndexOf ( (int)a, i+1 ) ;System . out . print ( i + t) ;while(i!=-1);,5. 字符串中子串的查找public int indexOf(S
24、tring str);public int indexOf(String str, int fromIndex);public int lastIndexOf(String str); public int lastIndexOf(String str, int fromIndex);,String s = Java是面向对象的语言,JavaScript是脚本语言 ;String sub = 语言;for ( int i = s.length( ) ; i != -1 ; )i = s . lastIndexOf ( sub, i - 1 ) ;System . out . print ( i
25、 + t) ; 上述程序运行的结果是:26 10 -1,获取字符串中的某个字符的方法: public char charAt(int index); 注意:index从0算起,6. 比较两个字符串public int compareTo(String anotherString);public boolean equals(Object anObject);public boolean equalsIgnoreCase(String anotherString);String s1 = Hello!World ; s2 = hello!world ;boolean b1 = s1 . equa
26、ls ( s2 );boolean b2 = s1 . equalsIgnoreCase ( s2 ) ;i = s1 . compareTo ( s2 ) ;,7. 连接字符子串public String concat(String str);这个方法将参数字符串连接在当前字符串的尾部,并返回这个连接而成的长字符串,但是当前字符串本身并不改变。String s = Hello! ;System . out. println ( s . concat ( World! ) ) ;System .out . println ( s ); 运行结果是:Hello!World! / 连接后的新字符串
27、Hello! / 原字符串没有改变,StringBuffer类,1. 创建字符串变量StringBuffer对象public StringBuffer( ); public StringBuffer(int length); public StringBuffer(String str);StringBuffer MyStrBuff1 = new StringBuffer( ) ;StringBuffer MyStrBuff2 = new StringBuffer( 5 ) ;StringBuffer MyStrBuff3 = new StringBuffer( Hello,Guys!) ;,
28、2. 字符串变量的扩充、修改与操作public StringBuffer append( 参数对象类型 参数对象名) ;public StringBuffer insert( int 插入位置,参数对象类型 参数对象名) ;,StringBuffer MyStrBuff1 = new StringBuffer( ) ;MyStrBuff1 . append ( Hello, Guys!) ;System . out . println ( MyStrBuff1.toString ( ) ) ;MyStrBuff1 . insert ( 6, 30 ) ;System . out . print
29、ln ( MyStrBuff1.toString ( ) ) ; 上述程序执行的结果是:Hello, Guys!Hello,30 Guys!,修改字符串:public void setCharAt(int index, char ch);StringBuffer MyStrBuff = new StringBuffer ( goat ) ;MyStrBuff.setCharAt ( 0, c) ;,3. 字符串的赋值和加法String MyStr = Hello, ;MyStr = MyStr + Guys! ;String MyStr = new StringBuffer( ).append
30、(Hello).toString( ); MyStr = new StringBuffer( ).append(MyStr).append(Guys!).toString( );,6.5.3 Java Application命令行参数,Java Application程序中用来接受命令行参数的数据结构是main( )方法的参数args,这个参数是一个字符串数组,其中的每个元素都是一个字符串.,1: public class UseComLParameter 2: 3: public static void main ( String args ) 4: 5: int a1, a2, a3 ;
31、6: if ( args.length 2 ) 7: 8: System.out.println(运行本程序应该提供两个命令行参数); 9: System.exit(0); 10: 11: a1 = Integer.parseInt( args0 ) ; 12: a2 = Integer.parseInt( args1 ) ; 13: a3 = a1*a2 ; 14: System.out.println(a1 + 与 + a2 + 相乘的积为: + a3 ); 15: 16:,6.6 递归,基本思想就是“自己调用自己”,一个使用递归技术的方法即是直接或间接地调用自身的方法。 long Fac
32、torial (int n)if(n = 1)return 1; /递归头elsereturn n*Factorial (n-1); /递归调用自身,菲波那契数列fibonacci( n ) = n, n = 0, 1fibonacci( n ) = fibonacci ( n-1 ) + fibonacci ( n-2 ), n为其他整数,6.7 排序,冒泡排序 选择排序 插入排序 桶排序,void SortProcedure( ) int pass,i,temp,exchangeCnt;for(pass=0;passDataArrayi+1) temp = DataArrayi;DataA
33、rrayi = DataArrayi+1;DataArrayi+1 = temp; exchangeCnt+; for(i=0;iDataArray.length;i+)SortPropass+1i = DataArrayi; if(exchangeCnt = 0) return; ,桶排序,桶排序的基本思路是:把待排序的数据放在一个一维数组中,另外设置一个10N的二维数组,其中N是待排序数据的个数。 设待排序数据中最大的为4位数,则排序需要经过4轮扫描,每轮扫描包括分散扫描和集中扫描两步。,(1) 分散扫描: 把一维数组的数据分散保存到二维数组中。 (2) 集中扫描: 把二维数组中的数据按照
34、下标顺序集中保存回一维数组。,1: void SortProcedure( )2: 3: int bucket = new int10DataInputed+1; 4: int pass =0; /扫描轮数计数 5: do7: 8: for(int i=0;i10;i+)9: 10: bucketiDataInputed = 0;11: 12: for(int i=0;iDataInputed;i+) /分散扫描,13: int temp1 = (int)Math.pow(10,pass);15: int temp2 = DataArrayi/ temp1%10;buckettemp2buck
35、ettemp2DataInputed+= DataArrayi;17: 18: int k=0;19: for(int i=0;i10;i+) /集中扫描20: for(int j=0;jbucketiDataInputed;j+)21: DataArrayk+ = bucketij;22: for(int i=0;iDataArray.length;i+) /记录本轮选择后数据排列情况23: SortPropassi = DataArrayi;24: pass+;while(bucket0DataInputed != DataInputed); ,6.8 查找,1. 顺序查找 2.对分查找使
36、用对分查找要求数据序列必须是已经排好序(升序、降序均可)的有序序列。它的基本思想是让匹配关键值与有序序列中间的一个数据相比较,并利用这个中间数据把有序序列划分成一前一后两个子列。,83: int BiSearch(int key) 84: 85: int low=0; 86: int high=DataArray.length-1; 87: int mid; int i = 0; 90: while(low = high)mid = (high + low)/2;ComparePti+ = DataArraymid;,if(DataArraymid = key)return mid;else
37、if(DataArraymid key) low = mid + 1; else high = mid - 1;return -1; ,图 6.12 链表的组成,6.9 链表,6.9 链表,6.9.1 链表的节点 class Node private int m-Data; /节点中保存的数据private Node m-Next; Node(int data) /构造函数m-Data = data;m-Next = null; Node (int data, Node next)m-Data = data;m-Next = next;,void setData(int data) /修改节点
38、中的数据m-Data = data;int getData( ) /获得节点中的数据return m-Data; void setNext(Node next) /修改节点中的指针m-Next = next;Node getNext( ) return m-Next;,6.9.2 创建链表,class LinkList /定义链表类Node m-FirstNode; /链表中的第一个节点LinkList( ) /构造函数1:建立空链表m-FirstNode = null;LinkList(int data) m-FirstNode = new Node(data);,String visitA
39、llNode( ) Node next = m-FirstNode;/从第一个节点开始String s = ;while(next!=null) /直到最后一个节点s = s + next.getData( ) + ; ;next = next.getNext( ); return s;,6.9.4 链表的插入操作,insertAtBegin( )方法根据形参提供的数据创建一个新的包含这个数据的节点,并把这个节点加入在当前链表的第一个节点之前成为新的第一节点; insertAfterId( )在链表中寻找包含数据等于形参id的节点,将新建的节点插在找到的节点之后,若找不到符合条件的节点,则将新
40、建节点插入到链表的最后面。,在链表中插入节点一般包括两个操作: (1) 创建新节点,新节点包括的数据一般由形参提供。 (2) 把新建节点插入链表合适的位置,保证链表各节点依然连续可达,这可以通过把插入位置前节点的指针赋值给新建节点,并使插入位置前节点的指针指向新建节点,如图6.13所示。,void insertAtBegin(int data) if(m-FirstNode = null) m-FirstNode = new Node(data);else m-FirstNode = new Node(data,m-FirstNode);void insertAfterId(int data,
41、int id) Node next = m-FirstNode;if(next = null) m-FirstNode = new Node(data);elsewhile(next.getNext( )!=null ,6.9.5 链表的删除操作,LinkList类中定义了两个删除链表中节点的方法:removeAtId( )和removeAll( )。 removeAtId( )方法将删除链表中第一个所含数据与形参id相同的节点。 removeAll( )方法将删除整个链表,只需令第一个节点为空就可以达到这个目的,,boolean removeAtId(int id) Node ahead =
42、 m-FirstNode; Node follow = ahead; if(ahead = null)return false;else if(ahead.getData( )=id) m-FirstNode = m-FirstNode.getNext( );return true;,elseahead = ahead.getNext( ); while(ahead!=null) if(ahead.getData( )=id)follow.setNext(ahead.getNext( );return true; follow = ahead; ahead = ahead.getNext( )
43、; return false;,void removeAll( ) /删除所有的节点,使链表为空m-FirstNode = null;,6.10 队列,class Queue extends LinkList 21: boolean isEmpty( ) /判断队列是否为空22: 23: if(m-FirstNode=null)24: return true;25: else26: return false;27: ,void enqueue(int newdata) /加队操作,在队列尾部 加入一个数据29: 30: Node next = m-FirstNode;31: if(next=n
44、ull)32: m-FirstNode = new Node(newdata);33: else34: 35: while(next.getNext( )!=null)36: next = next.getNext( );37: next.setNext(new Node(newdata);38: 39: ,40: int dequeue( ) 41: 42: int data;43: if(!isEmpty( )44: data = m-FirstNode.getData( );46: m-FirstNode = m-FirstNode.getNext( );47: return data;
45、48: 49: else return -1; 50: 51: ,6.11 堆栈,堆栈又称为栈,也是线性数据结构,并且是遵循“后进先出”(LIFO)原则的重要线性数据结构。 Stack是java.util包中专门用来实现栈的工具类. Stack是Java用来实现栈的工具类,它的主要方法如下: 1. 构造函数 public Stack( ): 是栈类唯一的构造函数,创建堆栈时可以直接调用它。,2. 压栈与弹栈操作 public Object push ( Object item ): 将指定对象压入栈中。 public Object pop ( ): 将堆栈最上面的元素从栈中取出,并返回这个对象
46、。 3. 检查堆栈是否为空 public boolean empty( ): 若堆栈中没有对象元素,则此方法返回true,否则返回false。,例 6-13 UseStack .java1: import java.applet.Applet;2: import java.awt.*;3: import java.awt.event.*;4: import java.util.*;5:6: public class UseStack extends Applet implements ActionListener7: 8: Stack MyStack;9: Label prompt = new
47、 Label(新数据:);10: Button pushBtn = new Button(压栈);11: Button popBtn = new Button(弹栈);,12: TextField input = new TextField(5);13: int DrawStack = new int10;/记录堆栈中的数据14: int PoppedOut = new int20; /记录被弹出的数据15: int StackCnt = 0; /记录模拟堆栈的数组中的数据个数16: int PopCnt = 0; /记录弹出的数据个数17: String msg = ;18:19: public void init( )20: 21: MyStack = new Stack( );22: add(prompt);23: add(input);,