一、List Set 区别

  • List 有序,可重复;
  • Set 无序,不重复;

二、List Set 实现类间区别及原理

  • Arraylist 底层实现使用Object[],数组查询效率高(Vector,原理类似,元素操作方法上添加了synchronized修饰,保证线程安全,所以效率低)

    扩容机制

       1.6采用(capacity * 3)/ 2 + 1,默认容量为10;
       1.7采用(capacity >> 2 + capacity)实现,位移动效率高于数学运算,右移一位等于乘以2倍;
       1.8采用((capacity >> 1) + capacity)实现。
    (Vector:capacity + ((capacityIncrement > 0)?  capacityIncrement : capacity))
      capacityIncrement:自定义扩容长度
    读取速度快,写入会涉及到扩容,所以相对较慢。
  • 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的更多相关文章

  1. JAVA相关基础知识

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...

  2. 什么才是java的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  3. Java 多线程——基础知识

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. java必备基础知识(一)

    学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...

  5. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

  6. java部分基础知识整理----百度脑图版

    近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...

  7. Java集合(十)实现Map接口的HashMap

    Java集合(十)继承Map接口的HashMap 一.HashMap简介(基于JDK1.8) HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ...

  8. JAVA学习基础知识总结(原创)

    (未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...

  9. Java的基础知识三

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

随机推荐

  1. SQLException: Io 异常: Connection refused ERR=12514 ERR=1153异常处理过程

    solr更新索引连接数据库地址时发生的错误,数据库拒绝连接,经过调查是因为solr的data-config.xml 文件中配置数据库连接的地方,不应该配置数据库实例名而应该是数据库server_nam ...

  2. Uva821 Page Hopping (Floyd)

    题目大意: 最近的研究表明,互联网上任何一个网页在平均情况下最多只需要单击19次就能到达任 意一个其他网页.如果把网页看成一个有向图中的结点,则该图中任意两点间最短距离的平 均值为19. 输入一个n( ...

  3. 【node.js】Stream(流)

    Stream 有四种流类型: Readable - 可读操作. Writable - 可写操作. Duplex - 可读可写操作. Transform - 操作被写入数据,然后读出结果. 所有的 St ...

  4. 8、Android---探究服务

    8.1.服务是什么 服务(Service)是Android中实现程序后台运行的解决方案 非常适合执行那些不需要和用户交互而且要求长期的任务 服务的运行不依赖于任何用户界面 即使程序被切换到后台 或者用 ...

  5. Python读文件报错:SyntaxError: Non-ASCII character in file

    打开city.py文件时报错 问题原因: 程序中的编码错误,python默认是acii模式,没有支持utf8.如果代码中有汉字 ,就会报错 解决方案: 源代码文件(city.py)第一行添加:#cod ...

  6. IE8 下处理select标签高度不居中

    IE8:          Chrome:   同样的代码可是在IE8下select的文字并不是垂直居中. 处理:给select的样式添加padding上下的内边距. 加line-height一点用都 ...

  7. #leetcode刷题之路46-全排列

    给定一个没有重复数字的序列,返回其所有可能的全排列.示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 两 ...

  8. MySQL学习【第二篇安装】

    一.Mysql安装方式 1.安装方式 1.rpm,yum安装 安装方便,安装速度快,但无法定制 2.二进制安装 不需要安装,解压即用,不能定制功能 3.编译安装 可定制,安装很慢,安装分为四个步骤 1 ...

  9. Linux服务-NFS

    目录 1. nfs简介 1.1 nfs特点 1.2 使用nfs的好处 1.3 nfs的体系组成 1.4 nfs的应用场景 2. nfs工作机制 2.1 RPC 2.2 NIS 2.3 nfs工作机制 ...

  10. 五、Delphi10.3通过REST单元使类和JSON数据互相转换

    一.我们定义一个简单的类 TPeople = class private FName: string; FScore: Integer; FAge: TDateTime; public propert ...