最近面试经常遇到java集合类的问题,上网搜了一下,做个笔记

百度的图

集合类型主要有3种:set(集)、list(列表)和map(映射)。

集合接口分为:Collection和Map,list、set实现了Collection接口

List总结:

可以重复,通过索引取出加入数据,顺序与插入顺序一致,可以含有null元素

ArrayList:底层数据结构使数组结构array,查询速度快,增删改慢,因为是一种类似数组的形式进行存储,因此它的随机访问速度极快;

Vector:底层是数组结构array,与ArrayList相同,查询速度快,增删改慢;

LinkedList:底层使用链表结构,增删速度快,查询稍慢;

ArrayList与Vector的区别:

1.如果集合中的元素数量大于当前集合数组的长度时,Vector的增长率是目前数组长度的100%,而ArryaList增长率为目前数组长度的50%。所以,如果集合中使用数据量比较大的数据,用Vector有一定优势

2.线程同步ArrayList是线程不同步,所以Vector线程安全,但是因为每个方法都加上了synchronized,所以在效率上小于ArrayList

Set总结:

数据无序且唯一,实现类都不是线程安全的类,解决方案:Set set = Collections.sysnchronizedSet(Set对象);

HashSet:是Set接口(Set接口是继承了Collection接口的)最常用的实现类,顾名思义,底层是用了哈希表(散列/hash)算法。其底层其实也是一个数组,存在的意义是提供查询速度,插入的速度也是比较快,但是适用于少量数据的插入操作,判断两个对象是否相等的规则:1、equals比较为true;2、hashCode值相同。要求:要求存在在哈希表中的对象元素都得覆盖equals和hashCode方法。

LinkedHashSet:继承了HashSet类,所以它的底层用的也是哈希表的数据结构,但因为保持数据的先后添加顺序,所以又加了链表结构,但因为多加了一种数据结构,所以效率较低,不建议使用,如果要求一个集合急要保证元素不重复,也需要记录元素的先后添加顺序,才选择使用LinkedHashSet

TreeSet:Set接口的实现类,也拥有set接口的一般特性,但是不同的是他也实现了SortSet接口,它底层采用的是红黑树算法(红黑树就是满足一下红黑性质的二叉搜索树:①每个节点是黑色或者红色②根节点是黑色的③每个叶子结点是黑色的④如果一个节点是红色的,那么他的两个子节点是黑色的⑤对每个节点,从该节点到其所有的后代叶子结点的简单路径上,仅包含相同数目的黑色结点,红黑树是许多“平衡”搜索树的一种,可以保证在最坏情况下的基本操作集合的时间复杂度为O(lgn)。普及:二叉搜索树的性质:它或者是一棵空树;或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树。若子树为空,查找不成功。),要注意的是在TreeSet集合中只能存储相同类型对象的引用。

Tree最重要的就是它的两种排序方式:自然排序和客户端排序

自然排序;实现了Comparable接口,所以TreeSet可以调用对象的ComparableTo()方法来比较集合的大小,然后进行升序排序,这种排序方式叫做自然排序。其中实现了Comparable接口的还有BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short(按照数字大小排序)、Character(按照Unicode值的数字大小进行排序)String(按照字符串中字符的Unicode值进行排序)类等。
客户化排序:其实就是实现java.util.Comparator<Type>接口提供的具体的排序方式,<Type> 是具体要比较对象的类型,他有个compare的方法,如compare(x,y)返回值大于0表示x大于y,以此类推,当我们希望按照自己的想法排序的时候可以重写compare方法。

Map总结:

java的Map(映射)是一种把键对象和值对象进行映射的集合,其中每一个元素都包含了键对象和值对象,其中值对象也可以是Map类型的数据,因此,Map支持多级映射,Map中的键是唯一的,但值可以不唯一,Map集合有两种实现,一种是利用哈希表来完成的叫做HashMap,它和HashSet都是利用哈希表来完成的,区别其实就是在哈希表的每个桶中,HashSet只有key,而HashMap在每个key上挂了一个value;另一种就是TreeMap,它实现了SortMap接口,也就是使用了红黑树的数据结构,和TreeSet一样也能实现自然排序和客户化排序两种排序方式,而哈希表不提供排序。
HashMap:哈希表的实现原理中,先采用一个数组表示位桶,每个位桶的实现在1.8之前都是使用链表,但当每个位桶的数据较多的时候,链表查询的效率就会不高,因此在1.8之后,当位桶的数据超过阈值(8)的时候,就会采用红黑树来存储该位桶的数据(在阈值之前还是使用链表来进行存储),所以,哈希表的实现包括数组+链表+红黑树,在使用哈希表的集合中我们都认为他们的增删改查操作的时间复杂度都是O(1)的,不过常数项很大,因为哈希函数在进行计算的代价比较高,HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

