面试必备:《Java 最常见 200+ 面试题全解析》(二)容器部分

目录

    • 一、Java 基础部分
        • Java 基础部分
    • 二、容器部分
        • 18.java 容器都有哪些?
        • 19.Collection 和 Collections 有什么区别?
        • 20.List、Set、Map 之间的区别是什么?
        • 21.HashMap 和 Hashtable 有什么区别?
        • 22.如何决定使用 HashMap 还是 TreeMap?
        • 23.说一下 HashMap 的实现原理?
        • 24.说一下 HashSet 的实现原理?
        • 25.ArrayList 和 LinkedList 的区别是什么?
        • 26.如何实现数组和 List 之间的转换?
        • 27.ArrayList 和 Vector 的区别是什么?
        • 28.Array 和 ArrayList 有何区别?
        • 29.在 Queue 中 poll()和 remove()有什么区别?
        • 30.哪些集合类是线程安全的?
        • 31.迭代器 Iterator 是什么?
        • 32.Iterator 怎么使用?有什么特点?
        • 33.Iterator 和 ListIterator 有什么区别?
        • 34.怎么确保一个集合不能被修改?
    • 三、多线程部分
    • 四、反射部分
    • 五、对象拷贝部分

一、Java 基础部分

Java 基础部分

链接地址

二、容器部分

18.java 容器都有哪些?

List、Map、Set
面试必备:《Java 最常见 200+ 面试题全解析》(二)容器部分_第1张图片

19.Collection 和 Collections 有什么区别?

Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

20.List、Set、Map 之间的区别是什么?

链接地址

21.HashMap 和 Hashtable 有什么区别?

链接地址

22.如何决定使用 HashMap 还是 TreeMap?

  • TreeMap的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排列的;TreeMap的实现也是基于红黑树结构。
  • 而HashMap的Key值实现散列hashCode(),分布是散列的均匀的,不支持排序,数据结构主要是桶(数组),链表或红黑树。

所以,查询的时候使用HashMap,增加、快速创建的时候使用TreeMap。

23.说一下 HashMap 的实现原理?

24.说一下 HashSet 的实现原理?

25.ArrayList 和 LinkedList 的区别是什么?

链接地址

26.如何实现数组和 List 之间的转换?

//List转数组:toArray(arraylist.size()方法

public static void testArray2List() {
     
	String[] strs = new String[] {
     "aaa", "bbb", "ccc"};
	List<String> list = Arrays.asList(strs);
	for (String s : list) {
     
		System.out.println(s);
	}
}
//数组转List:Arrays的asList(a)方法
public static void testList2Array() {
     
	List<String> list = Arrays.asList("aaa", "bbb", "ccc");
	String[] array = list.toArray(new String[list.size()]);
	for (String s : array) {
     
		System.out.println(s);
	}
}

27.ArrayList 和 Vector 的区别是什么?

链接地址

28.Array 和 ArrayList 有何区别?

Array 即数组,声明方式可以如下:

int[] array = new int[3];
int array [] = new int[3];
int[] array = {
     1, 2, 3};
int[] array = new int[]{
     1, 2, 3};

定义一个 Array 时,必须指定数组的数据类型及数组长度,即数组中存放的元素个数固定并且类型相同。

ArrayList 是动态数组,长度动态可变,会自动扩容。不使用泛型的时候,可以添加不同类型元素。

List list = new ArrayList(3);
list.add(1);
list.add("1");
list.add(new Double("1.1"));
list.add("第四个元素,已经超过初始长度");
for (Object o : list) {
     
    System.out.println(o);
}

29.在 Queue 中 poll()和 remove()有什么区别?

remove() ,如果队列为空的时候,则会抛出异常
而poll()只会返回null

30.哪些集合类是线程安全的?

早在jdk的1.1版本中,所有的集合都是线程安全的。
在1.2以及之后的版本中就出现了一些线程不安全的集合,为什么版本升级会出现一些线程不安全的集合呢?因为线程不安全的集合普遍比线程安全的集合效率高的多。随着业务的发展,特别是在web应用中,为了提高用户体验减少用户的等待时间,页面响应速度(也就是效率)是优先考虑的。而且对线程不安全的集合加锁以后也能达到安全的效果(但是效率会低,因为会有锁的获取以及等待)。其实在jdk源码中相同效果的集合线程安全的比线程不安全的就多了一个同步机制,但是效率上却低了不止一点点,因为效率低,所以已经不太建议使用了。下面举一些常用的功能相同却线程安全和不安全的集合。

Vector:就比Arraylist多了个同步化机制(线程安全)。

Hashtable:就比Hashmap多了个线程安全。

ConcurrentHashMap:是一种高效但是线程安全的集合。

Stack:栈,也是线程安全的,继承于Vector。

31.迭代器 Iterator 是什么?

首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。

Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

32.Iterator 怎么使用?有什么特点?

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

33.Iterator 和 ListIterator 有什么区别?

(1)所属关系,ListIterator是一个Iterator的子类型。
(2)局限:只能应用于各种List类的访问。
(3)优势:Iterator只能向前移动,而ListIterator可以双向移动。
还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引
nextIndex()、previousIndex()方法。
还可以通过set()方法替换它访问过的最后一个元素。
还可以通过调用listIterator()方法产生一个指向List开始处的ListIterator,当然也可以有参数,即指向索引为参数处的ListIterator。
(4)ListIterator 有 add() 方法,可以向 List 中添加对象,而 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面试题)