java对于Collection一些见识

1、List Set Map三者的区别
List:有序的,多个元素引用相同对象。
Map:使用键值对存储
Set:无序,不可以有多个元素引用相同的对象。

2、Arraylist 与 LinkedList 区别?
(1)线程安全
两者都是不同步的,不能保证线程安全。
(2)底层数据结构:
ArrayList底层使用 object 数组;
LinkedList底层使用的双向链表
(3)插入和删除是否受元素的位置影响:
ArrayList采用数组存储,插入和删除元素的时间复杂度受位置影响。比如:执行add(E e),默认在尾部添加。时间负责度为O(1).在制定位置删除或者插入元素(add(int index,E element))时间复杂度就为O(n-i);删除或者插入一位,存在n-i个元素向前或者向后移动。LinkedList采用链表存储,插入和删除不收元素位置影响。
(4)是否支持快速随机访问
LinkedList不支持高效的随机访问,ArrayList支持。快速随机访问就是通过元素的序号快速获取元素对象(get(index))
(5)内存空间占用
ArrayList的空间浪费主要体现在list列表结汇预留一定的容量空间,LinkedList的空间发给在每个元素消耗比ArrayList更多。
碰到这里:
查到了RandomAccess接口
public static
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}

ArrayList 实现了 RandomAccess 接口, 而 LinkedList 没有实现。为什么呢?我觉得还是和底层数据结构有关!ArrayList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所以称为快速随机访问。链表需要遍历到特定位置才能访问特定位置的元素,时间复杂度为 O(n),所以不支持快速随机访问。,ArrayList 实现了 RandomAccess 接口,就表明了他具有快速随机访问功能。 RandomAccess 接口只是标识,并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机访问功能的!

下面再总结一下 list 的遍历方式选择:
实现了 RandomAccess 接口的list,优先选择普通 for 循环 ,其次 foreach,
未实现 RandomAccess接口的list,优先选择iterator遍历(foreach遍历底层也是通过iterator实现的,),大size的数据,千万不要使用普通for循环

3、ArrayList 与 Vector 区别呢?为什么要用Arraylist取代Vector呢?
Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。

Arraylist不是同步的,所以在不需要保证线程安全时建议使用Arraylist。
4、HashMap 和 Hashtable 的区别(一个朋友描述)
线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;
对Null key 和Null value的支持: HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
初始容量大小和每次扩充容量大小的不同 : ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的tableSizeFor()方法保证,下面给出了源代码)。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。
底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。

5、HashMap 和 HashSet区别

6、如何选用集合?

主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用Map接口下的集合,需要排序时选择TreeMap,不需要排序时就选择HashMap,需要保证线程安全就选用ConcurrentHashMap.当我们只需要存放元素值时,就选择实现Collection接口的集合,需要保证元素唯一时选择实现Set接口的集合比如TreeSet或HashSet,不需要就选择实现List接口的比如ArrayList或LinkedList,然后再根据实现这些接口的集合的特点来选用。

7、Collection

List:
ArrayList:Object 数组
Vector:Object 数组
LinkedList:双向链表

Set:
HashSet:无序,唯一 基于hashMap,底层采用HashMap数组保存
LinkedHashSet: 继承HashSet,内部通过LinkedHashMap实现。
TreeSet:有序,唯一,红黑树(自平衡的排序二叉树)

Map:
HashMap:无序 又数组+链表。当链表的长度超过8时,将变成数组+红黑树
LinkedHashMap:继承hashMap,所以底层是数组和链表或红黑树组成
HashTable:数组+链表组成。
TreeMap:红黑树(自平衡的排序二叉树)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值