static int iname=狗狗; 就是说所有关于本类的对象的name都是狗狗是吗

当前位置: >>
Java程序设计--第六讲Java常用基础类(2)1
Java程序设计第五讲Java常用基础类 林志毅lzy291@gdut.edu.cn 本章主要内容? 有关字符串的类库 ? String类 ? StringBuffer类 ? Math类、Random类? 日期类? 集合类Page2 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 有关字符串处理的类? 字符串是Java编程中使用最高的变量。 ? 常用的字符串相关的类有? String是字符串常量 ? StringBuffer是字符串变量? 这二个类都是放在java.lang类库内,所以不需要用import指令 导入它。Page3 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 String类? 1. 创建字符串对象 ? 创建字符串对象的方法有三种? String str=“abc”; //声明,直接赋值 ? String str=new String(“abc”); //调用构造函数来创建字符串 ? char data[]={?a?,?b?,?c?}; //先创建数组String str=new String(data);//再利用构造函数来创建字符串 ? 构造函数的格式 ? ? ? ? ? String() //创建空的字符串 String(byte []bytes); //以byte数组创建字符串 String(byte[] bytes,int offset,int length); String(char []value); ……Page4 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 String类? 常用的方法? ? ? ? ? ? ? ? byte[] getbytes() 将字符串转换成byte类型的数组 char charAt(int index) 获得字符在字符串中的位置 Boolean equals(String str) 测试字符串是否与str相同 int indexof(char ch) 根据字符ch找出第一个在字符串出现的位置 int length() 获取字符串的长度 String substring(int index) 取出index之后的子字符串 String substring(int ind1,int ind2) 取出位于ind1和ind2之间的字符串 Boolean startsWith(String prefix) 测试字符串是否以prefix字符串开 头 ? String toLowerCase() 将字符串转换为小写 ? String toUpperCase()将字符串转换为大写Page5 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 String类? app12_9public class app12_9{public static void main(String args[]){String str=“Easier said than done.”; System.out.println(“length=”+str.length()); System.out.println(“charAt(8)=”+str.charAt(8)); System.out.println(“sub string=”+str.substring(7)); System.out.println(“start with\“th”=”+str.startsWith(“th”)); System.out.println(“upper case=”+str.toUpperCase());}}【例2】求字符串的长度及每一个位置上的字符【例3】 String类字符串的常用操作Page6 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 StringBuffer类? String类主要提供字符串的查询和测试方法,如果要对字符串进行修改, 应使用StringBuffer ? StringBuffer类对象表示的是字符串变量,每一个StringBuffer类对象都是 可以扩充和修改的字符串变量。 ? 创建StringBuffer类对象 以下是常用的StringBuffer类构造函数:(1)public StringBuffer() //空的字符串(2)public StringBuffer(String str)Page7 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 StringBuffer类? StringBuffer类的常用方法? ? ? ? ? ? ? StringBuffer append(char c) 将字符c附加到字符串之后 StringBuffer append(String str) 将字符串str附加到字符串之后 StringBuffer deleteCharAt(int index) 删除字符串第index位置的字符 StringBuffer insert(int k,char c) 将字符串的第k个位置插入字符c StringBuffer insert(int k, String str) 将字符串的第k个位置插入字符 串str int length() 获取字符串的长度 StringBuffer replace(int m, int n,String str) 将字符串第m到n之间以 字符串str取代 StringBuffer reverse() 将字符串反向排列 String toString()将StringBuffer类型的字符串转换成String类型 ……? ? ?Page8 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 StringBuffer类? 例: //app12_10 StringBuffer类使用的范例public class app12_10{public static void main(String args[]){StringBuffer str=new StringBuffer(“Black & White”); System.out.println(str); System.out.println(“length=”+str.length()); System.out.println(str.replace(0,5, “cats”)); System.out.println(str.replace(7,12, “dogs”)); System.out.println(str.reverse());System.out.println(str);} } 字符串类补充阅读材料(见本章主要参考文献1)Chapter05 Java常用基础类Page9 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院 Math类? Math类也是放在java.lang类库中的一个类。提供了计算相关 的数学函数。? Math类提供的变量是静态变量、提供的方法是静态方法,因 此不需要创建Math类对象就可以使用。? Math类提供的类变量public static final double E (Euler?s constant)public static final double PI (圆周率)Page10 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Math类Math类里给出了数学计算常用的函数,包括:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Pagepublic static double sin(double a) 正弦函数 public static double cos(double a) public static double tan(double a) public static double asin(double a) 反正弦函数 public static double acos(double a) public static double atan(double a) public static double exp(double a) public static double log(double a) public static double sqrt(double a) public static double ceil(double a) 大于a的最小整数,即向上取整 public static double floor(double a) 小于a的最大整数,即向下取整 public static int round(double) 传回最接近a的整数 public static double random() 生成[0.0,1.0)之间的随机数 public static type abs(type a) 计算a的绝对值,a可为int/long/float/double public static int max(int a,int b) public static int min(int a,int b) …….Zhiyi Lin, 2011 广东工业大学 计算机学院11 / 89Chapter05Java常用基础类 Math类? 例1: public class MathTest{public static void main(String[] s){System.out.println(&sin(π/4) is & + Math.sin(Math.PI/4.0)); System.out.println(&2的4次方是 & + Math.pow(2,4)); System.out.println(&以e为底的e的对数是 & + Math.log(Math.E)); System.out.println(&81的平方根是 & + Math.sqrt(81)); sin(π/4) is 0.5475 } } 2的4次方是 16.0以e为底的e的对数是 1.081的平方根是 9.0Page12 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Math类import java.awt.*; import java.awt.event.*;random()方法的演示程序class RandomFrame extends Frame implements ActionListener{ RandomFrame(){ this(&RandomFrame&); } RandomFrame(String title){ super(title); add(pane = new Panel()); setPane(); pack(); Dimension dm = getSize(); Dimension ss = getToolkit().getScreenSize(); setCenter(ss, dm); 转下页Page13 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Math类接上页random()方法的演示程序addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }); } //构造方法结束private void setCenter(Dimension screen, Dimension frame){ int x = screen.width/2 - frame.width/2; int y = screen.height/2 - frame.height/2; setLocation(x,y); } 转下页Page14 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Math类接上页 private void setPane(){ tfd = new TextField(20); tfd.setFont(new Font(&Tahoma&, Font.BOLD, 16)); pane.add(tfd); btn = new Button(&RandomNumber Generator&);random()方法的演示程序btn.addActionListener(this); pane.add(btn);} public void actionPerformed(ActionEvent ae){Button b = (Button)ae.getSource(); if(b == btn){ String s = Double.toString(Math.random()); tfd.setText(s); }}Page转下页15 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Math类接上页 private B private TextF private P } //RandomFrame class结束random()方法的演示程序public class MathTest2{ public static void main(String[] s){ RandomFrame rf = new RandomFrame(); rf.show(); } }Chapter05 Java常用基础类Page16 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院 Random类? ? 在java中,还有java.util.Random类也可以生成一个随机数流。 java.util.Random类可以生成任何类型的随机数流,而java.lang.Math类的 random()方法只能生成0.0-1.0之间的随机实数,要想生成其它类型和区间 的随机数必须要进一步加工。public void nextBytes(byte[] bytes)public int nextInt() public int nextInt(int n) public long nextLong()生成随机字节并将其置于用户提供的字节数组中生成int类型所表示的范围中的随机数 生成0-n(不含n)的随机数 生成在long类型所表示的范围中的随机数public float nextFloat() public double nextDouble()生成0.0f-1.0f(不含)之间的随机float数 生成0.0-1.0(不含)之间的随机double数Page17 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Random类例: import java.util.R public class RandomApp{ public static void main(String args[]){ Random ran1=new Random(); Random ran2=new Random(12345); //创建了两个类Random的对象。 System.out.println(&The 1st set of random numbers:&); System.out.println(&\t Integer:&+ran1.nextInt()); System.out.println(&\t Long:&+ran1.nextLong()); System.out.println(&\t Float:&+ran1.nextFloat()); System.out.println(&\t Double:&+ran1.nextDouble()); System.out.println(&\t Gaussian:&+ran1.nextGaussian()); //产生各种类型的随机数 System.out.print(&The 2nd set of random numbers:&); for(int i=0;i&5;i++){ System.out.println(ran2.nextInt()+& &); if(i==2) System.out.println(); //产生同种类型的不同的随机数。 System.out.println(); } } }Page18 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Random类、Math类设计一个生成1至100之间的随机整数的表达式1. 使用java.lang.Math类的random()方法:long answer = 1+(Int)(Math.random()*100); //Int为取整数部 分2. 如果使用java.util.Random类的nextInt()方法:int answer = Math.abs(new Random().nextInt() % 100) +1Page19 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Java日期处理类? 日期类Date:创建日期、修改日期、比较日期、输出日期 ? 日期格式化类SimpleDateFormat:创建格式化对象、日期转 换为字符串、字符串转换为日期。 ? 日历类Calendar:创建Calendar对象、取得Date对象、修改 和取得各字段的值。Page20 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Date类? 类Date表示特定的瞬间,精确到毫秒。Date类是通过记录从基准时间 (格林威治标准时间公元日00:00:00)开始到当前时刻的时 间差,即所经历的毫秒数来计时的。? (1)创建日期 ? Date(); ? Date(longdate); longdate为一个长整型值 ? long cur=System.currentTimeMillis(); Date date=new Date(cur); //取当前时间 ? ? (2)修改日期 ? void setTime(long time); //设置毫秒数(long getTime() //取得毫秒数) (3)比较日期 ? boolean before(Date when); //测试此日期是否在制定日期之前 ? Boolean after(Date when); ? int compareTo(Date anotherDate); //比较两个日期的顺序? (4)输出日期 ? String toString();Page21 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Date类? TestDate.javaimport java.util.*;public class TestDate{public static void main(String args[]){ Date d1=new Date(2000); long time=d1.getTime(); System.out.println(time); System.out.println(d1); Date d2=new Date(); //当前日期System.out.println(d2);System.out.println(d2.compareTo(d1)); System.out.println(d1.equals(new Date(2000))); } }PageZhiyi Lin, 2011 广东工业大学 计算机学院22 / 89Chapter05Java常用基础类 SimpleDateFormat类? SimpleDateFormat类提供了将日期/时间信息进行格式化处理的功能,主 要是将日期/时间信息(Date类型数据)转换成人们所习惯的格式字符串 以及反向转换的功能。 ? 日期格式化模式字符表(用模式串代表格式),见(《JavaSE应用程序 设计》张利国,北京理工大学出版社 P252) 例:yyyy.MM.dd G ?at HH:mm:ss z
AD at 12:08:56 PDT? 创建格式化对象 ? SimpleDateFormat(String pattern) ? 日期的格式化(日期到文本) ? String format(Date date); //将一个日期格式化为字符串 ? 日期的解析(文本到日期) ? Date parse(String source); //从给定的字符串的开始解析文本, 以生成一个日期Chapter05 Java常用基础类Page23 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院 SimpleDateFormat类? 例 import java.text.ParseE import java.text.SimpleDateF import java.util.D public class TestSimpleDateFormat{ public static void main(String args[]) throws ParseException{ Date d1=new Date(); SimpleDateFormat format=new SimpleDateFormat(&yyyy-MM-dd HH:mm:ss&); System.out.println(format.format(d1)); System.out.println(d1); String str=& 08:08:08&; System.out.println(format.parse(str)); //parse会抛出异常 } }Page24 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 日历类Calendar? 目前,Date类中对年、月、日、小时、分钟和秒值各字段访问的函数已 经过时(被废弃了),这些功能被迁移到Calendar类中。? Calendar类是一个抽象类,可以通过调用其静态方法getInstance()来获得该类的 实例。而后对其操作,常用的方法有:? public static Calendar getInstance() ? public int get(int field) //返回指定时间域的值。为了便于记忆和使用, Calendar定义了一系列的静态整型常量来标示各时间域,如 Calendar.YEAR、Calendar.MONTH等。 ? public void set(int field,int value) //将参数filed指定的时间域设置为 value指定的值 ? public final void set(int year,int month,int date) //设置当前日期的年 月日 ? public final void set(int year, int month, int date, int hourOfDay, int minute, int second) ? public abstract void add(int field,int amount); 为指定的日历字段添加 或减去指定的时间量Page25 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 日历类Calendar? TestCalendar.java import java.util.*; public class TestCalendar{ public static void main(String args[]){ Calendar c=Calendar.getInstance(); TestCalendar tc=new TestCalendar(); tc.display(c); //display自己定义的方法 c.set(); tc.display(c); c.set(,10,23,15); tc.display(c); Date d=c.getTime(); System.out.println(d); }Page26 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 日历类Calendarpublic static void display(Calendar c){ String s=c.get(Calendar.YEAR)+&-&+(c.get(Calendar.MONTH)+1)+&-&+(c.get(Calendar.DATE))+& &+ (c.get(Calendar.HOUR_OF_DAY))+&:&+ (c.get(Calendar.MINUTE))+&:&+ (c.get(Calendar.SECOND))+& &+ (c.get(Calendar.AM_PM)==0?&上午&:&下午&); System.out.println(s); } }Page27 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 集合类? 在Java编程中,通常需要在内存中保存大量的、各种类型的 数据,简单的数组显然不再能够胜任,Java提供了功能强大 的集合类体系。 ? 集合类学习目标 ? 掌握集合框架包含的内容? 掌握ArrayList和LinkedList的使用 ? 掌握HashMap的使用 ? 掌握Iterator的使用Page28 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Java集合框架包含的内容2-11接口CollectionMapListSetArrayListLinkedListHashSetTreeSetHashMapTreeMap2具体类提供了对集合进行排序、 遍历等多种算法实现 Collections3 算法Page29 / 89Java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们 位于java.util包中 我们不必再重新发明轮子,只需学会如何使用它们,就可处理实际应用中 问题 Chapter05 Java常用基础类Zhiyi Lin, 2011 广东工业大学 计算机学院 Java集合框架包含的内容2-2CollectionListSet? Collection 接口存储一组不唯一,无序的对象 ? List 接口存储一组不唯一,有序(插入顺序)的对象? Set 接口存储一组唯一,无序的对象Map? Map接口存储一组键值对象,提供key到value的映射Page30 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 List接口的实现类ListArrayListLinkedList? ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素 和随机访问元素的效率比较高? LinkedList采用链表存储方式。插入、删除元素时效率比较高Page31 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 ArrayList集合类5-1? 存储多条狗狗信息,获取狗狗总数,逐条打印出各 条狗狗信息? 通过List接口的实现类ArrayList实现该需求 ? 元素个数不确定 ? 要求获得元素的实际个数 ? 按照存储顺序获取并打印元素信息Page32 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 ArrayList集合类5-2public class Test1 { public static void main(String[] args) { Dog ououDog = new Dog(&欧欧&, &雪娜瑞&); Dog yayaDog = new Dog(&亚亚&, &拉布拉多&); 创建ArrayList对象并把四个 Dog meimeiDog = new Dog(&美美&, &雪娜瑞&); 狗狗对象放入其中 Dog feifeiDog = new Dog(&菲菲&, &拉布拉多&);List&Dog& dogs = new ArrayList&Dog&(); dogs.add(ououDog); dogs.add(yayaDog); dogs.add(meimeiDog); 输出狗狗的数量 dogs.add(2, feifeiDog); // 添加feifeiDog到指定位置System.out.println(&共计有& + dogs.size() + &条狗狗。&); System.out.println(&分别是:&); 获取第i个元素 for (int i = 0; i & dogs.size(); i++) { Dog dog = (Dog) dogs.get(i); System.out.println(dog.getName() + &\t&+ dog.getStrain());} } }Page33 / 89演示示例:使用ArrayList集合类常用基础类 Chapter05 JavaZhiyi Lin, 2011 广东工业大学 计算机学院 ArrayList集合类5-3? 扩充以下几部分功能? 删除指定位置的狗狗,如第一个狗狗 ? 删除指定的狗狗,如删除feifeiDog对象 ? 判断集合中是否包含指定狗狗? List接口提供相应方法remove()、contains(),直接使用 即可Page34 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 ArrayList集合类5-4public class Test2 { public static void main(String[] args) { // 1、创建多个狗狗对象 … // 2、创建ArrayList集合对象并把多个狗狗对象放入其中 … 删除第一个狗狗和feifeiDog System.out.println(&删除之前共计有& +dogs.size() + &条狗狗。&);dogs.remove(0); dogs.remove(feifeiDog);System.out.println(&\n删除之后还有& + dogs.size() + &条狗狗。&); … 判断是否包含指定狗狗 if(dogs.contains(meimeiDog)) System.out.println(&\n集合中包含美美的信息&); else System.out.println(&\n集合中不包含美美的信息&); } }Page35 / 89Chapter05 Java 演示示例:使用ArrayList集合类常用基础类 Zhiyi Lin, 2011广东工业大学 计算机学院 ArrayList集合类5-5? E为类型参数,由程序里指定方法名boolean add(E e)说明在列表的末尾顺序添加元素,起始索引位置从0 开始 在指定的索引位置添加元素。索引位置必须介 于0和列表中元素个数之间 返回列表中的元素个数 返回指定索引位置处的元素。 判断列表中是否存在指定元素 从列表中删除元素 从列表中删除指定位置元素,起始索引位置从0 开始void add(int index, E element ) int size() E get(int index) boolean contains(Object o) boolean remove(Object o) E remove(int index)Page36 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 LinkedList集合类3-1? 在集合任何位置(头部、中间、尾部)添加、获取、 删除狗狗对象? 插入、删除操作频繁时,可使用LinkedList来提高效 率 ? LinkedList还额外提供对头部和尾部元素进行添加和 删除操作的方法Page37 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 LinkedList集合类3-2public class Test3 { public static void main(String[] args) { … // 创建多个狗狗对象 LinkedList&Dog& dogs = new LinkedList&Dog&(); dogs.add(ououDog); 创建LinkedList集合对象并把 dogs.add(yayaDog); 多个狗狗对象放入其中 dogs.addLast(meimeiDog); dogs.addFirst(feifeiDog); 获取第一条狗狗信息 Dog dogFirst= (Dog)dogs.getFirst(); System.out.println(&第一条狗狗昵称是&+dogFirst.getName() ); 获取最后一条狗狗信息 Dog dogLast= (Dog)dogs.getLast(); System.out.println(&最后一条狗狗昵称是&+dogLast.getName()); dogs.removeFirst(); dogs.removeLast(); …} }Page删除第一个狗狗和最后 一个狗狗演示示例:使用LinkedList集合类Zhiyi Lin, 2011 广东工业大学 计算机学院38 / 89Chapter05Java常用基础类 LinkedList集合类3-3? LinkedList的特殊方法? E为类型参数,由程序里指定方法名void addFirst(E e)说在列表的首部添加元素明voidE E EaddLast(E e)getFirst() getLast() removeFirst()在列表的末尾添加元素返回列表中的第一个元素 返回列表中的最后一个元素 删除并返回列表中的第一个元素EremoveLast()删除并返回列表中的最后一个元素Page39 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Map接口3-1? 建立国家英文简称和中文全名间的键值映射,并通过 key对value进行操作,应该如何实现数据的存储和操 作呢?? Map接口专门处理键值映射数据的存储,可以根据键 实现对值的操作 ? 最常用的实现类是HashMapPage40 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Map接口3-2public class Test4 { public static void main(String[] args) {使用HashMap存储多 组键值对Map countries = new HashMap(); countries.put(&CN&, &中华人民共和国&); countries.put(&RU&, &俄罗斯联邦&); countries.put(&FR&, &法兰西共和国&); countries.put(&US&, &美利坚合众国&); 获取指定元素的值 String country = (String) countries.get(&CN&); 获取Map元素个数 System.out.println(&CN对应的国家是:& + country);System.out.println(&Map中共有&+countries.size()+&组数据&);countries.remove(&FR&); 删除指定元素,判断是 System.out.println(&Map中包含FR的key吗?& + 否包含指定元素 countries.containsKey(&FR&));} }PageSystem.out.println( countries.keySet() ) ; System.out.println( countries.values() ); System.out.println( countries ); 显示键集、值集和键值对集Zhiyi Lin, 2011 演示示例:使用HashMap集合类 广东工业大学 计算机学院41 / 89Chapter05Java常用基础类 Map接口3-3? Map接口常用方法 (Map&K,V& )? K - 此映射所维护的键的类型 ? V - 映射值的类型方法名V put(K key, V val)V get (V key) V remove (Object key) int size() Set&K& keySet () Collection&V& values () boolean containsKey (Object key)说明以“键-值对”的方式进行存储根据键返回相关联的值,如果不存在指定 的键,返回null 删除由指定的键映射的“键-值对” 返回元素个数 返回此映射中包含的键的 Set 视图。 回此映射中包含的值的 Collection 视图。 如果存在由指定的键映射的“键-值对”, 返回trueZhiyi Lin, 2011 广东工业大学 计算机学院Page42 / 89Chapter05Java常用基础类 Map实现类的比较? HashMap(速度最快) ? 以哈希表为内核实现Map接口 ? key-value pairs的顺序和放入的顺序无关。 ? Key无重复 ? LinkedHashMap ? 以哈希表和链表为内核实现map接口 ? key-value pairs的顺序是放入的顺序。 ? key无重复 ? TreeMap(排序) ? 以二叉树为内核实现map接口 ? key-value pairs的顺序是按照key的升序进行排列 ? Key无重复Page43 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 迭代器Iterator2-1? 如何遍历List集合呢?? 方法1:通过for循环和get()方法配合实现遍历 ? 方法2:通过迭代器Iterator实现遍历 ? 所有集合接口和类都没有提供相应遍历方法,而 是由Iterator实现集合遍历 ? Collection 接口的iterator()方法返回一个Iterator, 然后通过Iterator接口的两个方法可实现遍历 ? boolean hasNext(): 判断是否存在另一个可访 问的元素 ? Object next(): 返回要访问的下一个元素Page44 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 迭代器Iterator2-2public class Test5 { public static void main(String[] args) { // 1、创建多个狗狗对象 Dog ououDog = new Dog(&欧欧&, &雪娜瑞&); … // 2、创建ArrayList集合对象并把多个狗狗对象放入其中 List dogs = new ArrayList (); dogs.add(ououDog); 通过迭代器依次输出所 … 有狗狗的信息 System.out.println(&使用Iterator遍历,所有狗狗昵称和品种是:&); Iterator it = dogs.iterator(); while (it.hasNext()) { Dog dog = (Dog) it.next(); System.out.println(dog.getName()+&\t&+dog.getStrain()); } } }Page45 / 89Chapter05 演示示例:使用Iterator遍历集合 Zhiyi Lin, 2011 广东工业大学计算机学院Java常用基础类 Collections类? 调用其静态方法,可实现: ? binarySearch():折半查找 ? sort():排序 ? reverse():将线性表进行逆序操作 ? rotate():以某个元素为轴心将线性表“旋转” ? swap():交换一个线性表中两个元素的位置 ? copy(List&? super T& dest, List&? extends T& src) :将所 有元素从一个列表复制到另一个列表 ? fill(List&? super T& list, T obj) :使用指定元素替换指定列 表中的所有元素。 ? nCopies(int n, T o) ? shuffle(List&?& list) :使用默认随机源对指定列表进行置换。 ? sort(List&T& list) ? …Chapter05 Java常用基础类Page46 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院 Collections类? 封装器的功能,把一个集合转化成另一个特殊集合 ? unmodifiableXXX:转换成只读集合,这里XXX代表六种 基本集合接口:Collection、List、Map、Set、 SortedMap和SortedSet ? synchronizedXXX:转换成同步集合? 。。。Page47 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 集合类比较表类 实现的接口 数据结构 元素的可重复 性可 可 可 可 不可 不可元素的顺序按加入顺序 按加入顺序 按加入顺序 按加入顺序 与加入顺序无关 按加入顺序ArrayList LinkedList Vector Stack HashSet LinkedHashSetList List List List Set Setarray linked list array array hash table hash table linked listTreeSetHashMapSortedSetMaptreehash table不可key不可排序与加入顺序无关 按加入顺序 依key排序 与加入顺序无关 与加入顺序无关LinkedHashMapMaphash table linked list tree hash table hash tablekey不可TreeMap Hashtable PropertiesSortedMap Map Mapkey不可 key不可 key不可Page48 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Java异常? 目标 ? 理解异常的概念? 运用 try 块、catch 块和 finally 块处理异常? 运用多重 catch 块处理异常 ? 运用嵌套 try/catch 块处理异常 ? 运用关键字 throw 和 throws 处理异常 ? 运用JAVA编写和使用自定义异常Page49 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 什么是异常?? 在运行时发生的错误异常情况 public class ExceptionRaised { public ExceptionRaised() { } 异常 public int calculate( int operand1, int operand2) { int result = operand1 / operand2; 程序突然终止并将控制交 } 给操作系统 public static void main(String[] args) { ExceptionRaised obj = new ExceptionRaised(); int result = obj.calculate(9, 0); System.out.println(result); } }Page50 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 什么是异常?? 异常就是在程序的运行过程中所发生的意外事件,它中 断指令的正常执行。? Java中提供了一种独特的处理异常的机制,通过异常来 处理程序设计中出现的错误Page51 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 为何使用意外处理把出错处理和正常代码分开。比如有程序是处理文件,大家看 流程,这个流程中充满了错误可能。readFile {打开文件;打不开咋办? 判断大小; 大小判断失败怎么办?(磁带)分配内存; 内存不够读入内存; 文件读不出来 关掉文件; 文件关不掉。。}解决方法:写大量的if语句。Page52 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 传统的错误检测和纠正errorCodeType readFile { initialize errorCode = 0; ① 打开文件; if (打开文件成功) {② 判断文件长 if (文件长取到) {③ 分配内存 if (分内存成功) { ④ 读入内存 if (读文件失败) {errorCode = -1; }//读文件判断 } else {errorCode = -2; } //分配内存失败 } else {errorCode = -3; } //取不到文件长 ⑤ 关闭文件; if (文件没关&& errorCode == 0) {errorCode = -4; } else {errorCode = errorCode and -4; } } else {errorCode = -5; } return errorC }Page53 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 ? 从上面的流程可看出真正有用的代码不多,就五条而已,其 它全部是判断错误用的,主要逻辑都被错误处理代码混得看 不清了,程序可读性差,出错返回信息量太少。 ? 在Java中,处理这种情况的方法是利用异常处理,把出错处 理和正常代码分开,Java异常处理通过5个关键字 try,catch,finally,throw和throws进行管理。Page54 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Java的解决方式readFile {//结构清楚,无需自己判断,代码量小。 try { 打开文件; 判断大小; 分配内存; 读入内存; 关掉文件; } catch (文件打开失败) { 处理代码; } catch (大小取不到失败) { 处理代码; } catch (内存分配失败) { 处理代码; } catch (读取失败) { 处理代码; } catch (文件关闭失败) { 处理代码; }}Page55 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 Java异常类的分类与层次? 异常类的层次结构 ? 在jdk中,每个包中都定义了异常类,而所有的异常类都直接或间接地 继承于java.lang.Throwable类。当Java程序遇到不可预料的错误时, 会实例化一个从Throwable类继承的对象。 ? java中的异常类可分为两大类: ? ◇ Error: 错误Error类指的是系统错误或运行环境出现的错误,这 些错误一般是很严重的错误,即使捕捉到也无法处理,由Java虚 拟机生成并抛出,包括系统崩溃、动态链接失败、虚拟机错误等, 在Java程序中不做处理。 ? ◇ Exception: 异常Exception类则是指一些可以被捕获且可能恢复 的异常情况,是一般程序中可预知的问题。对于异常可分为两类:C (1) 运行时异常:程序中可以不做处理,直接由运行时系统来处理。 C (2) 非运行时异常:在程序中必须对其进行处理,否则编译器会指出 错误。Page56 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 异常类的结构层次java.lang Object Error Throwable Exception RuntimeException ClassNotFoundException IllegalAccessException CloneNotSupportedException InstantiationException InterruptedException NoSuchFieldException NoSuchMethodException java.sql DataTruncation SQLException SQLWarning java.io EOFException IOException FileNotFoundExceptionChapter05 Java常用基础类ArithmeticException ArraystoreException IndexOutOfBoundsException NullPointerExceptionPage57 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院 运行时异常? 运行异常表现在Java运行系统执行过程中的异常,它是指 Java程序在运行时发现的由Java解释抛出的各种异常,包括 算术异常、下标异常等等。表6-1列出几种常见的异常Page58 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 运行时异常实例// J_Test2.java public class J_Test2 { public static void main(String args[]) { Object x = new Integer(0); System.out.println((String)x); } // End of method: main } // End of class: J_Test2良好的编程习惯,可以减少很多异常的发生Page59 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 非运行时异常? 非运行时异常是由编译器在编译时检测是否会发生在方法的执行过程中 的异常。非运行异常是Non-RuntimeException及其子类的实例,可以通 过throws语句抛出。Java在其标准包Java.lang、java.util、java.io、 java.net中定义的异常类都是非运行异常类。表6-2列出了常见的非运行 异常。Page60 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 实例10 // J_Test6.java 11 import java.io.*; 12 13 public class J_Test6 14 { 15 16 public static void main(String args[]) 17 { 18 FileInputStream f= new FileInputStream(&test.txt&); 19 20 b= f.read(); 21 while (b!=-1) 22 { 23 System.out.print(((char)b)); 24 b= f.read(); 25 } 26 f.close(); 27 } // End of method: main 28 29 } // End of class: J_Test6 30Page61 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 OutputPage62 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 异常的处理机制? 每当Java程序运行过程中发生一个可识别的运行错误时,即 该错误有一个异常类与之相对应时,系统都会产生一个相应 的该异常类的对象,即产生一个异常。一旦一个异常对象产 生了,系统中就一定有相应的机制来处理它,确保不会产生 死机、死循环或其他对操作系统的损害,从而保证了整个程 序运行的安全性。这就是Java的异常处理机制。 ? Java中处理异常有两种方式:捕获异常、声明抛弃异常。 ? 捕获异常,就地解决,并使程序继续执行。? 声明、抛出异常也就是将异常向外转移,即将异常抛出 方法之外,由调用该方法的环境去处理。Page63 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 捕获异常? 当Java运行时系统得到一个异常对象时,它将会沿着方法的 调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理 这种类型的异常的方法后,运行时系统把当前异常对象交给 这个方法进行处理,这一过程称为捕获(catch)异常。这是积 极的异常处理机制。如果Java运行时系统找不到可以捕获异 常的方法,则运行时系统将终止,相应的Java程序也将退出。Page64 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 捕获异常? 处理异常的程序结构如下: try{ //接受监视的程序块,在此区域内发生的异常,由catch中指 定的程序处理 }catch(要处理的异常种类和标识符){ //处理异常 }catch(要处理的异常种类和标识符){ //处理异常 } … }finally{ //最终处理 }Page65 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 捕获异常要监控的程序语句包含在此块中try释放资源等finallycatch以合理的方式 捕获和处理异常throwthrows手动引发异常指定由方法引发的异常Page66 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 try 和 catch 块 2-1代码块try引发单元catch程序控制异常执行 catch 后程序 继续正常运行Chapter05 Java常用基础类Page67 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院 try 和 catch 块 2-2? try 和 catch 块的用法public class ArithmeticException { /** 构造方法. */ public ArithmeticException() { class ExceptionRaised { } /** 构造方法.void main(String[] args) { public static */ public ExceptionRaised()new ExceptionRaised(); ExceptionRaised obj = { } try { /** /* 定义变量 result 以存储结果. */ * 这个方法运行时将会产生一个异常. int result = obj.calculate(9, 0); * @param operand1 除法中的分子 System.out.println(result); * @param operand2e) { }catch (Exception 除法中的分母 * @return int 返回除法的结果 System.err.println(“发生异常:& + e.toString()); */ e.printStackTrace(); public int calculate(int operand1, int operand2) { } } int result = operand1 / operand2; } } }演示:示例 1Page68 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 finally 块try、catch 和 finally 块的执行流程try 块异常 无异常catch 块finally 块69 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类Page 实例: J_Test8.javapublic class J_Test8 { public static void main(String args[]) { int i=0; try { // ArrayIndexOutOfBoundsException System.err.println(&Input=& + args[0]); } catch (ArrayIndexOutOfBoundsException e) { // pick a default value System.err.println(&ArrayIndexOutOfBoundsException occurs& ); // Exit the program if using &System.exit(0);& } finally { System.out.println(&Enter \&finally\& block.&); } // End of try/catch/finally structure } // End of method: main } // End of class: J_Test8Page70 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 编译、运行 & 结果Page71 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 多重 catch 块3-1? 一段代码可能会生成多个异常 ? 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个类 型与异常类型匹配的语句 ? 执行其中的一条 catch 语句之后,其他的 catch 语句将被忽略try{ ……. } catch(ArrayIndexOutOfBoundsException e) { …… } catch(Exception e) { …… }Page72 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 多重 catch 块3-2? 使用多重 catch 语句时,异常子类一定要位于异常父类之前try{…...} catch(Exception e) { …… } catch(ArrayIndexOutOfBoundsException e) { …… }×Java常用基础类Page73 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05 多重 catch 块3-3?class ExceptionCode { 多重catch的使用 /**构造方法.*/ class UnreachableCode { protected ExceptionCode() { /**构造方法.*/ } protected UnreachableCode() { /**这个方法将将零作除数.*/ } public void calculate() { /** try类和应用程序的唯一进入点. * { * int num = args 字符串参数的数组 @param 0; */int num1 = 42 / }catch static void main(String[] args) { public (Exception e) { System.out.println(&父类异常 catch 子句&); ExceptionCode obj = new ExceptionCode(); }catch (ArithmeticException ae) { obj.calculate(); }// 错误 C 不能到达的代码 } System.out.println(&这个子类的父类是& + &exception 类,且不能到达&); } 演示:示例 2 } }Page74 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 class NestedException { /* 构造方法。 */ protected NestedException() { } /** 这个方法检测数字的格式。 * @param argument 用于存储 args 的值。 */ public test(String[] argumnet) { try { int num = Integer.parseInt(args[1]); /* 嵌套 try 块。 */ try { int numValue = Integer.parseInt(args[0]); System.out.println(“args[0] + “的平方是 & + numValue * numValue); } catch (NumberFormatException nb) { System.out.println(“不是一个数字! &); } 因此需要嵌套 } catch (ArrayIndexOutOfBoundsException ne) { 异常处理程序 System.out.println(“请输入数字!!!&); } } /**main方法*/ public static void main(String[] args) { NestedException obj = new NestedException(); obj.test(args[0]); } } 如果内层 try 没有相应的嵌套 try C catch 块(例:NestTry.java)Pagecatch,则检查外层 catchZhiyi Lin, 2011 广东工业大学 计算机学院75 / 89Chapter05Java常用基础类 声明异常? 一个方法不处理它产生的异常,而是沿着调用层次向上传 递,由调用它的方法来处理这些异常,叫声明异常.? 声明异常的方法? 在本方法内就可以不处理这些异常 ? 调用该方法的方法就必须处理这些异常? 在产生异常的方法名后面加上要抛出(throws)的异常的 列表 ? returnType methodName([parameterlist]) throws exceptionList 例:int g(float h) throws ExceptionA, ExceptionB, ExceptionC { // method body }Page76 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 5.3.4 声明异常例:若因某 种原因不 想在方法 体中处理 异常public int compute(int x) throws ArithmeticException e) { return z=100/x;} public method1() { try { x=System.in.read(); compute(x);} catch(IOException ioe) { System.out.println(“read error”); } catch(ArithmeticException e) { System.out.println(“devided by 0”); } }Page77 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 5.3.4 声明异常? 函数调用及异常处理示意图method1处理computer抛出异常Page78 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 5.3.4 声明异常例:说出程序执行结果 public class exception1 { void Proc(int sel) throws ArithmeticException, ArrayIndexOutOfBoundsException { System.out.println(“In Situation& + sel ); if (sel==0) { System.out.println(&no Exception caught&); }else if(sel==1) {int iArray[]=new int[4]; iArray[10]=3; } }Page79 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 5.3.4 声明异常public static void main(String args[]) { try { Proc(0); Proc(1); }catch(ArrayIndexOutOfBoundsException e){ System.out.println(&Catch&+e); } }c:&jview throwsException In Situation 0 no Exception caught In Situation 1 Catch java.lang.ArrayIndexOutOfBoundsException:10Page80 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 5.3.5 抛出异常? 抛出异常: 不是出错产生,而是人为地抛出 ? throw ThrowableO ? throw new ArithmeticException(); ? 例:编写程序人为抛出(JavaThrow.prj) ArithmeticException, ArrayIndexOutOfBoundsException StringIndexOutOfBoundsExceptionA method throwPageExceptionAnother methodcaughtZhiyi Lin, 2011 广东工业大学 计算机学院81 / 89Chapter05Java常用基础类 class JavaThrow { public static void main(String args[]) {5.3.5 抛出异常try{ throw new ArithmeticException();} catch(ArithmeticException ae) { System.out.println(ae); } try{ throw new ArrayIndexOutOfBoundsException();} catch(ArrayIndexOutOfBoundsException ai) { System.out.println(ai); }try { throw new StringIndexOutOfBoundsException();} catch(StringIndexOutOfBoundsException si){ { System.out.println(si); }Page82 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 用户自定义异常? 自定义异常概念 ? 使用自定义异常的时候? JavaAPI提供的内置异常不一定总能捕获程序中发 生的所有错误。有时会需要创建用户自定义异常? 自定义异常需要继承Exception 及其子类Page83 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 用户自定义异常 2-2 class ExceptionClass {ExceptionClass(int val) { size = ? try { 创建用户自定义异常 checkSize(); ? 继承 Exception 或其子类 } catch (ArraySizeException e) { System.out.println(e); class ArraySizeException extends NegativeArraySizeException { } /** 构造方法。 */ } ArraySizeException() { /** 声明变量以存储数组的大小和元素. */ super(“您传递的数组大小非法&); class UserDefinedExceptions { } } private int[] /** 构造方法. */ /** 检查数组长度的方法. protected UserDefinedExceptions() { } * @ throws 一个 ArraySizeException */ /** public void checkSize() throws ArraySizeException { * 类和应用程序的唯一入口点. if (size & 0) { * @param argArraySizeException(); throw new 字符串参数的数组 */ } array = new int[3]; public static void main(String[] arg) { for (int count = 0; count= new ExceptionClass(Integer.parseInt(arg[0])); ExceptionClass obj & 3; count++) { } array[count] = count + 1; } } } 示例: 示例 6 Chapter05 Java常用基础类 } Zhiyi Lin, 2011 广东工业大学 84 / 89 计算机学院Page 对异常处理的进一步讨论:(1)对Error类或其子类的对象,程序中不必进行处理。 (2)对RuntimeException类或其子类,程序中可以不必进行处理。 (3)除此之外的异常,程序员都应该在程序中进行处理。 要么用try-catch-finally进行捕获处理 要么明确表示不处理从而声明抛出异常 要么先捕获处理然后再次抛出。 (4)Java的异常处理机制(try-catch-finally语句、throws 子句、throw 语句) 带来Java程序代码结构上的改变。 (5)不能滥用异常机制。简单的出错判断建议用if语句。 (6)不要过分细分异常。Page85 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 其它常用类? 其它本讲未涉及的常用类? System类:访问系统属性、访问环境变量、加载文件和库、快速复制 数组、取得系统时间、系统退出命令、执行垃圾回收。 ? 运行时类Runtime:查看系统内存、终止JVM虚拟机、运行系统程序、 使用关闭钩子。 ? 字符串分隔类StringTokenizer ? 日期类:Locale类、TimeZone类、GregorianCalendar类、 DateFormat类 ? 集合类: Vector类、TreeSet类、TreeMap类等Page86 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 本章主要参考资料? 《Java SE应用程序设计》张利国 刘伟编著 北京理工大学出 版社 第8章异常处理 第9章 精通常用的Java类 第11章 集合 与映射 ? 《Java高手真经(编程基础卷):Java核心编程技术(Java 基础+核心库+图形+网络+高级特性) 第11课 Java常用实体 类、第12课 Java常用集合类 第7章 Java面向对象编程扩展Page87 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类 作业? 编写复数类程序,1选做)增加定义复数类的复数除方法, 用throws声明抛出DividedByZeroException(自定义异 常); 在合适的位置处理这些异常。? 2选做)主类中使用args命令行参数传入两个复数操作数, 并编程自定义异常LessParamException与NoOperandEPage88 / 89Zhiyi Lin, 2011 广东工业大学 计算机学院Chapter05Java常用基础类
更多搜索:
赞助商链接
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 static cast int 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信