关于java集合存储结构的一些理解和知识点

一. Collection:单列集合父接口每次只能添加一个对象

(1)List:是Collection的子接口,用来存储有序的数据集合

①ArrayList:底层采用动态数组进行存储数据,默认是空数组,如果存值则扩容至10,扩容因子是1,如果不够则以1.5倍进行扩容。有下标查询快增删慢

②LinkedList:底层采用双向链表结构进行存储数据,增删数据比较方便,速度快。没有初始化大小和扩容机制,(比单向链表插入更快主要体现在前插与后插,单向链表指针不向前,前插不知道上一个数据是谁只能从头查找,双向链表避免了这个问题)

③Vector类:实现了可扩展的对象数组, 像数组一样,它包含可以使用整数索引访问元素。默认为空,初始容量10,扩容因子1,扩容以原来两倍进行扩容(Vector的大小可以根据需要增长或缩小,以适应在创建Vector之后添加和删除。)Vector是同步的(线程安全)。 如果不需要线程安全的实现,可以使用ArrayList代替Vector.

(2) Set: 是Collection的子接口,用来存储无序的数据集合

①HashSet:底层采用(HashMap)的方式存储数据,数据无序且不可重复,允许为null(与hashmap的key特性一致通过散列码hashcode与equals去重。

②TreeSet:底层是treemap,采用有序二叉树进行存储数据,不允许null值,,add方法调用的是TreeMap的put方法(会调用比较方法),为null会报空指针异常。遵循了自然排序。(实现了comparator默认自然顺序也就是字典顺序)

③LinkedHashSet:是HashSet的子类,底层是LinkedHashMap,数组+双向链表

hashcode决定了元素的位置,双向链表的结构保证了set可以按插入顺序顺序输出

二.Map:双列集合父接口,用来存储具有映射关系键值对数据

①HashMap:数组链表红黑树结构存储数据初始存值数组长度变为16,扩容因子0.75,两倍扩容,链表长度大于等于8时,并且数组长度大于等于64时,链表调整红黑树,红黑树的节点个数小于6时,调整为链表;key,value值可以为null

②TreeMap:红黑树算法的实现,key不允许为null,put方法调用内部Comparable接口比较值,会报空指针异常

③HashTable:哈希表实现(没有引进红黑树),线程安全。key,value值不可以为null(底层源码:hashmap的key为null三目运算返回0不掉用hashcode方法。hashtable的key为空则执行hashcode方法抛出异常,value为null源码设置直接抛出异常)

④Properties:HashTable的子类,键值对存储数据均为String类型,主要用来操作以.properties结尾的配置文件。    

总结了一下map数据结构存储null或不能存储null的解惑

HashMap 允许插入键为 null 的键值对,但是因为无法调用 null 的 hashCode() 方法,也就无法确定该键值对的桶下标,只能通过强制指定一个桶下标来存放。

也就是说,key为null时,HashMap 使用第 0 个桶存放键为 null 的键值对。这也解释了HashMap为什么只能存放一个key为null的节点。

HashSet底层是HashMap,add方法调用的是HashMap的put方法,也只能有一个null。HashSet底层是HashMap,add方法调用的是HashMap的put方法,也只能有一个null。

TreeSet底层是TreeMap,add方法调用的是TreeMap的put方法(会调用比较方法),会报空指针异常。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值