Java集合

Java集合

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:

  • Collection
    List
    ArrayList
    LinkedList
    Vector
    Stack
  • Set
    HashSet
    LinkedHashSet
    TreeSet
  • Map
    HashMap
    LindedHashMap
    TreeMap
    ConcurrentHashMap
    Hashtable

1. Collection 和 Collections 有什么区别?

  • Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。
  • Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections. sort(list)。

2. List 和 Set 区别

  • List,Set都是继承自Collection接口
  • List特点:元素有放入顺序,元素可重复
  • Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉
  • (注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)

3. Set和List对比:

  • Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
  • List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

4. List 和 Map 区别

  • List是对象集合,允许对象重复。
  • Map是键值对的集合,不允许key重复。

5. Arraylist 与 LinkedList 区别

  • Arraylist:
    优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
    缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
  • LinkedList:
    优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
    缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
    适用场景分析:
    当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。

6. ArrayList 与 Vector 区别

  • ArrayList和Vector都是用数组实现的,主要有这么三个区别:
    Vector是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果。而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
    两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同。
    Vector可以设置增长因子,而ArrayList不可以。
    Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
    适用场景分析:
    Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArrayList效率比较高。
    如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。

7. HashMap 和 Hashtable 的区别

  • 1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
  • 2.hashTable同步的,而HashMap是非同步的,效率上比hashTable要高。
  • 3.hashMap允许空键值,而hashTable不允许。
    注意:
    TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
    Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

8. HashSet 和 HashMap 区别

  • set是线性结构,set中的值不能重复,hashset是set的hash实现,hashset中值不能重复是用hashmap的key来实现的。
  • map是键值对映射,可以空键空值。HashMap是Map接口的hash实现,key的唯一性是通过key值hash值的唯一来确定,value值是则是链表结构。
  • 他们的共同点都是hash算法实现的唯一性,他们都不能持有基本类型,只能持有对象

9. HashMap 和 ConcurrentHashMap 的区别

  • ConcurrentHashMap是线程安全的HashMap的实现。
  • (1)ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的syn关键字锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。
  • (2)HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。

10. HashMap 的工作原理及代码实现

  • 参考:https://tracylihui.github.io/2015/07/01/Java集合学习1:HashMap的实现原理/
  • Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。
  • 当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。
  • 如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
  • HashMap是基于哈希表的Map接口的非同步实现,提供所有可选的映射操作,并允许使用null值和null键,不保证映射的顺序;HashMap是一个“链表散列”的数据结构,即数组和链表的结合体;它的底层就是一个数组结构,数组中的每一项又是一个链表,每当新建一个HashMap时,就会初始化一个数组;

11. ConcurrentHashMap 的工作原理及代码实现

  • HashTable里使用的是synchronized关键字,这其实是对对象加锁,锁住的都是对象整体,当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。
  • ConcurrentHashMap算是对上述问题的优化,其构造函数如下,默认传入的是16,0.75,16
  • ConcurrentHashMap引入了分割(Segment),上面代码中的最后一行其实就可以理解为把一个大的Map拆分成N个小的HashTable,在put方法中,会根据hash(paramK.hashCode())来决定具体存放进哪个Segment,如果查看Segment的put操作,我们会发现内部使用的同步机制是基于lock操作的,这样就可以对Map的一部分(Segment)进行上锁,这样影响的只是将要放入同一个Segment的元素的put操作,保证同步的时候,锁住的不是整个Map(HashTable就是这么做的),相对于HashTable提高了多线程环境下的性能,因此HashTable已经被淘汰了。

12如何决定使用 HashMap 还是 TreeMap?

  • 对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。

13. 线程安全(Thread-safe)的集合对象:

  • Vector 线程安全:
  • HashTable 线程安全:
  • ConcurrentHashMap 线程安全:
  • StringBuffer 线程安全:

14. 非线程安全的集合对象:

  • ArrayList :
  • LinkedList:
  • HashMap:
  • HashSet:
  • TreeMap:
  • TreeSet:
  • StringBulider:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值