Java Collcetion容器

容器持有对象

1、Java容器类库的用途是“保存对象”,并将其划分为两个不同的概念:
(1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则;
     Collection是描述所有有序容器的共性的根接口,java.util.AbstractCollection类提供了Collection的默认实现;
(2)Map:一组成对的“键值对”对象,允许使用键来查找值;
     映射表允许使用另一个对象来查找某个对象,因此也被成为“关联数组”或“字典”;

2、添加一组元素
(1)Collection.addAll( )成员方法,使用Arrays.asList( )初始化序列
(2)Collections.add(new Collection(),...)静态方法;
※Collection的构造器可以接受另一个Collection,用它来将自身初始化,可以使用Arrays.asList()来为这个构造器产生输入;
    但是Collection.addAll()方法运行的速度更快

Collection<Integer> collection = new ArrayList<Integer>(Arrays.asList(1,2,3,4));
Integer[] moreInts = {5,6,7,8};
①collection.addAll(Arrays.asList(5,6,7,8));
 collection.addAll(moreInts);
②Collections.addAll(collection,Arrays.asList(5,6,7,8));
 Collections.addAll(collection,moreInts);

3、容器的打印
Java的容器类都实现了toString()方法,可以直接打印容器对象;
System.out.println(new ArrayList(Arrays.asList(1,2,3,4)));

4、迭代器
(1)迭代器(一种设计模式):是一个对象,其工作时遍历并选择序列中的对象,而客户端程序员不必知道该序列的底层结构;
(2)迭代器通常是轻量级对象,创建它的代价小;
(3)Java的迭代器基类为 Iterator,只能单向移动;
     ①使用 Collection.iterator()成员方法获取该Collection的Iterator对象;
     ② Iterator.next()成员方法 获取序列的下一个元素;
     ③ Iteraor.hasNext()成员方法 检查序列中是否还有元素;
     ④ Iterator.remove()成员方法 将迭代器新近返回的元素删除;

5、Foreach和迭代器
(1)Foreach也可以用于任何Collection对象,在Java SE5引入了Iterator接口,该接口包含一个能够产生Iterator的iterator()方法,Collection都实现了Iterable接口, Iterable接口被Foreach用来在序列中移动
Colleaction<String> cs = new LinkedList<String>();
Collection.addAll(cs,"Take the long way home".split(" "));
for(String element : cs ){
     System.out.println(element);
}
(2)任何实现iterable接口的类,都可以使用Foreach语句;

6、Collection

(1)List:线性表
①ArrayList:顺序表类
②LinkedList:链表类
(2)Set:规则集
Set具有和Collaction完全一样的接口,因此没有其他额外的功能;
①HashSet:使用散列;
②TreeSet:使用红黑树;
③LinkedHashSet:使用散列,使用链表维护元素的插入顺序;
(3)Stack:栈
LinkedList能够实现栈的所有功能;
(4)Queue:队列
      PriorityQueue:优先队列
LinkedList提供方法一支持队列的行为,实现类Queue接口,可以用作Queue的一种实现;
thinking in java


Collection的接口实现
1、在java.Collection中只有4种类型的容器: List、Queue、Map、Set,但是每种接口都有不止一个版本的实现,每种不同的版本都有自己有优缺点;
2、可选操作:
(1) 执行各类不同的添加和移除方法在Collection接口中都是可选操作,这意味着实现类并不需要为这些方法都提供功能定义;
(2)将方法定义为可选的的原因为: 防止在设计中出现接口爆炸的情况;
(3)未获取支持的操作:可以实现Java容器类库的一个重要目标:容器易学易用,未支持的操作可以延迟到需要时再实现;
(4)可以未支持操作中的方法中抛出异常: UnsupportedOperationException(这会在实现不支持接口时引起);



Collection的功能方法



1、List的功能方法
List的基本行为:调用add()添加对象,调用get()一次取出一个元素,调用iterator()获取用于该序列的Iterator;

2、Set和储存顺序

(1)在没有其他的限制下,应该默认选择HashSet,因为它对速度进行优化;
(2)当将对象放入散列储存和树型储存的Set时,该对象都应该实现 equals方法;
(3)当将对象储存在散列储存HashSet、LinkedHashSet中时,该对象还要实现 hashCode方法;
(4)SortedSet
     ①可以使其中的元素保证处于排序状态,元素要实现Comparable接口,TreeSet是它的一种实现;
     ②常用额外功能:
     Comparator comparator():返回比较器
      Object first():
      Object last():
      SortedSet headSet(E toElement):返回Set < toElement 的元素;
     SortedSet subSet(E fromElement,E toElement):返回 formElement<= Set <toElement;
     SortedSet tailSet(E formElement):返回 formElement<= Set;

3、Queue队列
(1)除了并发应用,Java SE5中仅有的2个实现为: LinkedList 和 PriorityQueue;
     PriorityQueue的元素要实现 Comparable接口;
(2)Queue的基本行为:offer(T)入列,peek()出列(不删除元素),poll()出列(删除元素);

4、Map映射表(关联数组)
(1)标准Java类库中包括Map的几种基本实现

(2)在没有其他限制的情况下,应该默认选择HashMap,因为它对速度进行了优化,使用散列储存key;
(3)Map中的键的实现要求和相应的Set一样;
     任何键都要实现equals方法;
     键被用于散列Map,要实现 hashCode方法;
     键被用于TreeMap,要实现 Comparable接口;
(4)SortedMap:
     ①TreeMap目前是SortedMap的唯一实现,可以确保键处于排序状态;
     ②常用方法:
     K firstKey()
     K lastKey()
     SortedMap subMap(K formKey,K toKey):return formKey<= key < toKey;
     SortedMap headMap(K toKey):return key<toKey;
     SortedMap tailMap(L formKey):return key>=formKey;





17.3 Collections中的实用方法

1、在 java.util.Collections中含有大量实用性极强的静态方法:



2、设定Collection为不可修改
Collection<T> unmodifiableCollection(Collection<T> c):返回Collection的只读版本;
Linked<T> unmodifiableLinkedList(LinkedList<T> list) :返回LinkedList的只读版本;

3、对Collection进行线程同步控制
Collection<T> sychronizedCollection(Collection<T> c):返回Collorction的线程同步版本;
HashMap<T> sychronizedHahsMap(HashMap<T> map):返回HashMap的线程同步版本;




17.5 持有引用

1、对象为 可获得(reachable),是指对象可以在程序中的某处找到;
     如果一个对象是可获得的,那么垃圾回收器就不可以释放它;
2、 java.lang.ref包中的 Reference对象允许既持有对它的引用,同时在内存消耗殆尽的时候又允许释放该对象;
3、Reference对象作为使用者和普通对象之间的代理, 一定不能允许有普通引用指向该对象

4、Reference抽象类有3个具体实现:(按可获得性从更高到低)
(1)SoftReference:实现内存敏感的告诉缓存;
(2)WeakReference:实现“映射规范”;
(3)PhantomReference:用于调度回收前的清理工作,它比Java终止机制更加灵活;
※SoftReference、WeakReference可以考虑放入 ReferenceQueue(用作回收前清理的工具);
    PhantomReference必须依赖 ReferenceQueue;
(4)示例代码:
static ReferenceQueue<T> rqueue = new ReferenceQueue<T>();
SoftReference<T> s = new SoftReference<T>(new T(), rqueue);
WeakReference<T> w = new WeakReference<T>(new T(), rqueue);
//Reference:引用队列,当检测到可达性发生变化时,垃圾回收器会将已注册的对象添加到此队列中;

5、WeakHashMap
(1)WeakHashMap用来保存WeakReference键,它使规范映射更加易用;
(2)在这种映射里,每个值只保存一份实例以节省储存空间,当程序需要改值时,便在映射中查询现有对象,然后使用它(而不是重新创建);
(3)这是一种节约内存的技术, WeakHashMap允许垃圾回收器自动清理键和值,允许清理元素的触发条件是:不在需要次键了;
(4)构建方式,用法同一般的Map类
WeakHashMap<K,V> map = new WeakHashMap<K,V>();
map.put(K key,V value);
※WeakHashMap中从保存的键会自动包装为WeakReference对象;







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值