注:
Java集合框架的设计是使用接口,抽象类和具体类的一个很好的例子,用接口定义框架。
用抽象类提供这个接口的部分实现。
Java集合框架支持以下两种类型的容器:
一种是为了存储一个元素集合,简称为集合(Collection)。
一种是为了存储键/值对,称为图(map)。
Java集合框架支持三种主要类型的集合:规则集(Set),线性表(List),队列(Queue).
Set的实例用于存储一组不重复的元素;
List的实例用于存储一个由元素构成的有序集合;
Queue的实例用于存储先进先出方式处理的对象。
<---Collection接口和AbstractCollection类--->
Collection接口是处理对象集合的根接口。
AbstractCollection类是提供Collection接口部分实现的便利类,除了size和iterator方法。
<Set>----规则集
HashSet(散列集)
底层用HashMap来实现,用HashMap来保存元素。
HashSet对象要保证其唯一性,需重写equals()和hashCode()方法。
不保证元素顺序。
LinkedHashSet(链式散列集)
输入输出顺序保持一致。
不是线程安全的。
TreeSet(树形集)
内部为一个红黑树。
<List>----线性表
ArrayList(数组线性表)
是一个实现List接口的大小可变的“数组”,容量只能自动变大,不会自动变小。
用trimToSize()将数组容量减小到线性表的大小。
操作不是线程安全的。
LinkedList(链表类)
是实现List接口的一个“链表”,这个类除了实现List接口的方法外,还提供从线性表两端提取,
插入和删除元素的方法。
Vector(向量类)
继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。
通过数组保存数据。当Vector容量不足以容纳全部元素时,Vector的容量会增加。
遍历方式:迭代器,随机访问,for循环,Enumeration遍历.
操作是线程安全的。
Stack(栈类)
继承Vector类。
Stack 类表示后进先出(LIFO)的对象堆栈。
Queue(队列类)
队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列
(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)
的方式对元素进行排序。无论使用哪种排序方式,队列的头 都是调用 remove() 或 poll() 所移除的
元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。
<Map>----图
依照键值存储元素的容器。
不能有重复键值,每个键值对应一个值。(key->Value)
一个键值和它的对应值构成一个条目。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>转化成Set<?>
Map不能使用迭代,若非要用迭代进行输出,则必须用entrySet将其转化为Set,然后通过Set接口的Iterator
进行访问迭代输出。
(Set<Map.Entry<?,?>> s = map.entrySet();)
>>>>转化成List<?>
List keyList = new ArrayList(map.keySet());
List valueList = new Arraylist(map.valueSet());
List entryList = new ArrayList(map.entrySet());
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
初始化一个static常量Map
public class Test1{
private static final Map map;
static{
Map m = new HashMap();
m.put(1,"one");
m.put(2,"two");
map = Collection.unmodifiableMap(m);
}
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
使用自定义类作为Key时,需要实现Comparable接口。(equals和hasCode方法)
图的类型有三种:HashMap(散列图),LinkedHashMap(链式散列图),TreeMap(树形图)
Map接口提供了查询,更新和获取集合的值和集合的键值的方法。
更新方法:clear,put,putAll,remove.
查询方法:containKey,containsValue,isEmpty,size.
获取集合值:ketSet()获得一个包含图中键值的规则集,values()获得一个包含图中值的集合,
entrySet()返回一个实现Map.Entry<K,V>接口的对象集合。Entry是Map接口的一个内部接口。
HashMap(散列图)
是AbstractMap的子类。
定位一个值,插入一个映射以及删除一个映射而言,此类高效。(无序存放,key不允许重复,新)
非线程安全。
LinkedHashMap(链式散列图)
用来扩展HashMap,支持图中的条目排序。
TreeMap(树形图)
遍历排好顺序的键值时很高效。
可用Comparator或Comparable来排序。
实现了SortMap接口。属于排序子类。
(按照key排序,Key不允许重复)
HashTable(哈希表)
(无序存放,旧,Key不允许重复)
线程安全。
WeakHashMap(弱引用Map集合)
(使用gc回收集合中某些不再使用的内容)
之前都是强引用类,即里面的内容不管是否使用都在集合中保留。
弱引用,希望集合自动清理暂时不用的数据。
IdentifyHashMap
(key可以重复的Map集合)
<Enumeration和Iterator>
Iterator
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了
解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
java中的iterator只能单向移动。(next())
为List设计的listiterator可以双向移动。
Enumeration
是最早的迭代输出接口,最早使用Vector时,就是用Enumeration进行输出的。
与iterator类似,只是iterator中存在删除数据的方法,而Enumeration不存在。
<对象的引用>
java把对象的引用分为四个级别:
强引用,软引用,弱引用,虚引用
在java.lang.ref包中。
强引用:
当内存不足时,JVM宁可出现OutOfMemoryError错误而停止程序,也不会回收此对象。
例如:HashMap mapRef = new HashMap();
软引用:
当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存。
就是不是那种用强制的方式要求对象存在于内存的引用。
可以借助垃圾回收器来判断某个对象的可达性,并帮你回收弱引用所引用的对象。
例如: StringBuffer sbuff = new StringBuffer("What is a WeakReference?");
WeakReference<StringBuffer> wref = new WeakReference<StringBuffer>(sbuff);
sbuff = null;
弱引用:
无论内存是否紧张,被垃圾回收器发现立即回收。
虚引用:
和没有引用一样。
详细引用解释可参考:http://www.cnblogs.com/ericchen/archive/2011/05/27/2059060.html
以上只是为了更好的理解java框架结构,大脑有个清晰的思路,具体用时还得查文档。