第十五章 泛型与集合框架
泛型
泛型用于建立具有类型安全的集合框架,如链表、散列映射等数据结构,在使用泛型类建立的数据结构时,不必进行类型转换。
泛型类声明
可以用class名称<泛型列表>声明一个类 class People<E>
People泛型名称,E是泛型,E没有被指明是何种数据,可以是任何对象或接口,但不能是基本数据类型。
泛型类的类体 : class Cone<E> 一个锥,只关心底面积,不关心底的具体形状,只关心底面积和高计算体积
double height; E bottom; bublic Cone(E b){bottm =b;} }
使用泛型类声明:和普通类相比,泛型类声明和创建对象时多了<>,而且必须要用具体的类型替换<>中的类型
如:Cone<Circle> coneOne; coneOne =new Cone<Circle>(new Circle());
链表
由若干个称作结点的对象组成的一种数据结构,每个结点含有一个数据和下一个结点引用,或含有一个数据并含有上一个结点的引用。
LinkedList<E>泛型类
创建的对象以链表结构存储数据,对象为链表对象。LinkedList<String> mylist=new LinkedList<String>();创建一个空链表
必须指明E的具体类型,然后用add(E obj)方法向链表依次增加结点。
常用方法见P445
遍历链表:使用集合提供的迭代器 使用iterator()方法获取一个Iterator对象。然后用add()方法向链表添加节点。
排序与查找:
public static sort(List<E>list)该方法可以将list中的元素按升序排列。
int binarySearch(List<E>list,T key,CompareTo<T> c)使用折半法查找list是否含有参数key相等的元素,如果key与链表中的元素相同,方法返回和key相等的元素在链表的索引位置。,反则返回-1.
排序链表或查找某对象是否和链表中的结点中的对象相同,都涉及对象的大小关系。
String类实现了Compareble接口,规定字符串按字典序比较大小。如果链表中存在的对象不是字符串数据,那么创建对象的类必须实现Comparable街廓,及实现该接口中的方法intCompareTo(Object b)来规定对象的大小关系。
洗牌与旋转
Collection类提供了将链表中的数据重新随机排列的类方法以及旋转链表中数据的类方法。
1.public static void shuffle(List<E>list)讲list中的忽聚按洗牌算法重新随机排列。
2.static void rotate(List<E>list,int distance)旋转链表中的数据。参数为正向右转,否则向左。
3.public static void reverse(List<E>list)翻转list中的数据。
堆栈
一种先进先出的数据结构,只能在一端输入或输出。输入数据的操作是压栈,输出是弹栈。
使用Java.util中的Stack<E>泛型类创建一个堆栈对象,堆栈对象可以使用
public E push(E item)实现压栈操作; pubilc E pop()实现弹栈。
public boolean Empty() 看是否还有数据;public E peek(0获取堆栈顶的数据,但不删除;public int search(Object data)获取数据在栈中的位置,最顶端是1,往下依次增加。
散列映射
HashMap<K,V>泛型类实现了接口Map<K,V>,编程时可以使用接口回调,实现接口方法。
HashMap<K,V>对象采取散列表数据结构存储数据,散列映射用于存储键/对时候,允许把任何数量的键/值存储在一起。键不可发生逻辑冲突。如果发生冲去,先前的键/值会被替换。散列映射会在他需要更多空间时候自动增加容量。
HashMap<K,V>泛型类建立的对象是泛型映射:HashMap<String,Student>hashtable=HashSet<String,Student>();
hastable就可以存储键/值对数据,键是一个String对象,值是Student对象。hashtable调用public V put(K key,V value)存放,并且返回键所对应的值。
常用方法见P452
遍历散列映射
public Collection<V>values()返回一个实现Collection<V>接口创建的对象,可以使用接口回调技术,将对象的引用付给接口变量,接口变量回调interator方法获取对象。
对于经常需要进行查找的数据可以采用散列映射存储数据,为数据制定一个查找他的关键字,然后按着键/对,将关键字和数组存入散列映射。
树集
TreeSet<E>泛型类
TreeSet<E>是实现接口Set<E>的类。创建的对象是树集,采用树结构存储数据,结点中的数据会按照数据的“大小”顺序一层一层地依次排列,在同一层的从左到右按字典序从小到大递增排列。
TreeSet<String>mytree =new TreeSet<String>(); 然后使用add方法添加结点
结点的大小关系:树集结点的排列与链表不同,不安添加的先后顺序排列,结点中的数据会按照数据的“大小”顺序一层一层地依次排列,在同一层的从左到右按字典序从小到大递增排列,下一层都比上一层小。String类实现了Comparble接口中的compareTo(Object str)方法,字符串对象调用CompareTo(String s)方法按字典序与参数s指定的字符串比较大小。对象可以调用CompareTo(Obeject str)方法比较对象大小,如:a.compareTo(b)<0,a小于b。TreeSet类常用方法见P455 注:树集结点不允许大小相同。当一个树集中的数据是实现Comparable类的对象,则按对象大小关系排序。