java核心学习笔记(三) java集合框架

参考博客:JAVA集合类汇总

 

一、图示理解

    把上面链接的图盗过来,这张图很清晰的展示了整个java集合框架的架构图。

    实线边框的是实现类,折线边框的是抽象类,点线边框的是接口。

    空心三角箭头实线段,代表继承;空心三角箭头虚线段,代表接口实现(不一定真的实现,可能只是一种抽象类声明),黑色尖头虚线代表依赖,就是将对方当做自己的方法形参,黑色尖头实线代表关联,就是引用对方作为自己的数据域。

    java集合框架是诠释java多态性的很好的实例,通过集合框架可以很好的理解多态。

    图中可以看出集合框架 的底层设计 为 两大接口:Collection 和 Map ,而Collection又依赖Lterator,这是什么意思呢?

    Collection接口的含义是“集合”,通过Collection接口提供的方法,我们可以对具体的集合进行操作,Map接口含义是“地图”,代表像地图一样的key-value对,但是这两种接口并没有提供他们的遍历方法,所以Iterator就是给Collection提供遍历方法的接口。由图可以看出,Map并没有直接依赖Iterator,所以遍历Map需要先将其实现类型转化为Collection的实现类型。

    Iterator包含三个主要方法;

1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素。

其中需要注意TreeSet 和 TreeMap是有序的,利用二叉树进行排序,而hash家族利用键或索引的hashcode来进行查找所以很快。

二、遍历

    iterator的形式:

Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}


Map集合:

HashMap,根据键的hashcode值存储数据,无序,便利时取得的KV对顺序是完全随机的,而且HashMap是非同步的,及没有synchronized关键字,所以是线程不安全的。

Hashtable,HashMap的线程安全版,不允许记录的键或值为null,由于synchronized,所以在同一时刻只允许一个线程对其进行读写,所以会牺牲部分速度

ConcurrentHashMap,线程安全且锁分离,锁分离是指,将内部代码分段,每一段有各自的锁,而不是整体加一个锁,所以当操作发生在不同的段上,就可以并发执行

LinkedHashMap,保存了插入顺序的HashMap,遍历时按插入顺序取得

Treemap,实现的是SortMap接口,可对map按照键进行排序,默认是按照键值得升序进行排序(自然顺序),也可以指定排序器。

Map的遍历:需要将Map转化为set,再利用遍历器遍历,具体如下:

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

或者

erator it = map.keySet().iterator();
 //获取迭代器
while(it.hasNext()){
Object key = it.next();
System.out.println(map.get(key));
}

 

第一种方式是将Map转化为 entry set,这样只需遍历一次,第二种试讲map转化为keyset,这样再转化的时候需要遍历一次,在取值时还需要遍历一次,所以使用entryset比较好。

 

posted @ 2017-08-16 14:41  The_shy  阅读(246)  评论(0编辑  收藏  举报