今天我看了李兴华老师对Java类集的讲解,感觉获益颇多,终于对类集有了一点认识和了解了。
呵呵……
1.设立类集的目的
a.高性能(动态数组、链表)
b.允许不同类型的类集以相同的方式和高度互操作方式工作
c.容易扩展和修改
d.Java实现类集的包:java.util
2.Java类集接口框架
Collection 元素的类集
List 元素的序列
Set 没有重复元素的类集
SortedSet 没有重复元素且排序的类集
Map 元素为二元偶对的汇集,不能重复
SortedMap 在Map的基础上加上排序的要求
ListIterator 可遍历一个序列List的对象 (允许双向遍历列表,并可修改单元,但使用较少。)
Iterator 一个可遍历总个类集的对象
最核心的接口:
Collection Collection下存放的就是一个个对象,每次存放单个对象。
Map 每次存放一对值:key→value
Iterator 输出接口,只要是集合都要去用Iterator输出
3.Collection接口:在一般开发中为了清楚的表现处理数据的存放往往不直接使用Collection 接口
子接口:List
子接口:Set
List既然是一个接口,则要使用必须依靠子类→ArrayList 异步
如果要使用list,则格式为:List list=new ArrayList(); 子类对象为父接口实例化
向对象数组中加入数据:
boolean add(Object obj)
加入数据后,加入数据的顺序就是输出的顺序,按顺序操作的。
还可以数据加入到指定位置:void add(int index,Object obj); index是从零开始的。
但是加入时最好只加入一种对象。
向对象数组中删除数据:
obj remove(int index);移除列表中指定位置的元素。
现在如果希望可以一个一个元素打印出来,那该如何呢?
1.使用for循环
size();返回列表中的元素数,可以得到数组的长度。
get(int intde);返回列表中指定位置的元素。
在开发中基本上不使用以上做法,原则:只要是集合就使用Iterator输出。
2.使用Iterator输出
因为集合的长度不固定,所以Iterator采用的方法是一个一个判断输出。
如果有下一个元素,则执行;如果没有下一个元素就不执行。
list.iterator();返回以正确顺序在列表的元素上进行迭代的迭代器。
iterator.hasNext();如果仍有元素迭代,则返回ture。
obj next();返回迭代的下一个元素。
如何只能让一个集合中只加入一种对象呢?
我们可以在实例化的时候这样写:例如只能加String类型的对象。
List<java.lang.String> list=new ArrayList<java.lang.String>();
(Collection)集合操作的主要方法:
向集合中加入数据:public boolean add(Object obj)
从集合中删除数据:public boolean remove(Object obj)、public boolean remove(int intdex) 为Iterator实例化:public Iterator iterator()
取出元素的个数: public int size()
4.Set
Set的基本使用与List一致,但是HashSet子类存放时是无序的(散列存放)
Set与List的第二个区别:
List中的数据允许有重复元素,重复元素保留下来
Set中的数据不允许有重复元素,重复元素被替换掉
既然HashSet子类存放时散列无序的,如果希望有序怎麽办呢?可以使用TreeSet子类,将内容排序,靠的是Comparable接口排序。
5.Map
生活中经常使用到以下一种范例:
电话本:
key→value
张三→127832
李四→789808
王五→899880
Map的主要功能是作为查找使用,而不是作为输出使用。
存数据的方法:
put(Object key,Object value);将指定的值与此映射中的指定键关联。
取内容,根据key取
Object get(Object key);返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
由于是两个对象参数,故实例化时指定同一种对象时应为:还是以String对象为例。
Map map<java.lang.String,java.lang.String>=new HashMap<java.lang.String,java.lang.String>();
而且因为这个原因,Map接口的对象不能直接使用Iterator输出,如果非要使用的话呢,就必须采用以下的步骤:
Map→Set→Iterator→Map.Entry→key、values 详细点就是:
map.entrySet()→Set set.iterator()→(Map.Entry) Iterator iterator.next()→Map.Entry me
再通过 me.getKey() me.getValue() 输出键和值
TreeMap类 可以对数据进行排序
可以快速检索
以上所介绍的全部为Java 2带来的新特性,即Java JDK1.2之后的,那么在JDK刚推出时也有一些类 似的功能:
枚举Enumeration 可以对一个对象的类集中的元素进行枚举。旧向量 Iterator
boolean hasMoreElements() 判断是否有下一内容 hasNext()
Object nextElements() 取值 next()
很少用,它与Iterator的功能一致,都是用于输出集合中的内容。
List和Set都不能使用Enumeration输出,而List的一个子类:Vector 可以使用Enumeration输出。
Vector a.实现动态数组
b.是同步的
Enumeration e=vector.elements();将Vector对象的值给e。
Vector当然也可以使用Iterator输出。
Vector有一个唯一的直接子类,就是Stack类,它实现了标准的后进先出堆栈。
栈是一个先进后出的操作,Stack类主要方法有:
Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
boolean empty(); 测试堆栈是否为空。
peek(); 查看堆栈顶部的对象,但不从堆栈中移除它。
pop(); 移除堆栈顶部的对象,并作为此函数的值返回该对象。
push(E item); 把项压入堆栈顶部。
search(Object obj); 返回对象在堆栈中的位置,以 1 为基数。
Hashtable类与HashMap相似,但HashMap是异步的,Hashtable是同步的;采用映射的方式,不支持迭代函数。
Properties类是Hashtable的子类,用来保持值的列表。
属性类
与Hashtable不同的是,Properties类主要是保存字符串的,而Hashtable是保存对象的。
setProperties(Sting key,String value)
getProperties(String key)
本章重点:
HashMap与Hashtable
ArrayList与Vector
Iterator与Enumeration
分清楚以下几点:
a.保存单个值的集合:Collection
List:允许有重复元素
ArrayList:异步处理,新的类,只能用Iterator输出
Vector: 同步处理,旧的类,能用Iterator和Enumeration输出
Set:不允许有重复元素
HashSet:散列,无序
TreeSet:有序,按Comparable排序
b.保存一对值(Map):
HashMap:异步处理,新的类
Hashtable:同步处理,旧的类
Treemap:按KRY进行排序的集合
c.输出
Iterator:新的输出类,方法名称较短
Enumeration:旧的输出类,方法名称较长