JAVA 集合类小结

一 集合和数组

因为本人也是个go的爱好者,所以对于集合类算是摸的比较透的。

说到集合,必须了解数组和集合。

 

Java的数组长度固定,集合长度不定。集合是特定的数据结构的集合。

而go里面并没有集合,而是叫数组,切片和键值对。数组同样长度固定,切片键值对长度不固定,键值对是k-v结构。

 

go和Java的不同就是,切片和键值对要自己写方法成为特定的数据结构,才能合Java的集合类差不多。

也就是说Java的集合其实是Java开发者为了开发方便,定义的一系列数据结构的。那么只要理解java几个数据结构的特性那么就很好理解了。

 

二 基本接口 map,Iterable,collection

最上层的接口

map和Iterable。

map是键值对,Iterable是集合的迭代子。迭代子理解起来,就是集合每个元素的一个包装

 

次顶层的接口

collection实现Iterable接口,提供了按索引取值的方法。

这里可以看出collection对应go的切片,map和map对应。

 

三 数据类型接口 map,list,set

list,set实现collection接口。

 

list是有序,可重复的数据。

set是无序、不能重复数据。

map是键值对、键不可重复、值可重复。

 

四 数据功能区分

在上面说的三大类型下,根据线程安全,查询速度快,插入速度快,排序又有四个功能分类。

 

红色为面试常问结构

排序           TreeSet,LinkedHashSet   TreeMap,LinkedHashMap

线程安全  vector     synchronizedSet       HashtableConcurrentHashMap

查询速度快   ArrayList    HashSet          HashMap

插入速度快   LinkedList  HashSet            HashMap  

 

list本来就是有序的,所以排序为空。

HashSet,HashMap为什么插入查询快的原因则是,因为用了hash算法。

LinkedHashSet和LinkedHashMap虽然本质上只是HashSet,HashMap实现了排序接口,但是插入的时候就排序,所以较慢。

TreeSet,TreeMap本身是按红黑树结构排序,但也能重写排序接口。

synchronizedSet是Colletions这个工具类里,算是冷门知识点。

 

五 数据结构的使用

第一,1.8引入了Stream之后,排序基本可以不用了,因为排序的使用次数低,我们不必保证数据插入或者查询一定有序。只需要我们取出来的时候有序即可,而Stream特性则大大的简化了我们自己写排序的代码量。

第二,分布式下考虑单机的线程安全,再用线程安全类简直杀鸡用牛刀。基本上synchronized,lock,原子类,Volidate之类的就能保证分布式下单机的线程安全就行了。

第三,插入速度的考量,降低io操作硬盘操作写操作,基本是每个系统到了后期性能提升一定要考虑的事情,而此时基本使用数组而非集合。

 

综上,我们基本使用查询快的类就好了。

 

六 遍历

1.遍历迭代子Iterator,而不直接遍历对象

2.for循环结束,立马回收Iterator

   for (Iterator it = map.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry e = (Map.Entry) it.next();
            System.out.println("键" + e.getKey() + "的值为" + e.getValue());
   }

3.对数据的删除修改操作,要用迭代子实现(否则可能出现线程安全问题

 for (Iterator<Entry<Long, String>> iterator = map.entrySet().iterator(); iterator.hasNext();) {
            Entry<Long, String> entry = iterator.next();
            long key = entry.getKey();
            if (key < 10) {
                iterator.remove();
            }
 }

 

posted @ 2018-12-04 14:23  lgp20151222  阅读(324)  评论(0编辑  收藏  举报