Java集合框架知识点

一、集合框架体系图

在这里插入图片描述

二、Java集合框架的基本接口

Collection

为集合层次的根节点。一个集合代表了一组对象,这些对象即为它的元素。Java提供这个接口的任何直接实现类。

  • List:是一个有序集合;它可以包含重复元素。你可以通过它的索引来访问它的任何元素。List更像一个长度可变的数组
  • Set:是一个无序集、不可以包含重复元素。

Map

是一个key映射到value的对象。一个Map不能包含重复的key,value可以重复;每一个key最多只能映射到一个value。

还有一些其他的接口:如Queue,Dequeque,SortedSet、SortedMap

三、集合框架基础底层数据结构总结

List

  • ArrayList :Object数组
  • LinkedList :双向链表(JDK6之前为循环列表,JDK7取消了循环)
  • Vector:Object数组,线程安全的

Set

  • HashSet:无序,唯一,hashCode,基于hashMap实现的,底层采用的是HashMap来保存元素。(基于HashMap的key)
    • LinkedHashSet:LinkedHashSet继承于HashSet,类似于 LinkedHashMap,其内部多了一条双向列表,使其插入的顺序保持一致

Map

  • HashMap

    Jdk8之前,HashMap是由数组和链表组成,数组是HashMap的主题,链表是 解决哈希冲突而存在的。
    Jdk8及以后,HashMap在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8时),将链表转化为红黑树,以减少搜索的时间

    • LinkedHashMap
      • 是继承于HashMap,再其基础上新增了一条双向链表,使得上面的结构可以保持绝对的插入顺序
  • HashTable:线程安全的,不允许key为null

  • ConcurrentHashMap:线程安全,效率更高好用,下面有更详细的介绍

  • TreeMap:红黑树

四、Connection与Connections的区别

  • Connection:是集合类的上级接口,继承他的接口为主要为Set、List
  • Connections:是正对集合类的一个工具类,它提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

五、List和Set的区别

  • List特点:元素有放入顺序,元素可以重复的
  • Set特点:元素无放入顺序(HashCode决定),元素不可以重复的。

六、ArrayList和LinkedList区别

ArrayList

优点:ArrayList是实现与基础动态数组的数据结构,因此地址连续,一旦数组存储起来可以通过偏移量记性快速查找
缺点:因为地址连续,ArrayList要移动数据,所以插入和删除操作效率会较低。

LinkedList

优点:LinkedList是基于链表的数组结构,地址的任意的,开闭内存空间是不需要一个连续的空间的。对于新增和删除操作会效率较高;
缺点:因为LinkedLIst没有偏移量,查询的效率会较低。

七、HashSet和HashMap的区别

  • Set:Set是线性结构的,值不能重复。Hashset是用HashMap的key来实现的;
  • Map:Map键值对的映射,可以空键空值。HashMap是Map的Hash实现,key的唯一性是通过key值的hashcode的唯一来确定的,value 的设置则是链表结构(解决相同的hashcode)

八、HashMap和ConcurrentHashMap的区别

ConcurrentHashMap是线程安全的map的一种实现
  • ConcurrentHashMap对整个桶数组进行了分割分段,然后在每一个分段上都要供lock锁进行保护,相对于HashTable的syn关键词的粒度更精细了一些,并发性能更好了。
  • 而HashMap是没有锁的,不是线程安全的。HashMap的键值对允许有null,但是ConcurrentMap都不允许

注意

  • List考虑安全并发的用 CopyOnWriteArrayList是List的实现类,查询高的用ArrayList,增删改用LinkedList;

  • Map考虑安全并发的用 ConcurrentHashMap ,其他用hashMap

九、队列和栈是什么

  • 队列:Queue 先进先出(FIFO);是一个接口,他的是实现类在java并发包中。
  • :Stack 先进后出(FILO),继承于Vector(List)

十、Euqal方法和==的区别

  • 相同:Object类的equal方法与==相同的含义;判断的是基本数据类型的值或者所指向对象的地址值
    test.getClass().getName()+"@"+Integer.toHexString(test.hashCode())
  • 不同:在String和包装类中,equal被重写了,判断了是其值(内容) toString是否相同

HashMap<Object,Object>原理

十一、HashMap的工作原理 (看源码)

  • Node<K,V>[ ] 数组链表
  • HashMap< key,Map.entry > entry
  • 我们知道在Java最常用的两种数据结构为数组和链表(模拟指针 Node)
  • HashMap的底层也是由数组和链表组成的。我理解为其Hashcode是数组索引,根据key的HashCode寻找到数组的对应位置;
  • 而存储的Node<K,V>[ ],可以表示为HashMap<key,Map.entry> entry 为一个键值对对象
HashMap怎么添加一个键值对(看源码)
  • 我们使用put(key,value)方法来存储到HashMap中,HashMap会先调用hashCode()的方法判断哈希值是否相同;
  • 如果哈希值不同,则判定该key是不同的;
  • 如果key(必须为Object对象)相同,则调用equal方法进行判断,
  • 如果equal返回false,那么会以hashcode为坐标,Node链表(Bucket)
  • 如果返回true,那么新值会覆盖旧值;
  • 判断如果当前bucket的位置链表长度大于8的话就将此链表变成红黑树。
HashMap怎么获得一个键值对

我们使用get(key)获得value,key会通过hashcode在Node<K,V>数值中快速的查询到对应的Node<K,V>,可以通过equal方法一个一个key的判断获得对应的value

HashMap默认容量是多少

默认容量是16,负载因子是0.75,就是当容量达到了12就会进行扩容,拓展为原容量的2倍。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gimtom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值