java 各类集合总结_结构图、null的取值、结构、线程安全、性能、简单比较

null的取值: 除了HashTable的K/V都不能null 其余可以存在null

但是在TreeMap、TreeSet两个类在加入第二个元素时,会调用Comparator比较器比较先后加入的元素是否重复(TreeMap比较的是Key值)。所以当加入第一个元素时,因为要创建根节点,即使第一个元素是null,也不会报错,因为此时不会调用比较器,再次加入元素则报错。

其他集合类HashSet(应该是同hashMap) / HashMap (加入第二个的话,会替换旧值)/ ArrayList / LinkedList均可接受null值。(set类最多只有一个null,

Collection 基本的接口-集合
├ List 子接口 按进入先后有序保存 可重复
│├ LinkedList 接口实现类 链表 插入删除更快
│├ ArrayList 接口实现类 数组 下标访问更快
│└ Vector 接口实现类 数组 同步 线程安全 性能相对其他慢一些
│   └ Stack
└ Set 子接口 仅接收一次,并做内部排序
├ HashSet (内嵌hashmap,原理类似,加入的时候判断是否返回旧val,是的话加入失败)
│   └ LinkedHashSet (具有 HashSet 的查询速度,且内部使用链表维护元素的顺序 ( 插入的次序 ) )。

└ TreeSet 使用红黑树算法维持结构,主要为了有顺序,但是性能不如hash

基本上set里面都包含了一个map,都是基于map实现的。
set的add方法根据map的add方法来判断能不能加入,如果key的hash和equals都一样,map的add调用之后返回旧的Value不返回null,所以添加失败,但是value还是更新了,但是保证了hashset的key的唯一(key还是不变的,就算value更新了)。

Map 基本的接口-键值对的集合
├ Hashtable 接口实现类 同步 线程安全 K/V都不能NULL
├ HashMap 接口实现类 没有同步 线程不安全 (加入的时候如果key重复,替换旧val并返回)
│├ LinkedHashMap 保持了顺序
│└ WeakHashMap
├ TreeMap 使用红黑树结构,主要为了有顺序,访问快,自动调整结构,性能不如hash
└ IdentifyHashMap

ArrayList、Vector和LinkedList的区别
都是可伸缩数组,动态改变长度。
前两个都是数组的方式存储,内存中开辟一块连续的空间存储数据。下标访问快,但是插入就慢。Vector是线程安全的,但是性能相对差一点。LinkedList因为是双向列表,所以顺序遍历快,但是通过下标随机访问就慢,插入删除数据快,不需要动其他数据。


ArrayList 经常操作的是末尾加入数据,随机访问
Vector 多线程下的安全读写
LinkedList 遍历操作,插入删除操作,少随机访问


HashMap、HashTable、TreeMap、WeakHashMap的区别
前三个是Map的实现类,存储键值对。
HashMap 根据key的HashCode存储,是数组+链表的结构存储数据,加入值的时候先通过key的hashCode计算hash,找到(bucket)数组下标然后循环遍历这个(entry)链表如果没有就加入头上,如果便利过程中发现key已经存在,那么替换value,并返回旧value。(自定义key,比如一个类,没有重写hashCode()方法和equals()默认是用Object的方法,如果引用对象相同则返回true,hashCode()返回对象地址最常用
HashTable是线程安全的,HashMap不支持线程的同步。
TreeMap 保证访问顺序 默认是自然key递增的顺序或者自己定义的顺序,实现了SortMap接口,通过红黑树算法保证顺序。
WeakHashMap的key 是弱引用,只要他的key不再被外部引用,就可以被垃圾回收器回收(HashMap的key被删了才会回收),其余类似HashMap

原本的结构图来自网上,自己修改了一部分-侵删

Collection是一个集合接口
Collections是针对集合类的一个包装类,提供一系列静态方法以实现对集合的搜索、排序、线程安全化等操作。
待续。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值