集合
一:.数据结构介绍
1.一般将数据结构分为两大类:线性数据结构和非线性数据结构。
(1)线性数据结构:线性表、栈、队列、串、数组和文件。
(2)非线性数据结构:树和图。
2.线性表:
3.链表:(1)单向链表
(2)循环链表
(3)双向循环链表
4.栈:栈(Stack)也是一种特殊的线性表,是一种后进先出(LIFO)的结构。栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶(top),
表头称为栈底(bottom)。
5.队列:队列(Queue)是限定所有的插入只能在表的一端进行,而所有的删除都在表的另一端进行的线性表。
表中允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front)。
队列的操作是按先进先出(FIFO)的原则进行的。
6.散列表:散列表又称为哈希表。散列表算法的基本思想是:以结点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,
以这个值作为该结点存储在散列表中
的地址。当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放到新的散列表中,原先的散列表将被删除。
7.JAVA的集合框架:JAVA的集合框架实现对各种数据结构的封装,以降低对数据管理与处理的难度所谓框架就是一个类库的集合,
框架中包含很多超类,编程者创建这些超类的子类可较方便的设计设计程序所需的类。例如:Swing类包
集合(Collection或称为容器)是一种包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可以由不同类
型的对象组成。
8.集合类的作用:
– Java的集合类提供了一些基本数据结构的支持。
– 例如Vector、Hashtable、Stack等。
9.集合类的使用:
– Java的集合类包含在java.util包中。
– import java.util.*;
10.集合类的特点:
(1)只容纳对象。数组可以容纳基本数据类型数据和对象。
如果集合类中想使用基本数据类型,又想利用集合类的灵活性,可以把基本数据类型数据封装成该数据类型的包装器对象,然后放入集合中处理。
(2) 集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,这样设计的目的是为了集合类的通用性。
因为Object类是所有类的祖先,所以可以在这些集合中存放任何类的对象而不受限制,但切记在使用集合成员之前必须对它重新造型。
11.新旧集合类:在JDK1.0和JDK 1.1中提供了Vector(矢量),Hashtable ( 哈希表) , Stack ( 堆栈) ,Properties(属性集)等集合类,
尽管这些类非常有用,但却彼此独立,缺少一个统一集中的机制。
(1)Vector类:Vector类类似长度可变的数组。 Vector中只能存放对象。 Vector的元素通过下标进行访问。
(2)Stack类:Stack类是Vector的子类。 Stack类描述堆栈数据结构,即LIFO。
(3)Hashtable类:Hashtable通过键来查找元素。Hashtable用散列码(hashcode)来确定键。
所有对象都有一个散列码,可以通过Object类的hashCode()方法获得。
12.在JDK1.2中,JAVA设计了一个统一的类集,并对上述类进行了改写,使其统一纳入JAVA的集合框架。
集合框架中的基本接口:
(1)Collection:集合层次中的根接口,JDK未提供这个接口的直接实现类。
(2)Set:不能包含重复的元素。对象可能不是按存放的次序存放,也就是说不能像数组一样按索引的方式进行访问,SortedSet是一个按照升序排列元素的Set。
(3)List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。
(4)Map:包含了key-value对。Map不能包含重复的key
(5)SortedMap是一个按照升序排列key的Map。
实验十一 集合
实验时间 2018-11-8
1、实验目的与要求
(1) 掌握Vetor、Stack、Hashtable三个类的用途及常用API;
(2) 了解java集合框架体系组成;
(3) 掌握ArrayList、LinkList两个类的用途及常用API。
(4) 了解HashSet类、TreeSet类的用途及常用API。
(5)了解HashMap、TreeMap两个类的用途及常用API;
(6) 结对编程(Pair programming)练习,体验程序开发中的两人合作。
2、实验内容和步骤
实验1: 导入第9章示例程序,测试程序并进行代码注释。
测试程序1:
l 使用JDK命令运行编辑、运行以下三个示例程序,结合运行结果理解程序;
l 掌握Vetor、Stack、Hashtable三个类的用途及常用API。
|
//示例程序1 import 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); } }
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 < cats.size(); i++) ((Cat) cats.elementAt(i)).print(); } } |
|
//示例程序2 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; i < months.length; i++) stk.push(months[i]); System.out.println(stk); System.out.println("element 2=" + stk.elementAt(2)); while (!stk.empty()) System.out.println(stk.pop()); } } |
|
//示例程序3 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); } } |
示例程序1运行结果如下:
import 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); } } 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 < cats.size(); i++) { //if(cats.elementAt(i) instanceof Cat) { //((Cat) cats.elementAt(i)).print(); //} ((Cat) cats.elementAt(i)).print();//程序有未检查异常 // else { // ((Dog) cats.elementAt(i)).print(); // } } } }