• 1. Java集合类集合类概述 集合类作用、特点 旧的集合类介绍 Vector、Hashtable、Stack 新的集合类介绍 Collection、Set、Map、List 1
  • 2. 集合类概述集合类的作用: Java的集合类提供了一些基本数据结构的支持。 例如Vector、Hashtable、Stack等。 集合类的使用: Java的集合类包含在java.util包中。 import java.util.*; 2
  • 3. 集合类概述集合类特点一: 只容纳对象。这一点和数组不同,数组可以容纳 基本数据类型数据和对象。 如果集合类中想使用基本数据类型,又想利用 集合类的灵活性,可以把基本数据类型数据封装 成该数据类型的对象,然后放入集合中处理。 3
  • 4. 集合类概述集合类特点二: 集合类容纳的对象都是Object类的实例,一旦把 一个对象置入集合类中,它的类信息将丢失,这样设 计的目的是为了集合类的通用性。 因为Object类是所有类的祖先,所以可以在这些 集合中存放任何类的对象而不受限制,但是切记在使 用集合成员之前必须对它重新造型。 4
  • 5. 集合类概述下面根据JDK版本分两部分介绍Java的 集合类。 第一部分:JDK1.1版本中的集合类。 第二部分:JDK1.2以后版本中的集合类。 5
  • 6. 数组数组 基本数据类型数组 对象数组 举例说明数组的定义、使用。 6
  • 7. class Honeybee{ int value; Honeybee(int v){ value=v; } public String toString(){ return new Integer(value).toString(); } } public class ArraySize{ public static void main(String[] args){ Honeybee[] a; /* System.out.println(a.length); 产生编译错误,因为a没有定义大小*/ Honeybee b[] = new Honeybee[5]; System.out.println(b.length); //输出5 for(int i=0; i
  • 8. Honeybee[] c = new Honeybee[4]; for(int i=0; i
  • 9. public class ArraySize2{ public static void main(String[] args){ int[] a; /* System.out.println(a.length); 产生编译错误,因为a没有定义大小*/ int b[] = new int[5]; System.out.println(b.length); //输出5 for(int i=0; i
  • 10. int[] d= {100,200,300}; System.out.println(d.length); // 输出3 a = d; //数组之间赋值 System.out.println(a.length); // 输出3 for(int i=0; i
  • 11. 旧的集合类Vector Stack Hashtable 11
  • 12. Vector类Vector类实现了长度可变的数组。 Vector中只能存放对象。 Vector的元素通过下标进行访问。 Vector类关键属性: capacity表示集合最多能容纳的元素个数。 capacityIncrement表示每次增加多少容量。 size表示集合当前元素个数。 Vector v = new Vector(100)12
  • 13. Vector类Vector类关键方法: void addElement(Object obj) void add(int index, Object element) Object elementAt(int index) void insertElementAt(Object obj, int index) 13
  • 14. Vector类举例1import java.util.Vector; class Cat { private int catNumber; Cat(int i){catNumber = i;} void print(){System.out.println("Cat #"+catNumber);} } class Dog { private int dogNumber; Dog(int i){dogNumber = i;} void print(){System.out.println("Dog #"+dogNumber);} } 转下页 14
  • 15. Vector类举例1接上页: public class CatsAndDogs{ public static void main(String[] args){ Vector cats = new Vector(); for(int i=0; i<7; i++) cats.addElement(new Cat(i)); cats.addElement(new Dog(7)); for(int i=0; i
  • 16. Vector类举例2修改Vector例1,用Enumeration。 import java.util.Vector; import java.util.Enumeration; class Cat { private int catNumber; Cat(int i){catNumber = i;} void print(){System.out.println("Cat #"+catNumber);} } class Dog { private int dogNumber; Dog(int i){dogNumber = i;} void print(){System.out.println("Dog #"+dogNumber);} } 转下页 16
  • 17. Vector类举例2接上页: public class CatsAndDogs{ public static void main(String[] args){ Vector cats = new Vector(); for(int i=0; i<7; i++) cats.addElement(new Cat(i)); cats.addElement(new Dog(7)); // for(int i=0; i
  • 18. Stack类Stack类是Vector的子类。 Stack类描述堆栈数据结构,即LIFO。 Stack类的关键方法: public void push(Object item) public Object pop() public Object peek() public boolean empty() 演示//把项压入栈顶 移除栈顶对象并作为此函数的值返回该对象 //查看栈顶对象而不移除它 // 测试堆栈是否为空 18
  • 19. Stack类举例 import java.util.*; public class Stacks{ static String[] months={"1","2","3","4"}; public static void main(String[] args){ Stack stk = new Stack(); for(int i=0; i20. Hashtable类Hashtable通过键来查找元素。 Hashtable用一个特殊的值来确定键,名为hashcode(散列码)。所有对象都有一个 散列码,可以通过Object 类的hashCode() 方法获得。 20
  • 21. Hashtable举例该例子用来检验Math.random()方法的随 机性。在理想情况下,它应该产生一系列完 美的随机分布的数字。为了验证这一点,我 们需要生成数量众多的随机数字,然后计算 落在不同范围内的数字量。该程序生成 10000个随机数,看它们在0~20之间的 分布如何。 返回带正号的 double 值,大于或等于 0.0,小于 1.0。 21
  • 22. Hashtable举例 import java.util.*; class Counter{ int i=1; public String toString(){ return Integer.toString(i); } } public class Statistics{ public static void main(String[] args){ Hashtable ht = new Hashtable(); for(int i=0; i<10000; i++){ Integer r = new Integer((int)(Math.random()*20)); if(ht.containsKey(r)) ((Counter)ht.get(r)).i++; else ht.put(r, new Counter()); } System.out.println(ht); } }22
  • 23. 新集合类Java1.2开始又一个庞大的集合体系,它用来完成各种集合操作。 Collection List Set Map 23
  • 24. 集合框架中的接口24
  • 25. 集合框架中的接口Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。 Set:不能包含重复的元素。SortedSet是一个按照升序排列元素的Set。 List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。 Map:包含了key-value对。Map不能包含重复的key。SortedMap是一个按照升序排列key的Map。25
  • 26. Collection26
  • 27. SetSet中的元素必须唯一。 添加到Set中的元素必须定义equals方法,以提供算法来判断欲添加进来的对象是否与已经存在的某对象相等,从而建立对象的唯一性。 实现Set接口的类有HashSet,TreeSet。 4627351Set集27
  • 28. Set28
  • 29. Set举例import java.util.*; public class SetDemo { public static void main(String[] argv) { HashSet h = new HashSet(); //也可以 Set h=new HashSet() h.add("One"); h.add("Two"); h.add("One"); // DUPLICATE h.add("Three"); Iterator it = h.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } 29
  • 30. 回顾:接口可以作为一种引用类型使用,如: DriveControl control = new Car(); control.startEngine(); 接口创建一个完整的Car实例,Car是 实现接口DriveControl的一个类//访问接口中定义的方法P4930
  • 31. Set举例import java.util.*; public class SetDemo { public static void main(String[] argv) { HashSet h = new HashSet(); //也可以 Set h=new HashSet() h.add("One"); h.add("Two"); h.add("One"); // DUPLICATE h.add("Three"); Iterator it = h.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } Iterator讲解 见P132 6.3.431
  • 32. ListList的明显特征是它的元素都有一个确定的顺序。 实现它的类有ArrayList和LinkedList。 ArrayList内存中是顺序存储的。 LinkedList内存中是以链表方式存储的。 2114List (列表)012332
  • 33. ArrayList举例 import java.util.*; public class ArrayListDemo { public static void main(String[] argv) { ArrayList al = new ArrayList(); // Add lots of elements to the ArrayList... al.add(new Integer(11)); al.add(new Integer(12)); al.add(new Integer(13)); al.add(new String("hello")); // First print them out using a for loop. System.out.println("Retrieving by index:"); for (int i = 0; i34. LinkedList类举例: import java.util.*; public class LinkedListDemo { public static void main(String[] argv) { LinkedList l = new LinkedList(); l.add(new Object()); l.add("Hello"); l.add("zhangsan"); ListIterator li = l.listIterator(0); while (li.hasNext()) System.out.println(li.next()); if (l.indexOf("Hello") < 0) System.err.println("Lookup does not work"); else System.err.println("Lookup works"); } }34
  • 35. MapMap接口用来维持 很多“键-值”对,以 便通过键来查找相应 的值。 HashMap基于散列 表实现(替代Hashtable) TreeMap在一个二 叉树的基础上实现 k3→v2k1 →v1k2 →v1k4 →v3Map(映射)35
  • 36. HashMap举例: import java.util.*; public class HashMapDemo { public static void main(String[] argv) { HashMap h = new HashMap(); // The hash maps from company name to address. h.put("Adobe", "Mountain View, CA"); h.put("IBM", "White Plains, NY"); h.put("Sun", "Mountain View, CA"); String queryString = "Adobe"; String resultString = (String)h.get(queryString); System.out.println("They are located in: " + resultString); } }36