根据牛客网的面试经验的题进行的汇总,里面的内容是看别人的博客或者其东西进行汇总的,将这些的知识总结一下,方便自己查看和复习用
牛客网
文章目录
集合(一)
List
请说明List、Map、Set三个接口存取元素时,各有什么特点?
-
List
-
public interface List<E> extends Collection<E>
-
是一个有序的容器
-
可以有重复的值,也可以存在null
-
添加的顺序就是输出的顺序
-
List<Integer> list = new ArrayList<Integer>(); list.add(3); list.add(1); list.add(8); list.add(0); Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); }
-
应用场景:当知道索引,且想要元素按(插入)序输出时,我们可以使用List,ArrayList可以快速实现查找,LinkedList对于删除和增加效果更好些
- ArrayList
- 实现了基于动态数组的数据结构,在内存里是连着放的
- 更有利于查找
- 线程不安全
- 扩容为原来1.5倍
- LinkedList
- 基于链表的数据结构
- 有利于删除和增加
- Vector
- Vector是多线程安全的
- 设置了增长因子,ArrayList没有设置
- 在集合中使用数据量比较大的数据
- 扩容为原来2倍
- ArrayList
-
-
Map
-
public interface Map<K, V>
-
k-v对,k值不能重复,v值可以重复
-
map的每个entry持有两个对象,一个是key,一个是value
-
应用场景:当使用到键值对时,可以使用map,TreeMap还可以实现排序,因为其实现了Comparable()和CompareTo()
- HashMap
- 实现hash算法
- LinkedHashMap
- TreeMap
- 线程不安全
- HashTable
- 线程安全,不允许有null值
- HashMap
-
-
Set
-
public interface Set<E> extends Collection<E>
-
无序且不重复
-
只允许有一个null值
-
应用场景:当你希望自己添加的元素不要出现重复时,可以使用set,并且TreeSet实现了SortedSet因此还可以实现排序,因为其实现了Comparable()和CompareTo(),LinkedHashSet也按照插入的顺序进行存储
- HashSet
- 是无序的,只允许一个null值
- LinkedHashSet
- TreeSet
- 二叉树(红黑树的树据结构)
- 实现了compare()和compraeto(),更适合实现排序
- 不允许有null值
- HashSet
-
ArrayList
阐述ArrayList、Vector、LinkedList的存储性能和特性
-
ArrayList
- 是基于线性存储的,其内存中是连续的
- 其查找效率高
- 线程不安全
-
Vector
- 线程安全,也因此效率不高
- 适合大量数据的存储
-
LinkedList
- 线性链表,更加适合插入和删除
请说明ArrayList和LinkedList的区别?
- ArrayList
- 其内存是连续的,所以更加适合通过索引来进行查找
- LinkedList
- 其内部是链式存储,内存利用率更高,适合删除和插入
- 更占内存,因为为每一个节点存储两个引用,一个指向前一个元素,一个指向后一个元素
collection接口
请判断List、Set、Map是否继承自Collection接口?
Map不是继承自Collection接口
集合
请讲讲你所知道的常用集合类以及主要方法?
-
List
- ArrayList
- add(),remove(),replace(),get(),indexOf(),size(),set(),clone(),toArray(),iterator(),sort()…
- LinkedList
- add(),remove(),replace(),get(),indexOf(),size(),set(),push(),pop(),clone(),toArray()…
- ArrayList
-
Set
-
HashSet
- clone(),remove(),add(),iterator(),clear()…
-
LinkedHashSet
-
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, Serializable
-
-
TreeSet
- clone(),iterator(),comparator(),size(),add()…
-
请说明Collection 和 Collections的区别。
- Collection是接口,List,Set实现其接口
- Collections是工具类,里面封装了许多方法
请你说明HashMap和Hashtable的区别?
- HashMap
- 线程不安全,效率高
- key,value可以为null
- HashTable
- 线程安全,效率不高
- 不能有null
请说说快速失败(fail-fast)和安全失败(fail-safe)的区别?
安全失败和快速失败都是对于迭代器而言的,在每次调用hasNext()/next()的时候即变遍历集合中的元素,会进行对modCount的判断,如果在迭代的过程中集合中的元素发生了修改(add(),delete()…),会导致modCount的值发生变化,即导致modCount!=expectedmodCount此时就会抛出ConcurrentModificationException异常;但是对modCount的判断是基于 modCount!=expectedmodCount,但如果此时expectedmodCount也发生变化,导致modCount==expectedmodCount,那么此时就不会抛出异常,所以不能依赖于异常来看是否执行了并非操作
- 快速失败
- java.util都是快速失败
- 原理:是对原集合进行遍历,当有线程对数据进行操作时,会使集合中的数据改变,就会抛出异常
- 安全失败
- java.util.concurrent都是安全失败
- 原理:是先将原数据进行拷贝,对拷贝的数据进行遍历,当有线程对数据进行操作时,即是集合中的原数据发送了改变,但不会影响迭代器的遍历,所以不会有异常
- 适合于在多线程并非使用,并非修改
请你说说Iterator和ListIterator的区别?
-
ListIterator
-
public interface ListIterator<E> extends Iterator<E>
-
ListIterator是对List进行操作的
-
是双向遍历,并且可以对元素进行修改
-
public class Ite2 { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(90); list.add(23); list.add(65); list.add(12); System.out.println(list); ListIterator<Integer> iterator = list.listIterator(); while (iterator.hasNext()){//向后判断 if (iterator.next().equals(23)){ System.out.println("nextIndex->" + iterator.nextIndex());//下一个索引 iterator.add(100);//添加 } } System.out.println("next->" + list); while (iterator.hasPrevious()) {//向前判断 if (iterator.previous().equals(100)){ System.out.println("previousIndex->" + iterator.previousIndex());//前一个索引 iterator.set(1);//赋值 } } System.out.println("previous->" + list); } }
-
-
Iterator
-
如果想对集合的元素安全的进行修改只能调用remove(),如果调用集合中的修改方法则会抛出异常
-
Iterator可以对List和Set都操作
-
只能单向遍历
-
public class Ite1 { public static void main(String[] args) { Set<Integer> sets = new HashSet<>(); sets.add(34); sets.add(16); sets.add(90); sets.add(54); Iterator<Integer> iterator = sets.iterator(); System.out.println(sets); while (iterator.hasNext()){ if (iterator.next().equals(16)) { iterator.remove();//删除 // sets.remove(16);//删除 java.util.ConcurrentModificationException } } System.out.println(sets); } }
-
请简单说明一下什么是迭代器?
Iterator就是用来遍历集合(Collection)中元素的方法,你不需要直到元素是什么类型,只需要调用iterator(),即可完成对元素的遍历