该JAVA面试题转自(https://blog.csdn.net/sufu1065/article/details/88051083),非常感谢博主提供。下面是自己对于面试题的理解与解答,可参考。
JAVA面试题(java基础)1~17题的解答可参考https://blog.csdn.net/yxb09501bin/article/details/94589098
也是自己对于面试题的理解与解答。
19.Collection 和 Collections 有什么区别?
从上图可以看到,Collection是接口,List和Set是其子接口。
而Collections是算法,提供了对集合进行排序、遍历等多种算法的实现,如
Collections.sort()---排序
Collecitons.reverse()---反转
Collections.shuffle()---混排。
20.List、Set、Map 之间的区别是什么?
采用线性列表的存储方式,存储的顺序与添加的顺序相同。
List的具体类有ArrayList、LinkedList、Vector
不保证元素的顺序,不允许出现重复的元素。
Set的具体类有HashSet、TreeSet
采用键-值对的存储方式,键值不允许重复。
Map的具体类有HashMap、TreeMap
21.HashMap 和 Hashtable 有什么区别?
首先说一下两者的相同之处:
HashMap和Hashtable都是散列表,都是用来存储键值对(key-value)的,且都是通过“拉链法”解决哈希冲突的。
区别:
22.如何决定使用 HashMap 还是 TreeMap?
HashMap和TreeMap都实现了Map类,两者都是用来存储键值对(key-value)的。
该映射根据其键的自然顺序进行排序
,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法。public static void main(String[] args) { // TODO Auto-generated method stub Map m1 = new HashMap(); m1.put("c", "1"); m1.put("b", "2"); m1.put("a", "3"); Map m2 = new TreeMap(); m2.put("c", "1"); m2.put("b", "2"); m2.put("a", "3"); Iterator m1Iter = m1.entrySet().iterator(); while(m1Iter.hasNext()){ Map.Entry entry = (Entry) m1Iter.next(); System.out.println(entry.getValue()); //输出2 1 3 } Collection c = m2.values(); Iterator m2Iter = c.iterator(); while(m2Iter.hasNext()){ System.out.println(m2Iter.next());//输出3 2 1 } }
两者虽然存入相同的数据,可是遍历出来出来的结果却完全不一样,注意到TreeMap的结果是按照字母表的顺序进行存储的
,HashMap则没有,故在实际开发中,如果数据需要按照一定的顺序进行存储,可以使用TreeMap。
TreeMap是SortedMap接口基于红黑树的实现,该类保证了映射按照升序排列关键字。HashMap是根据键的HashCode 值存储数据,取得数据的顺序是完全随机的,HashMap取值的速度更快
。
23.说一下 HashMap 的实现原理?
24.说一下 HashSet 的实现原理?
与HashMap类似
25.ArrayList 和 LinkedList 的区别是什么?
ArrayList和LinkedList都是实现List接口,对于两者,ArrayList适合快速访问随机访问元素,LinkedList适合快速插入、删除元素。
ArrayList
public static void main(String[] args) { // TODO Auto-generated method stub List arrList = new ArrayList(); for(int i=0; i<1000; i++){ arrList.add(i); } //通过Iterator遍历 long IterStartTime = System.currentTimeMillis(); Iterator listIter = arrList.iterator(); while(listIter.hasNext()){ System.out.println(listIter.next()); } long IterEndTime = System.currentTimeMillis();
//随机访问遍历
long getStartTime = System.currentTimeMillis();
for(int i=0; i
//for-each循环遍历 long foreachStartTime = System.currentTimeMillis(); for(Object it: arrList){ Integer iter = (Integer) it; System.out.println(iter); } long foreachEndTime = System.currentTimeMillis(); System.out.println("Iterator:" + (IterEndTime - IterStartTime)); System.out.println("get(i):" + (getEndTime - getStartTime)); System.out.println("foreach:" + (foreachEndTime - foreachStartTime));
LinkedList
LinkedList继承AbstractSequentialList,实现了get(int index) set(int index,
E element) add(int index, E element) remove(int
index)。这些接口都是随机访问List的
LinkedList 实际上是通过双向链表去实现的。
它包含一个非常重要的内部类:Entry。Entry是双向链表节点所对应的数据结构,它包括的属性有:当前节点所包含的值,上一个节点,下一个节点
从LinkedList的实现方式中可以发现,它不存在LinkedList容量不足的问题
LinkedList的克隆函数,即是将全部元素克隆到一个新的LinkedList对象中
:
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList linkedList = new LinkedList();
for(int i=0; i<1000; i++){
linkedList.add(i);
}
//通过Iterator遍历
Iterator listIter = linkedList.iterator();
while(listIter.hasNext()){
System.out.println(listIter.next());
}
//随机访问遍历
for(int i=0; i
26.如何实现数组和 List 之间的转换?
public static void main(String[] args) {
// TODO Auto-generated method stub
//List转数组
List list = new ArrayList();
for(int i=0; i<10; i++){
list.add(i);
}
//第一种方式,强转
Integer[] arr1 = (Integer[]) list.toArray();
//第二种方式
int listLen = list.size();
Integer[] arr2 = new Integer[listLen];
list.toArray(arr1);
//第三种方式
Integer[] arr3 = (Integer[])list.toArray(new Integer[0]);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//数组转List
Integer[] arr = new Integer[10];
//第一种方法,Arrays.asList()
List list1 = Arrays.asList(arr);
//第二种方法,Collections.addAll()
List list2 = new ArrayList();
Collections.addAll(list2, arr);
//第三种方法
List list3 = new ArrayList();
for(int i=0;i
27.ArrayList 和 Vector 的区别是什么?
两者都实现了List接口,最主要的区别在于Vector为线程安全,而ArrayList为非线程安全。
28.Array 和 ArrayList 有何区别?
Array是数组,而ArrayList是Array的增强版,下面将从以下几个方面谈一下两者的
区别:
(1)长度是否可变
Array的`长度不可变`
ArrayList`长度可变`,动态增长
(2)存储的数据类型
Array只能存储`相同数据类型`的数据
ArrayList可以存储`不同数据类型`的数据
(3)方法
ArrayList的方法比Array的方法多
(4)两者互相转换
参考问题26
29.在 Queue 中 poll()和 remove()有什么区别?
Queue 中 poll()和 remove()都是移除并返回队头元素。
两者的区别如下:
remove函数,当队列为空时,会抛出下面的异常。
而poll()函数在队列为空时,返回null
30.哪些集合类是线程安全的?
常用的集合(线程安全):
List中的Vector
Map中的Hashtable
常见的并发集合(线程安全):
ConcurrentHashMap:线程安全的HashMap的实现
CopyOnWriteArrayList:线程安全且在读操作时无锁的ArrayList
CopyOnWriteArraySet:基于CopyOnWriteArrayList,不添加重复元素
ArrayBlockingQueue:基于数组、先进先出、线程安全,可实现指定时间的阻塞读写,并且容量可以限制
LinkedBlockingQueue:基于链表实现,读写各用一把锁,在高并发读写操作都多的情况下,性能优于ArrayBlockingQueue
31.迭代器 Iterator 是什么?
Java采用了迭代器来为各种容器提供公共的操作接口,这样使得对容器的遍历操作与其具体的底层实现隔离,达到解耦的效果。
32.Iterator 怎么使用?有什么特点?
public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList();
for(int i=0; i<10; i++){
list.add(i + "-a");
}
Iterator listIter = list.iterator();
while(listIter.hasNext()){
String str = (String) listIter.next();
System.out.println(str);
}
}
33.Iterator 和 ListIterator 有什么区别?
从上面的题目中可以看到,Iterator只提供了删除元素的方法remove();
而ListIterator接口继承了Iterator,允许程序员按照任一方向遍历列表,迭代期间修改列表,并获得迭代器在列表中的当前位置。
34.怎么确保一个集合不能被修改?
利用Collections提供的方法
上面是自己对于这些面试题的理解,其中在查找资料的过程中,有参考以下博文:
1、https://www.cnblogs.com/liulin1187740947/p/9164870.htm
2、https://blog.csdn.net/qq_41097354/article/details/90403953
非常感谢!如博文中有错误的地方,还请大家不吝赐教。
l