每周10道 Java 口试题由 ImportNew 整理编译自网络。
口试题谜底接头请移步:https://github.com/jobbole/java-interview/issues/1
Java口试题投递交换请移步:https://github.com/jobbole/java-interview/issues/2
1. 你相识哪些荟萃范例?
谜底:你应该知道以下几个最重要的范例:
ArrayList
LinkedList
HashMap
HashSet
之后,你大概会被问到这样一些问题,好比应该何时利用此种特定范例,它比其他的亏得那边,它是怎么存储数据的以及隐匿在背后的数据布局是什么。最好的要领是尽大概多地相识这些荟萃范例,因为这类问题险些是无穷尽的。
2. HashMap 有什么特点?
谜底:HashMap 基于Map接话柄现,存储键值对时,可以吸收 null 为键值。HashMap 长短同步的。
3. HashMap 的事情道理是奈何的?
谜底:HashMap 在 Map.Entry 静态内部类实现中存储键值对,利用哈希算法。在 put 和 get 要领中,利用 hashCode() 和 equals() 要领。
阐明:HashMap 中容量、负荷系数和阀值是重要的参数。HashMap 默认的初始容量是32,昆山软件开发,负荷系数是0.75。阀值 = 负荷系数 x 容量。添加 Entry时,假如 Map 的巨细 > 阀值,HashMap 会对 Map 的内容从头哈希,利用更大的容量(容量老是2的幂)。关于 JDK 中的 hash 算法实现以及由此激发的哈希碰撞现象(DDos进攻)都大概是口试的延伸问题。
4. 可否利用任何类作为 Map 的 key?
谜底:可以利用任何类作为 Map 的 key,然而在利用之前,需要思量以下几点:
阐明:假如有一个类 MyKey,在 HashMap 中利用它:
HashMap<MyKey, String> myHashMap = new HashMap<MyKey, String>(); //通报给 MyKey 的 name 参数被用于 equals() 和 hashCode() 中 MyKey key = new MyKey("Pankaj"); // 假设 hashCode=1234 myHashMap.put(key, "Value"); // 以下的代码会改变 key 的 hashCode() 和 equals() 值 key.setName("Amit"); // 假设新的 hashCode=7890 //下面会返回 null,因为 HashMap 会实验查找存储同样索引的 key,而 key 已被改变了,匹配失败,返回 null System.out.println(myHashMap.get(new MyKey("Pankaj")));
这就是为什么 String 凡是会用作 HashMap 的 Key,因为 String 的设计是不行变的(immutable)。
5. 插入数据时,ArrayList、LinkedList、Vector谁速度较快?
谜底:ArrayList、LinkedList、Vector 底层的实现都是利用数组方法存储数据。数组元素数大于实际存储的数据以便增加和插入元素,它们都答允直接按序号索引元素,可是插入元素要涉及数组元素移动等内存操纵,所以索引数据快而插入数据慢。
6. 多线程场景下如何利用 ArrayList?
谜底:ArrayList 不是线程安详的,假如碰着多线程场景,可以通过 Collections 的 synchronizedList 要领将其转换成线程安详的容器后再利用。譬喻像下面这样:
List<String> synchronizedList = Collections.synchronizedList(list); synchronizedList.add("aaa"); synchronizedList.add("bbb"); for (int i = 0; i < synchronizedList.size(); i++) { System.out.println(synchronizedList.get(i)); }
7. 说一下 ArrayList 的优缺点
谜底:ArrayList的利益如下: