Collection

List : List中数据可重复
arrayList:底层为数组结构,默认初始化长度为10,扩容规则为1.5倍,第一次扩容为15
查询速度快,修改删除效率低。是线程不安全的。
linkList:底层为链表结构,添加删除速度快,查询速度慢。也是线程不安全的
vector(线程安全):底层为数组,扩容加载为1,第一次扩容长度为20,Vector线程安全,但是效率低,在方法上加了synchronize同步锁,保证了线程安全。

Set(接口) : 数据不能重复
实现类:
Hashset : 底层是hashmap,hashset中的值为key value默认为object对象,需要从写hashcode()和equals方法保证集合中元素不重复,相同的对象的hashCode值相等,hashCode相等但是可能不是同一对象,所以需要重写equals方法,如果是同一对象,则不添加,如果不是同一对象,发生哈希冲突,使用链地址法添加。
TreeSet:底层采用红黑树的形式实现,元素唯一且有序,内部实现了排序
LinkedHashSet:底层采用了链表和hashMap,线程不安全,效率高,链表保证了元素的有序性,hashMap保证了元素的唯一性

ArrayList与LinkedList的区别和适用场景
Arraylist:
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。

LinkedList:
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。

Map

Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。
HashMap : 线程不安全,效率比hashTable高,默认初始化容量为16,加载因子为0.75 ,以2倍进行扩容,JDK1.7的时候使用的是数组+ 单链表的数据结构。但是在JDK1.8及之后时,使用的是数组+链表+红黑树的数据结构(当链表的深度达到8的时候,也就是默认阈值,就会自动扩容把链表转成红黑树的数据结构来把时间复杂度从O(n)变成O(logN)提高了效率),扩容采用2倍扩容因为如果只有2的n次幂的情况时最后一位二进制数才一定是1,这样能最大程度减少hash碰撞(hash值 & length-1),
key-value中key可以为null,但是只能有一个为null,value也可以为null
HashTable:线程安全,效率低,key-value不允许为空

解决哈希冲突:
开放定址法 1、 线性探测法
2、二次探测法
3、再哈希法
链地址法

为什么在JDK1.7的时候是先进行扩容后进行插入,而在JDK1.8的时候则是先插入后进行扩容的呢?

在jdk1.8后该操作相当于对HashMap的优化,当插入后,发现发生hash冲突则扩容,没有发生hash冲突则不扩容,在1.8之前,扩容是先达到阈值时,当下一个数据需要插入,则直接扩容,但是当插入的数据没有发生hash冲突则也会进行扩容操作,会产生无效扩容,所有1.8之后使用先插入后扩容可以减少一次无用的扩容,减少内存的使用

为什么在JDK1.8中进行对HashMap优化的时候,把链表转化为红黑树的阈值是8,而不是7或者不是20呢(面试蘑菇街问过)?

如果选择6和8(如果链表小于等于6树还原转为链表,大于等于8转为树),中间有个差值7可以有效防止链表和树频繁转换。假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低。
还有一点重要的就是由于treenodes的大小大约是常规节点的两倍,因此我们仅在容器包含足够的节点以保证使用时才使用它们,当它们变得太小(由于移除或调整大小)时,它们会被转换回普通的node节点,容器中节点分布在hash桶中的频率遵循泊松分布,桶的长度超过8的概率非常非常小。所以作者应该是根据概率统计而选择了8作为阀值

集合的基本概念和区别相关推荐

  1. Python 3 集合基础和概念!

    Python 3 集合基础和概念! Python 3中,集合是无序的,所以不能进行切片和索引操作. 创建集合有两个方法:set()方法创建的集合是可变的,可被迭代的:frozenset()方法创建的集 ...

  2. 求两个集合是否有交集 c语言_高中数学:集合与函数概念知识点总结

    我们为你准备了以下12个优质公众号,让你在这里一网打尽高中高考.教育教学哪些事儿,敬请点对应名称关注. 高中生学习库 高中全球通 人教部编课本 高考志愿 高中文科 高中理科 高中语文 高中数学 高中英 ...

  3. r语言集合补集_【高中数学必修1研读】之一“第一章 集合与函数概念”

    第一章:集合与函数概念 [导入例子] "神舟"五号载人航天飞船离地面的距离随时间的变化而变化:上网费用随着上网时间的变化而变化:出国旅游人数日益增多:城市绿化面积不断扩大..... ...

  4. 领域驱动模型VO,BO,PO,DO,DTO概念及其区别

    本文来说下领域驱动模型VO,BO,PO,DO,DTO 概念及其区别 文章目录 概述 概念以及区别 本文小结 概述 随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等),伴随着这 ...

  5. 数据仓库DW、ODS、DM概念及其区别

    数据仓库DW.ODS.DM概念及其区别 一.整体结构 在具体分析数据仓库之前先看下一下数据中心的整体架构以及数据流向 数据中心整体架构 DB 是现有的数据来源(也称各个系统的元数据),可以为mysql ...

  6. Java集合深入解析(一)——集合的基本概念

    从本章开始,我们将深入学习Java中的集合内容.据统计,在实际业务开发中,Java集合的使用频率要远超其他类库中大部分类,可以说,集合类库是Java中最为重要的类库.本章将从集合的基础知识.集合的分类 ...

  7. linux内核区分cpu架构,一文读懂处理器,内核,芯片三个概念的区别

    一.处理器简介 处理器一般指中央处理器.中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control U ...

  8. 浅析 VO、DTO、DO、PO 的概念、区别和用处!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/qixuejia/p/4390086 ...

  9. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

最新文章

  1. 通过Http管理Solr Core,实现索引的分类
  2. vue--卡片层叠 组件 开发小记
  3. php list 转tree,PHP 数组转树形结构
  4. Java List 排序 :Lambda表达式sort排序
  5. win10诊断启动后联网_小技巧:win10网络共享文件夹出现错误无法访问如何解决?...
  6. ajax回复留言,Ajax 留言板模拟
  7. 【Python】数据转换利器
  8. Learning to rank 特征抽取
  9. JMeter功能不够用?看我的
  10. 完全小白级DataX安装配置过程详解
  11. Axure制作微信APP原型(二)登录注册模块
  12. 智能化系统之门禁系统
  13. Flutter Dart 数字转成中文金额大写
  14. 站内信 java_站内信的实现思路表的设计
  15. 数据结构(12)----图(遍历、最小生成树、easyX可视化)
  16. 电脑系统重装篇7:使用GHO镜像文件安装系统(OneKey)
  17. mysql 突然报错 1878 Temporary file write failure
  18. 可以减税 PCA 什么是PostgreSQL
  19. 建模小白适合从什么3D建模软件入手学习?
  20. 3月28日出生的赵姓女孩根据生辰八字取名字有内涵诗意的名字

热门文章

  1. 线性表(链式存储结构)C语言
  2. SQL server不能修改表结构的解决办法
  3. 解决“A problem occurred starting process 'command ''D:\AndroidSdk\..\mips64el-linux-android-strip''的问题
  4. 2018年SEO网络营销新技巧,如何让新网站快速收录与排名
  5. Win10占用电脑内存过高
  6. 【硬见小百科】一些硬件电路技术经验整理
  7. 【2019-CS224n】Assignment1
  8. 【socket】socket编程总目录
  9. java内存泄漏定位和解决,学习路线+知识点梳理
  10. 成都大数据语言培训:如何提高数据分析能力