Java 集合基础知识 List/Set/Map
一、List Set 区别
- List 有序,可重复;
- Set 无序,不重复;
二、List Set 实现类间区别及原理
- Arraylist 底层实现使用Object[],数组查询效率高(Vector,原理类似,元素操作方法上添加了synchronized修饰,保证线程安全,所以效率低)
扩容机制
- LinkedList底层采用双向链表,只记录 first 和 last(LinkedList.Node);
- Node记录 E item; Node<E> next; Node<E> prev;
- 写入速度快,但是读取速度相对较慢;
- HashSet 无序,不重复。
- 去重原理:所有值保存至HashMap的key中,利用HashMap的键不重复原理达到去重效果;
- ArrayList去重可采用:new ArrayList(new HastSet(list));
- TreeSet 有序,不重复。
- 底层采用TreeMap;
三、Map 实现原理及实现类对比

1. HashMap 线程不安全,无序
1) 内部保存以数组 HashMap.Entry<K, V>[] 形式
static class Entry<K, V> implements Map.entry<K, V> {
final K key;
V value;
Entry<K, V> next;
int hash;
Entry(int h, K k, V v, Entry<K, V> n) {
value = v;
next = n;
key = k;
hash = h;
}
}
2) 线程不安全原因:
a 在数据操作方法上未采用synchronized同步标识,当多线程发生hash碰撞时,针对hash相等的key只会有一个能成功;
b 如果上面情况涉及到resize扩容情况,每个线程内都会对内部数组进行重新创建,但只有一个会成功;
3) 扩容(默认大小为16,2的四次方):
capacity = (capacity * 2 * loadFactor)
loadFactor:系数因子,默认为0.75,时间与空间的权衡结果
容量达到0.75时提前扩容;
4) 可通过LinkedHashMap达到有序效果;
2. Hashtable 内部原理及使用几乎等于HashMap,不同的是 所有操作数据方法都进行了 synchronized 修饰,即同步处理,线程安全,但这导致单线程访问情况下效率要低于HashMap;
JDK4将Hashtable实现了Map接口,在JDK5中创建了替代类:ConcurrentHashMap(同步的HashMap)
HashMap想要同步可以采用 java.util.Collections.synchronizeMap(hashMap)(jdk2出现);
同理:
Collections.synchronizeCollection(Collection<T> c)
Collections.synchronizeList(List<T> list)
Collections.synchronizeSet(Set<T> s)
Collections.synchronizeSortedMap(SortedMap<K, V> m)
Collections.synchronizeSortedSet(SortedSet<T> s)
迭代HashMap采用快速失败机制,而hashTable不是;
注:快速失败模式指设计用来即时报告可能会导致失败的任何故障情况,通常会用来停止正常的操作而不是尝试继续做可能有缺陷的工作。与iterator有关,如一个iterator在集合对象上创建了,其他线程欲“结构化”的修改此集合对象,会抛出修改异常(ConcurrentModificationException)
3. 建议优先考虑使用HashMap
a. 单线程下效率高;
b. 想排序可转换LinkedHashMap使用;
c. 多线程下可采用 Collections.synchronizeMap(hashMap) 代替
待学习:
JDK8中的优化点
Java 集合基础知识 List/Set/Map的更多相关文章
- JAVA相关基础知识
JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...
- 什么才是java的基础知识?
近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...
- Java 多线程——基础知识
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- java必备基础知识(一)
学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...
- Java集合中List,Set以及Map等集合体系详解
转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...
- java部分基础知识整理----百度脑图版
近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...
- Java集合(十)实现Map接口的HashMap
Java集合(十)继承Map接口的HashMap 一.HashMap简介(基于JDK1.8) HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ...
- JAVA学习基础知识总结(原创)
(未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...
- Java的基础知识三
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
随机推荐
- 转载】JQuery中如何传递参数如click(),change()等具体实现
转载地址:http://www.jb51.net/article/36249.htm 有个需求让两个select中option相互转换,这个作业就是给几个按钮添加click()事件接下来为大家介绍下如 ...
- Golang context包解读
Context 通常被译作 上下文 ,一般理解为程序单元的一个运行状态.现场.快照,而翻译中 上下 又很好地诠释了其本质,上下上下则是存在上下层的传递, 上 会把内容传递给 下 . 在Go语言中,程序 ...
- 初识Qt文字绘制
1.新建一个Qt Gui应用,项目名称为myDraw,基类选择为QMainWindow,类名设置为MainWindow. 2.在mainwindow.h头文件中添加void paintEvent(QP ...
- NYOJ17 最长单调递增子序列 线性dp
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17 分析: i=1 dp[i]=1 i!=1 dp[i]=max(dp[j]+1) ...
- [转载]AVFormatContext结构体详细分析
AVFormatContext描述一个媒体文件或媒体流的构成和基本信息. 这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象.其中nb_streams和s ...
- [图解tensorflow源码] [转载] tensorflow设备内存分配算法解析 (BFC算法)
转载自 http://weibo.com/p/1001603980563068394770 @ICT_吴林阳 tensorflow设备内存管理模块实现了一个best-fit with coales ...
- C\C++ vector 构造函数 & 析构函数
#include <iostream> #include <vector> using namespace std; class Obj { public: Obj(void) ...
- Node学习笔记之模块实现
一.模块分类 由Node提供的模块,称为核心模块:部分核心模块在Node源代码的编译过程中,编译进了二进制执行文件.在node进程启动时,该部分就直接加载进内存,文件定位和编译执行的步骤可以省略掉,并 ...
- iOS 输入框限制输入字节数
iOS中限制输入框文字长度的方法有好多,百度一下,最常用的是这种: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersI ...
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 2030 Solved: 986[Submit][Status][ ...