1.遍历集合两种方式
看了java集合概述,Collection和Iterator接口,并实践。
遍历集合两种方式一种通过获得Collection的Iterator进行遍历,一种通过java5提供的foreach遍历,遍历过程中都不能修改集合元素。
2.Set集合
看java技术到容器set集合部分,set集合特点是不允许有重复的元素存在。
hashset和treeset是set的两个典型实现,hashset性能比treeset好,因为treeset要维护集合元素的次序。
当需要用一个排序的set时考虑用treeset,否则都用hashset。
hashset还有一个子类linkedhashset,linkedhashset因为维护链表会造成额外的开销,但因为有了链表遍历会更快。
另外一个EnumSet性能最好,但只能保存同一个枚举类的枚举值作为集合元素。
3.List总结
将集合List部分看完。小总结一下:
a.关于List
List是元素有序的可以放重复元素的集合,默认按元素的添加顺序设置元素的索引。
与Set集合相比,List集合增加了根据索引来插入,替换和删除集合元素的方法。
List判断集合内两个元素是否相等,通过equals比较方法返回true即可。
与Set集合只提供iterator接口相比,List因为有序还额外提供ListIterator接口,ListIterator接口还可向前遍历,在指定位置插入元素。
b.List的子类
ArrayList和Vector都是基于数组实现的List类,长度都是动态可变。Vector较古老,对于应用动态数组的场景,应优先考虑ArrayList。
同理Vector的子类栈Stack类,考虑使用LinkedList。
将Collection集合下的Queue接口大概看了下,小总结一下。
Queue接口用于模拟队列先进先出这种数据结构
Queue接口有一个PriorityQueue实现类和Deque接口。
a.PriorityQueue实现类保存队列元素的顺序并不是按加入队列的顺序而是按照队列元素的大小进行排序。
b.Deque代表双端队列,双端队列可以同时从两端来添加和删除元素(这个概念我并不是很深入的理解).
此Deque的实现类既可当队列使用也可当成栈来使用。Deque有ArrayDeque和LinkedList两个实现类,
其中LinkedList还实现了List接口。
线性表性能总结
a.遍历的时候顺序表最好用get(i)方式随机访问法,链表用迭代器(Iterator)来遍历集合元素。
b.LinkedList是链表,插入删除多的时候可以考虑用,其余时候考虑用ArrayList/ArrayDeque之类的是顺序表(底层是数组实现)
4.Map接口和其部分子接口以及实现类
Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。Set和Map关系密切,从java源码看,java先实现了Map,然后通过包装一个所有value都为null的Map就实现了Set集合。如果把Map里的所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中的索引不再使用整数值,而是以另一个对象为索引。
Map的实现类:
HashMap和HashTable都是Map接口的典型实现类,它们间的关系类似于ArrayList和Vector,HashTable较古老。
HashMap和HashTable判断两个key相等的标准是两个key通过equals方法比较返回true,且两个key的hashcode值也相等。
HashMap和HashTable判断两个value相等的标准只要两个对象equals方法返回true即可。
LInkedHashMap使用双向链表维护元素的插入顺序,迭代输出时将会按照添加key-value对的顺序输出。
Properties是HashTable的子类,用于读写属性文件不错。
TreeMap实现类以红黑树结构存储key-value对,TreeMap判断两个key相等的标准为CompareTo方法返回0.
TreeMap根据key对节点排序,保证所有key-value对处于有序状态。
WeakHashMap与HashMap用法基本相似,区别在于HashMap的key保留了对实际对象的强引用,WeakHashMap的key保留的是对实际对象的
弱引用。
IdentityHashMap 的实现机制与HashMap相似,不同的是在比较两个key是否相等时,在IdentityHashMap中当且仅当两个key严格相等 (key1==key2)时,IdentityHashMap才认为两个key相等。对于普通的HashMap而言,判断两个key相等的标准是两个key通过equals方法比较返回true,且两个key的hashcode值也相等。
EnumMap是一个与枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。
Map的性能及应用场景:
对于一般的应用场景,程序应该多考虑使用HashMap(HashMap底层也是采用数组来存储key-value对)。但如果程序需要一个总是排好序的Map时,则可以考虑使用TreeMap。
5.接着看java集合部分,将操作集合的工具类Collections看完。
Collections提供了一系列静态方法用于操作set,list,map之类的集合。可以排序,查询,替换等等。
Collections还可以同步控制和设置不可变集合。