博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java集合框架总结
阅读量:2455 次
发布时间:2019-05-10

本文共 1698 字,大约阅读时间需要 5 分钟。

Java集合框架总结

Collection接口、Collections类、Map接口

Collections:集合操作工具类,包含各种操作集合的静态方法。

Collection:集合结构的父接口,关系图如下:

Collection 继承了 Iterable 迭代器接口,所有实现了 Collection 集合的实现类都可以使用迭代器进行遍历。
在这里插入图片描述
在这里插入图片描述
Map:key-value结构的父接口,关系图如下:
在这里插入图片描述

List、Set

Collection有两个子接口:List和Set,二者主要区别在于:list数据有序存放、可重复;set中数据无序存放,不可重复。

Vector、ArrayList、LinkedList

Vector:是ArrayList线程安全版本,所有方法都是用synchronized修饰的。

ArrayList:数组结构,线程不安全,可以用下标访问,访问快,由于ArrayList涉及到扩容,如果ArrayList触发扩容,代价较高,如果从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
LinkedList:链表结构,线程不安全,适合数据的动态插入和删除,随机访问和遍历速度比较慢。

HashTable、HashMap、LinkedHashMap、TreeMap

HashTable:是HashMap线程安全版本,所有方法都是用synchronized修饰的。

HashMap:数组加链表结构存储元素,数组用来存储key-value构成的Map.Entry<K,V>对象,无容量限制;链表用来解决hash冲突的情况; 基于key的hash值查找Entry对象存放到数组的位置,所以不保证数据的有序性,对于hash冲突采用链表的方式去解决。
LinkedHashMap:可以保证数据的插入序和访问序,使用双向链表来实现的。
TreeMap:存储的数据按照键值来升序排序,也可以指定比较器进行排序;使用二叉树数据结构实现的。

HashSet、LinkedHashSet

HashSet:内部使用的是HashMap,value是同一个值(new Object())。

LinkedHashSet:继承HashSet,唯一的区别是内部使用的是LinkedHashMap。

Vector、Collections.SynchronizedList、CopyOnWriteArrayList区别

1、Vector使用同步方法实现线程安全,SynchronizedList使用同步代码块实现线程安全。

2、SynchronizedList是在方法块中第一行就使用同步锁了,所以两则的性能几乎一样。
3、Collections.SynchronizedList专门用来将一个非线程安全的List转换成线程安全的List。
CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArrayList
前两者使用Java内置锁Synchronized实现线程安全,CopyOnWriteArrayList使用了可重入锁ReentrantLock 实现线程安全的;CopyOnWriteArrayList只有写操作才会被加锁,所以在保证线程安全的同时,又提高了并发性;在读线程大于写线程的时候,性能比Vector好。

ConcurrentHashMap

java.util.concurrent.ConcurrentHashMap

定义在Java并发包中的,支持并发操作,所以是线程安全的;
锁的粒度更细,使用了分段锁,所以比HashTable性能好。

参考blog:

java Collection接口和Collections类的层次关系图,类图 ,collection集合实例
常用集合类简介及线程安全和非线程安全的集合对象
SynchronizedList和Vector的区别
Java集合系列
Java并发编程:并发容器之CopyOnWriteArrayList

转载地址:http://vdchb.baihongyu.com/

你可能感兴趣的文章
将React Native升级到最新版本的最简单方法
查看>>
python 图像格式转换_如何用六行Python构建图像类型转换器
查看>>
url散列算法原理_如何列出与网站相关的所有URL
查看>>
如何在React Native中创建精美的动画加载器
查看>>
谷歌聊天机器人api_如何编写针对Google地图等网络应用量身定制的聊天机器人
查看>>
npm和angular_如何开发,使用和发布Angular库到NPM
查看>>
为什么要远离对日外包_远离魔法-或:为什么我不想再使用Laravel
查看>>
二进制数据结构:JavaScript中的树和堆简介
查看>>
如何开始使用centos_如何开始使用CentOS
查看>>
travis-ci自动部署_如何使用Travis CI设置高级自动部署
查看>>
机器学习与分布式机器学习_这就是为什么任何人都可以学习机器学习的原因
查看>>
django 部署_狂野的Django:部署生存的技巧
查看>>
面向前端开发人员的Visual Studio Code概述
查看>>
2017年最喜欢的Visual Studio代码扩展
查看>>
gvim文本编辑器帮助_如何帮助您的文本编辑器帮助您
查看>>
函数setState是React的未来
查看>>
山东大学有人陪!真的吗?_10,000小时! 您真的需要那么多吗?
查看>>
为什么要在JavaScript中使用静态类型? 我们是否应该使用它们?
查看>>
您可能在2017年期待JavaScript会议
查看>>
macos 安装scala_如何在MacOS上安装Scala和Apache Spark
查看>>