Java的集合

Arraylist数组

Arraylist是最常用的list实现类,内部是通过数组实现的,他容许对元素快速随机访问。数组的缺点每一个元素之间不能有间隔,当数组大小不能满足时需要增加存储能力,就要将已经有数据的数组复制到新的存储空间中。当Arraylist的中间位置插入或者删除元素的时候,需要对数据进行复制、移动,代价比较高。因此,它适合随机查询和遍历,不适合插入和删除。

 

LinkList链表

LinkList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当做堆、栈、列表和双向列表使用。

 

HashMap数组+链表+红黑树

HashMap根据键的hashcode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,的呐遍历顺序却是不确定的。HashMap最多只容许一条记录的键为null,容许多条记录的值为null。HashMap非线程安全,即任意一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以使用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

 

什么时候是HahMap,什么时候选择HashMap?

说道容器,你肯定会想到Java中对象存储容器还有ArrayList,LinkList,HashSet等HashMap相对于这些容器来说,可以理解为多了一层指向关系,可以用指定Value。

 

工作原理

首先,初始化HashMap,提供了有参构造和无参构造,无参构造中,容器默认的数组大小initialCapacity为16,加载因子loadFactor为0.75。

第一步:通过 HashMap 自己提供的hash 算法算出当前 key 的hash 值

第二步:通过计算出的hash 值去调用 indexFor 方法计算当前对象应该存储在数组的几号位置

第三步:判断size 是否已经达到了当前阈值,如果没有,继续;如果已经达到阈值,则先进行数组扩容,将数组长度扩容为原来的2倍。
 

第四步:将当前对应的 hash,key,value封装成一个 Entry,去数组中查找当前位置有没有元素,如果没有,放在这个位置上;如果此位置上已经存在链表,那么遍历链表,如果链表上某个节点的 key 与当前key 进行 equals 比较后结果为 true,则把原来节点上的value 返回,将当前新的 value替换掉原来的value,如果遍历完链表,没有找到key 与当前 key equals为 true的,就把刚才封装的新的 Entry中next 指向当前链表的始节点,也就是说当前节点现在在链表的第一个位置,简单来说即,先来的往后退。

HashMap和HashTable 的异同

  1. 二者的存储结构和解决冲突的方法都是相同的。
  2. HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
  3. HashTable 中 key和 value都不允许为 null,而HashMap中key和value都允许为 null(key只能有一个为null,而value则可以有多个为 null)。但是如果在 Hashtable中有类似 put( null, null)的操作,编译同样可以通过,因为 key和 value都是Object类型,但运行时会抛出 NullPointerException异常。
  4. Hashtable扩容时,将容量变为原来的2倍+1,而HashMap扩容时,将容量变为原来的2倍。
  5. Hashtable计算hash值,直接用key的hashCode(),而HashMap重新计算了key的hash值,Hashtable在计算hash值对应的位置索引时,用 %运算,而 HashMap在求位置索引时,则用 &运算











 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值