TreeMap:TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。TreeMap 实现了Cloneable接口,意味着它能被克隆。TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。

TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。

HashTable:Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value,线程安全。

java各种集合类区别相关推荐

  1. Java小记-集合类(超级无敌认真好用,万字收藏篇!!!!)

    文章目录 集合类 1 为什么要使用集合类? 1.2数组的特点 1.3 集合类的特点 2 Java中集合类的类结构 3 基于List接口的ArrayList类的使用 3.1 ArrayList的特点 3 ...

  2. [Ljava.lang.String和java.lang.String区别

    [Ljava.lang.String和java.lang.String区别 注:[Ljava.lang.String@1b634e7  --     "[" 表示一维数组      ...

  3. Kotlin 与 Java有什么区别(最全最新的)

    目录 什么是Kotlin? 什么是Java? 主要区别: Kotlin 的特点 Java的特点 Kotlin 的历史 JAVA的历史 Kotlin 和 Java 的区别 Kotlin 的优势 Java ...

  4. 【视频】详解Scala中的类及与Java的详细区别

    详解Scala中的类及与Java的详细区别

  5. 深圳php和java,深圳java技术培训学习(Java和PHP区别)

    深圳java技术培训学习,深圳Java培训已经越来越普及了,通过Java和PHP区别,Java语言的分布性,Java语言的稳健性我们可以了解的更清楚些. Java和PHP区别 Java和PHP都是编程 ...

  6. 关于java的集合类,以及HashMap中Set的用法!

    來源:http://hi.baidu.com/fyears/blog/item/52329711622e007ccb80c465.html 关于java的集合类,以及HashMap中Set的用法! 2 ...

  7. 【转】C#命名空间与java包的区别分析

    本文实例分析了C#命名空间与java包的区别.分享给大家供大家参考.具体分析如下: 相同点: 1.都是为了重用性(reusebility)--软件工程中一个非常重要的目标. 2.C#里面的命名空间和j ...

  8. JS 数组和 Java 数组的区别

    JS 数组和 Java 数组的区别 前言 这里的区别呢主要是介绍在函数(方法)中传递一个数组参数时,在函数(方法)内部改变这个数组后,对外部数组有什么影响. 直接为数组重新赋值 TestIt.java ...

  9. 学java里面包括php_【学习java和PHP区别你知道多少】

    学习java和PHP区别你知道多少,今天就跟深圳牵引力教育小编以来来看看吧!IT行业程序人员使用哪种编程语言一直都是大家讨论的热点,尤其是程序员们在面试的过程中还会被面试官们问到Java和PHP语言的 ...

最新文章

  1. vue 固定名称 打包时_vuecli3 配置多环境打包
  2. 【开卷故意】记录一次高并发下的死锁解决思考过程
  3. 判断ipad还是安卓_?谷歌认输,iPad或成唯一赢家,安卓平板路在何方?
  4. ROS2学习(十二).ROS概念 - RQt工具的使用
  5. 五岁的时候,你在干什么?
  6. C++中时间相关函数的使用
  7. 机器学习实战(6):SVM-SMO-核函数 手写识别
  8. 【读书笔记】iOS-简单的数据驱动程序
  9. HDU 1394 Minimum Inversion Number 树状数组
  10. 拓端tecdat|r语言中使用Bioconductor 分析芯片数据
  11. 注册测绘师考试复习视频资料
  12. 何凯明团队又出新论文,北大、上交校友教你用ViT做迁移学习
  13. DES加密算法(框图流程详细分析)(C++实现)
  14. 人工智能学python还是c_考虑到未来人工智能的发展,应该学习C++/C语言还是Python语言?...
  15. Matlab与Access数据库编程指南
  16. 优秀好用的Mac平台上的DRM音频转换辅助工具
  17. 一图看懂鸿蒙股票,近五个交易日鸿蒙2.0概念股市复盘数据,一分钟教你看懂(5月1日)...
  18. 基于 next.js + mdx 搭建组件库文档项目(一) -- 开发环境搭建
  19. “双减”后的高途分析
  20. vue使用svg的问题

热门文章

  1. Jquery 15 天教程
  2. 打造先进的SOA应用
  3. 【Hive】删除表(drop、truncate)
  4. win10开机后桌面图标乱了?
  5. 单片机的三大秘境之揭秘 KEIL 调试那些不为人知的事
  6. 王者荣耀s15服务器维护,王者荣耀s15赛季王者峡谷调整 远程打野基本废了
  7. 民安智库开展景区游客满意度调查
  8. 白斩鸡大佬指点的一些关键信息点
  9. 理解ThreadLocal
  10. LC-799.香槟塔