集合list、set、map有哪些具体的实现类,区别是什么

Iterator是集合的总接口,其他的集合接口都继承于它,它定义了集合的遍历操作。collection继承了Iterator,是次接口,定义了集合的一些通用操作。(Map集合独立存在)。

集合:一个存放数据的容器,准确来说是存放对象引用的容器。

List:有序,可重复,查询快,插入,删除慢。

Set:无序,不可重复。

Map:键值对,键唯一,值多个。

1.List和Set是继承collection集合,Map不是。

2.Set不可重复,重复的会被覆盖掉,虽然元素放入Set是无序,但是其位置其实是固定的,是由HashCode决定的。加入Set的元素必须定义equals()方法。

3.List可以重复,可以用for根据下标循环遍历,也可以用迭代器,但是Set只能使用迭代器,因为他无法通过下标取得想要的元素。

4.Set和List对比:

Set:查询元素慢,插入、删除元素快,插入删除不会改变元素位置;

List:查询快,插入删除慢,因为插入删除会改变元素位置。类似数组,可以动态增长。

5.Map适合存储键值对数据。

6.线程安全和非线程安全集合:

LinkedList,ArrayList,HashSet是非线程安全集合,Vocter是线程安全的;

HashMap是非线程安全的,HashTable是线程安全的;

StringBuilder是非线程安全的,StringBuffer是线程安全的。

这些类的具体使用介绍:

1.ArrayList和LinkedList的区别;

ArrayList是基于动态数组实现的,因此地址是连续的,查询比较快,而插入删除需要移动数据,因此效率较慢。

LinkedList是基于链表结构实现的,地址是离散的,所以查询较慢,插入删除不会改变其他数据的位置,因此效率较快。

2.ArrayList和LinkedList的扩容机制:

ArrayList:

初始化大小是0,当add第一个元素的时候,大小才变成10。当新增时候发现容量不够用了,就会去动态扩容,扩容机制是:扩容后大小 = 原始大小 * 1.5。(例如:原始大小是10,那么扩容后大小就是15 = 10 * 1.5。)

LinkedList:

因为LinkedList是链表实现的,是双向链表,没有初始化大小,可以直接新增,不存在扩容机制。

3.ArrayList和Vocter的区别:

1.ArryList是线程不安全的,Vocter是多线程安全的。Vocter类的方法中很多都有同步锁,这也导致了它的效率不如ArryList。

2.两者都是线性连续空间储存元素,当空间充足时,两者添加方式是不一样的。

3.Vocter可以设置增长因子,ArrayList不可以;

4.Vocter是较老的动态数组,是线程同步的,效率很低,一般不建议使用。

使用场景:

1.不考虑线程安全,效率要高的时候选择ArryList,在乎线程安全的时候选择Vocter。

2.在数据量比较大,需要扩容的时候,Vocter有一定的优势,因为它扩容增加一倍。

4.HashSet和TreeSet的区别和使用场景:

1.TreeSet是二叉树(红黑树的数据结构)实现的,TreeSet中的数据是自动排好序的,不允许填入null。

2.HashSet是哈希表结构实现的,无序,且可以放入null,但是只能放一个。因为两者都是不允许重复的。

3.放入HashSet的对象,必须实现HashCode()方法,放入的对象是以hashcode码标识的。而且具有相同内容的String对象的标识码是一样的。所以放入的内容不能重复,但是同一个类的不同实例可以放入。

适用场景:

HashSet是为了快速查询设计的,比TreeSet效率高。一般建议使用HashSet,只有需要排序的时候,才会使用TreeSet。

5.HashMap和TreeMap、HashTable的区别和适用场景:

HashMap是线程不安全的,是基于哈希表(散列表)实现的。为了优化HashMap的空间使用,你可以调优初始容量和负载因子,

其中散列表的冲突处理主分两种,一种是开放定址法,一种是链表法。HashMap实现中使用的是链表法。

TreeMap是非线程安全的,基于红黑树实现的。不支持调优,因为该树总处于平衡状态。

适用场景:

HashMap相较于HashTable去掉了contain方法,但是新增了containsVaule()和containsKey()方法。HashTable是线程同步的,HashMap是线程异步的。HashMap的性能好于HashTable,HashMap的键和值可以为null,但是HashTable不允许为null。

此外两者都是无序的。

两者的底层数据结构:都是数组+链表结构实现的(jdk8之前)。

HashMap:适合删除,插入,定位元素。

TreeMap:适合按自然顺序或者自定义顺序遍历键(Key)。

 

详细请访问:https://juejin.im/post/5e5c5c52f265da575f4e7558#heading-23

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值