大家好,我是酱油君。这是互联网技术岗的分享专题,废话少说,进入正题:
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面试题的答案——容器