大家好,我是酱油君。这是互联网技术岗的分享专题,废话少说,进入正题:
18.Java 容器都有哪些?
Java 次要包含两种类型的容器,一种是 Collection,存储一列元素,另一种是 Map,存储键 / 值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue。
19.Collection 和 Collections 有什么区别?
java.util.Collection 是一个汇合接口(汇合类的一个顶级接口)。它提供了对汇合对象进行基本操作的通用接口办法。Collection 接口在 Java 类库中有很多具体的实现。Collection 接口的意义是为各种具体的汇合提供了最大化的对立操作形式,其间接继承接口有 List 与 Set。
java.util.Collections 则是汇合类的一个工具类 / 帮忙类,其中提供了一系列静态方法,用于对汇合中元素进行排序、搜寻以及线程平安等各种操作。此类不能实例化。
20.List、Set、Map 之间的区别是什么?
21.HashMap 和 Hashtable 有什么区别?
hashMap 去掉了 HashTable 的 contains 办法,然而加上了 containsValue()和 containsKey()办法。
hashTable 同步的,而 HashMap 是非同步的,效率上逼 hashTable 要高。
hashMap 容许空键值,而 hashTable 不容许。
22. 如何决定应用 HashMap 还是 TreeMap?
如果你须要失去一个有序的后果时就应该应用 TreeMap(因为 HashMap 中元素的排列程序是不固定的)。除此之外,因为 HashMap 有更好的性能,所以大多不须要排序的时候咱们会应用 HashMap。
起因:
TreeMap<K,V>
的 Key 值是要求实现 java.lang.Comparable
,所以迭代的时候 TreeMap 默认是依照 Key 值升序排序的;TreeMap 的实现是基于红黑树结构。实用于按天然程序或自定义程序遍历键(key)。
HashMap<K,V>
的 Key 值实现散列 hashCode()
,散布是散列的、平均的,不反对排序;数据结构次要是桶 (数组),链表或红黑树。实用于在 Map 中插入、删除和定位元素。
23. 说一下 HashMap 的实现原理?
- HashMap 基于 Hash 算法实现,通过 put(key,value) 存储,get(key) 来获取 value
- 当传入 key 时,HashMap 会依据 key,调用 hash(Object key) 办法,计算出 hash 值,依据 hash 值将 value 保留在 Node 对象里,Node 对象保留在数组里
- 当计算出的 hash 值雷同时,称之为 hash 抵触,HashMap 的做法是用链表和红黑树存储雷同 hash 值的 value
- 当 hash 抵触的个数:小于等于 8 应用链表;大于 8 时,应用红黑树解决链表查问慢的问题
这个问题答到这里 OK 了,然而你须要了解:不是每个 java 版本里,hashMap 的实现原理都是不变的,酱油君通知你,java 不同的版本在这个如何获取 key 的 hash 值和缩小 hash 值抵触的问题上在一直的优化。
24. 说一下 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet 中的元素都寄存在 HashMap 的 key 下面,而 value 中的值都是对立的一个 private static final Object PRESENT = new Object()。
25.ArrayList 和 LinkedList 的区别是什么?
- ArrayList 是实现了基于动静数组的数据结构,LinkedList 是基于链表构造。
- 对于随机拜访的 get 和 set 办法,ArrayList 要优于 LinkedList,因为 LinkedList 要挪动指针。
- 对于新增和删除操作 add 和 remove,LinkedList 比拟占优势,因为 ArrayList 要挪动数据。
26. 如何实现数组和 List 之间的转换?
List 转换成为数组:调用 ArrayList 的 toArray 办法。
数组转换成为 List:调用 Arrays 的 asList 办法。
27.ArrayList 和 Vector 的区别是什么?
线程平安 :Vector 应用了 Synchronized 来实现线程同步,是线程平安的,而 ArrayList 是非线程平安的。
性能 :ArrayList 在性能方面要优于 Vector。起因就是 Vector 是线程平安的,即某一时刻只有一个线程可能写 Vector,防止多线程同时写而引起的不一致性,但实现同步须要很高的破费。
扩容 :ArrayList 和 Vector 都会依据理论的须要动静的调整容量,只不过在 Vector 扩容每次会减少 1 倍,而 ArrayList 只会减少 50%。
28.Array 和 ArrayList 有何区别?
- Array 能够包容根本类型和对象,而 ArrayList 只能包容对象。
- Array 是指定大小的,而 ArrayList 大小是固定的。
- Array 没有提供 ArrayList 那么多功能,比方 addAll、removeAll 和 iterator 等。
29. 在 Queue 中 poll() 和 remove() 有什么区别?
相同点:都是返回第一个元素,并在队列中删除返回的对象。
不同点:如果没有元素 poll() 会返回 null,而 remove() 会间接抛出 NoSuchElementException 异样。
30. 哪些汇合类是线程平安的?
- vector:就比 arraylist 多了个同步化机制(线程平安),因为效率较低,当初曾经不太倡议应用。在 web 利用中,特地是前台页面,往往效率(页面响应速度)是优先思考的。
- statck:堆栈类,先进后出。
- hashtable:就比 hashmap 多了个线程平安。
- enumeration:枚举,相当于迭代器。
31. 迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,它能够遍历并抉择序列中的对象,而开发人员不须要理解该序列的底层构造。迭代器通常被称为“轻量级”对象,因为创立它的代价小。
32.Iterator 怎么应用?有什么特点?
Iterator 怎么应用?
- Iterator() 要求容器返回一个 Iterator。Iterator 将筹备好返回序列的第一个元素。
- 应用 next() 取得序列中的下一个元素
- 应用 hasNext() 查看序列中是否还有元素。
- 应用 remove() 将迭代器早先返回的元素删除。
Iterator 的特点?
- Iterator 遍历汇合元素的过程中不容许线程对汇合元素进行批改,否则会抛出 ConcurrentModificationEception 的异样。
- Iterator 必须依附于一个汇合类对象而存在,Iterator 自身不具备装载数据对象的性能。
33.Iterator 和 ListIterator 有什么区别?
- Iterator 可用来遍历 Set 和 List 汇合,然而 ListIterator 只能用来遍历 List。
- Iterator 对汇合只能是前向遍历,ListIterator 既能够前向也能够后向。
- ListIterator 实现了 Iterator 接口,并蕴含其余的性能,比方:减少元素,替换元素,获取前一个和后一个元素的索引,等等。
34. 怎么确保一个汇合不能被批改?
能够应用 Collections. unmodifiableCollection(Collection c) 办法来创立一个只读汇合,这样扭转汇合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异样。
举例:
List<String> list = new ArrayList<>();
list.add("A");
Collection<String> unmlist = Collections. unmodifiableCollection(list);
unmlist.add("B"); // 运行时此行报错
System. out. println(list.size());
文章转载自:
经典 Java 面试题的答案——容器