当前位置:编程学习 > JAVA >>

Java中的集合类--复习

第10章 Java中的集合类
10.1 集合类与数据容器
     Java用集合类来容纳不同种类的数据,这种容纳是建立在未知的基础上,即Java要用有限种类的集合类,来容纳无限种类的数据对象。
¯       分类
µ     以数组为代表的线性表型的数据结构
以Collection为基类--封装了线性表的插入、删除等基本操作
µ     以Map为代表的“键-值”对类型的数据结构
以Map为基类--封装了“键-值”对的结构
10.2 线性表型的集合
     用线性表型的集合可以描述和容纳以线性表方式(顺序)存储的数据对象。包括数组、Vector、List、Stack和Set等。
¯       顺序访问的典范——数组类
     数组就是最常见的线性表。定义和使用数组的动作是通过引用来实现的(即通过new关键字返回一个新创建数组的引用)并可通过数组的引用,执行对数组元素的访问操作。
例10.1编写程序展示如何初始化数组、访问数组对象。
注意:数组,乃至后文描述的各种集合类型,都是一种可以保存数据以及对象的“容器”。
µ     数组对象的局限性
ü      数组无法更好地满足动态增长这个需求。
ü      数组中元素一旦被确定,向它们中间插入或删除元素的工作需要耗费较大的资源。
¯        链表式的List接口
     在线性表的数据结构里,有一种以“链条”的方式存储和管理数据的结构,称它为“链表”。
µ     链式存储方式和数组的比较
µ     java.util.List接口:封装了“以链表形式存储和管理数据”的功能,如果使用实现List接口的类,如Vector、LinkedList类,就可以使用链表的方式来存储数据。
µ     void add(int index, E element)在index后插入对象
µ     boolean add(E o)   把对象o插入到链表的最后。
µ     E remove(int index)  删除链表里指定索引号的元素
µ     boolean remove(Object o)
删除在链表里的第一个指定内容的元素。
µ     E get(int index)  得到链表里指定索引号的元素。
µ     int size()  返回链表中的元素个数
µ     int indexOf(Object obj)
如果在链表里找到了obj元素,则返回这个元素的索引值,反之如果没有找到,返回–1。
µ     List<E> subList(intfromIndex, int toIndex)
得到链表里的从fromIndex开始,到toIndex结束的子链表。
µ     void clear()
把链表里存储的元素全部清除掉,该方法一般在链表使用完成后调用。
µ     先进后出的Stack类
Stack也是属于线性表类型的数据结构。
µ     特点: “后进先出”(Last In First Out)类型的容器,即最后一个被“压(push)”进堆栈中的对象,会被第一个“弹(pop)”出来。
µ     构造方法
µ     Stack() :用于创建支持“后进先出”访问方式的对象
例:Stack st=newStack();
       Stack <String> st = newStack();
µ     其他方法
µ     E peek() 返回栈顶元素,但没有弹出栈顶元素
µ     E pop() 弹出栈顶元素,并返回其中的对象。
µ     E push(E item) 向堆栈顶端压入item对象,同时将item对象返回。
µ     boolean empty() 判断堆栈是否为空,如果该堆栈为空,返回true,反之返回false。
注意:由于Stack继承了Vector类,所以以下语句从语法上来讲,不会有问题。但却破坏了堆栈“后进先出”的特性,所以,不推荐使用。
st.addElement("bad usage1");
st.addElement("bad usage2");
st.addElement("bad usage3");
for(int i=0;i<st.size();i++){
     System.out.println(st.elementAt(i));
}
10.3 不允许有重复元素的Set接口
     Set接口不仅封装了用线性表管理对象的方法,更封装了“不允许插入重复元素”的功能,所以用Set可以用较高的效率来避免出现重复元素的情况。
¯        Set接口中的主要方法
µ     boolean add(E o) 向Set对象中添加元素。如果待插入的元素不存在于Set对象里,add动作执行后会返回true;该元素不会被再次插入,并返回false 。
µ     boolean remove(Object o) 删除Set对象里指定的元素。如果这个方法成功地在Set对象里删除了指定元素,返回true;反之删除失败,则返回false。
µ     boolean isEmpty()  判断Set对象是否为空。如果Set对象里有元素,这个方法返回true;反之返回false。
µ     int size()  返回Set对象中元素的个数。
¯       实现了Set接口的类HashSet
“基于散列表”的检测重复元素的策略:HashSet里的元素值同这个元素在Set里所存放的索引位置有个对应关系(散列函数),在HashSet里插入元素前,可根据这个元素值和对应关系,计算出这个元素在HashSet里的插入位置,如果在这个位置里(或位置周围)已经存在了待插入元素的值,则不能插入。
µ     构造方法
ü      HashSet()
ü      HashSet(<E> c)
µ     其他方法
ü      boolean contains(Object o) 判断是否存在指定元素
例10.6 HashSet类的综合应用。
Set<String> set = newHashSet<String>();     
set.add("One");         set.add("One");
System.out.println(set.size());     //输出元素个数为:1    
set.add(“Two”);   System.out.println(set.size());   // 元素个数:2      
System.out.println(set.contains(“One”));     //true,包含元素“One”
总结
     第一类集合有着共同的特性:它们存储的对象都是一元的(线性的),只不过存储的方式和使用的数据结构不同,以Collection为基类--封装了线性表的插入、删除等基本操作。
List接口和Set接口都是Collection的子接口                         
     实现List接口:基于线性链表来存放数据的,例如Vector
                             
     实现Set接口:它们不允许有重复的元素,例如HashSet。
10.4 “键-值”对型的集合
     在Java中,专门建立以HashTable为代表的“键-值”对类型对象,“键”--索引信息,而“值” –同索引值相对应的信息。
     在Java中,专门建立以HashTable为代表的“键-值”对类型对象,“键”--索引信息,而“值” –同索引值相对应的信息。
如果要从其中查询指定数据的话,不得不依次遍历这个数组,这样效率会很低。
(2)换一种思路:将10存入数组不是插入在第一个空闲空间里!
µ     存在“索引冲突” 问题:对于散列函数,不同的“值”会得到相同的“键”,即不同的对象可能存放在同一个索引位置上。
µ     解决方法
ü      采用技术上的方法,例如设计出尽量降低冲突情况出现的散列函数,或者是指定冲突发生时的应对策略;
ü      根据待存储的数据量,适当提高Hash表的容量--用加大空间的代价,来取冲突发生的低概率
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,