Java常用集合分析

ArrayList与Vector

动态数组(速度较慢)
创建时可以使用initialCapacity指定初始化大小,如果不指定则数组大小默认为10.
ArrayList与Vector的区别:
ArrayList是线程不安全的,当多个线程访问同一个ArrayList集合时,如果有超过一个线程修改了ArrrayList集合,则程序必须手动保证该集合的同步性;
Vector集合时线程安全的,但性能比ArrayLIst的性能要低,(但是,不推荐使用Vector,这是一个很古老的集合,通常使用synchronizedList,将ArrayList变成线程安全的)

LinkedList

使用循环双向链表存储数据结果,与ArrayList截然不同,使用场景不同。

HashSet

其实就是基本的散列表,通过计算hashCode()来得出在数组中的存储位置。查找时间复杂度时O(1)。
HashSet不是同步的,如果多个线程同时访问一个HashSet,则必须通过代码来保证其同步。
集合元素值可以是null

LinkedHashSet

相比于HashSet,它同时使用链表维护元素的次序。

HashMap

具有如下特点:
HashMap使用的是散列表,默认大小为16,装载因子为0.75(即当散列表的大小达到16*0.75时,数组的大小会扩大为原来的两倍)
以下为他的散列函数:
int hash(Object key) {
int h = key.hashCode();
return (h ^ (h >>> 16)) & (capitity -1); //capicity 表示散列表的大小
}
散列冲突解决方法是链表法,当链表长度超过8时,会将链表改为红黑树,小于8时又改为单链表。

Hashtable

Hashtable与HashMap存在以下两点典型区别:
Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMa比Hashtable性能高一点;但如果有多个线程访问同一个Map对象,则使用Hashtable会更好一点(但不推荐,可以使用Collection的一个工具类synchronizedMap,将HashMap变成线程安全的)。
Hashtable不允许使用null作为key和value,否则会出现NullPotointerException异常;但HashMap可以使用null作为key或Value;
两者均不能保证元素的顺序。

LinkedHashMap

使用双向链表维护key-value对的次序。
迭代顺序与key-value对的插入顺序保持一致。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值