集合面试题01

目录

java中有哪些集合容器?

 Java中的容器,线程安全与线程不安全的分别有哪些?

Map接口有哪些实现类?

描述一下Map put的过程。

ArrayList与LinkedList的区别

Collection和Collections有什么区别?

Iterator与ListIterator有什么区别?


java中有哪些集合容器?

java中的集合类主要由Collection和Map这两个接口派生而出。其中Collection接口又派生出三个子接口,分别是List、Set、Queue。所有的java集合类,都是Set、List、Queue、Map这四个接口的实现类,这四个接口将集合分成了四大类。

  • List :有序可重复的集合
  • Set:无序不可重复的集合
  • Queue:代表先进先出的队列
  • Map:代表有映射关系(key-value)的集合,key不可重复,value可重复

这些接口拥有众多的实现类,其中最常用的实现类有ArrayList、LinkedList、HashSet、TreeSet、ArrayDeque、HashMap

 

 Java中的容器,线程安全与线程不安全的分别有哪些?

  • java.util包下的集合类大多数都是线程不安全的,例如我们常用的ArrayList、LinkedList、HashSet、TreeSet、ArrayDeque、HashMap、TreeMap,这些都是线程不安全的集合类,但是他们的优点是性能好。如果需要使用线程安全的集合类,则可以使用Collections工具类提供的sychronizedXxx方法,将这些集合类包装成线程安全的集合类。
  • java.util包下也有线程安全的集合类,例如:Vector、Hashtable。这些集合类都是比较古老的API,虽然实现了线程安全,但是性能很差。所以即使是需要线程安全的集合类,也建议将线程不安全的集合类包装成线程安全的集合类的方式,而不是直接使用这些古老的API。

Map接口有哪些实现类?

Map接口有很多的实现类,其中比较常用的有HashMap、LinkedHashMap、TreeMap

  • 对于不需要排序的场景,优先考虑HashMap,因为它是性能最好的Map实现。它的性能好于HashTable,因为它在put时采用分段锁/CAS的加锁机制,而不是像HashTable那样,无论是put还是get都做同步处理。
  • 对于需要排序的场景,如果需要按照插入顺序排序则可以使用LinkedHashMap,如果需要按照自然顺序排列甚至是自定义顺序排列,可以选择TreeMap。如果需要线程安全,则可以使用Collections工具类将上述实现类包装成线程安全的Map。

描述一下Map put的过程。

HashMap是最经典的Map实现,下面以它的视角介绍put的过程:

首先介绍一下HashMap:

  • 创建对象是将加载因子初始化为0.75
  • 第一次添加,需要扩容table容量为16,临界值为12(容量*加载因子)

1、首次扩容

        先判断数组是否为空,若数组为空则进行第一次扩容。

2、计算索引

        通过hash算法,计算键值对在数组中的索引

3、插入数据

  •  如果当前位置元素为空,则直接插入数据;
  • 如果当前位置元素非空,且key已经存在,则直接覆盖其Value;
  • 如果当前位置元素非空,且key不存在,则将数据链到链表末尾;
  • 如果添加时发现容量不够,则需要扩容。
  • 若一条链表的长度达到8,并且table数组的大小>=64才会进行树化。【两个条件缺一不可】

4、再次扩容

  如果数组中的元素个数超过临界值,则再次进行扩容操作。

ArrayList与LinkedList的区别

  • ArrayList基于动态数组,连续内存存储,适合下标访问。扩容机制:因为数组长度固定,超出数组长度存储数据时需要新建数组,然后将老数组拷贝到新数组中,如果不是尾插法还会涉及到元素的移动。使用尾插法并指定初始容量可以极大提升性能,甚至超过LinkedList。
  • LinkedList基于链表,可以存储在分散的内存中,适合做数据的插入以及删除操作,不适合查询。遍历LinkedList必须使用Iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时需要对list重新进行遍历,性能消耗极大。

Collection和Collections有什么区别?

  • java.util.Collection 是集合类的一个顶级接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在java类库中有很多具体的实现,Collection接口的意义是为各种具体的集合提供最大化的统一操作方式,其直接继承接口有List与Set。
  • Collections是集合类的一个工具类,其中提供了大量的静态方法,用于对集合中元素进行排序、搜索以及线程安全等操作。

Iterator与ListIterator有什么区别?

  • Iterator可以用来遍历List和Set集合,但是ListIterator只能用来遍历List集合
  • Iterator只能向前遍历,ListIterator既可以向前也可以向后遍历
  • ListIterator实现了Iterator接口,并包含其他功能,比如:增加元素,替换元素等待

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值