【Java面试题】Java面试必读!—Java集合

2023-05-26 0 563

撷取呵呵Java(复试必不可少):30 个 Java 子集复试难题和标准答案,有明确提出异议热烈欢迎探讨!

Java子集架构为JavaC语言的此基础,也是Java复试中很关键的两个习题。这儿,我列举了许多有关Java子集的关键难题和标准答案。

话不多说,helped!

【Java面试题】Java面试必读!—Java集合

1.Java子集架构是甚么?讲出子集架构的缺点?

五种C语言中都有子集,起初的Java版包涵三种子集类:Vector、Stack、HashTable和Array。

Java1.2明确提出了涵盖大部份子集USB、同时实现和演算法的子集架构。在确保缓存安全可靠的情况下采用C#和mammalian子集类,Java早已历经了很久。它还包括在Java并承揽中,堵塞USB和它的同时实现。

子集架构的部份缺点如下表所示:

采用核心理念子集类减少投资生产成本,而非同时实现他们他们的子集类。

随著采用历经严苛试验的子集架构类,标识符产品质量会获得提升。

透过采用JDK内含的子集类,能减少标识符保护生产成本。

F83E43Se性和可操作性。

2.子集架构中的C#有甚么缺点?

Java1.5引入了C#,大部份的子集USB和同时实现都大量地采用它。

C#允许他们为子集提供两个能容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。

这避免了在运行时出现ClassCastException,因为你将会在编译时获得报错信息。

C#也使得标识符整洁,他们不需要采用显式转换和instanceOf操作符。

它也给运行时带来好处,因为不会产生类型检查的字节码指令。

3.Java子集架构的此基础USB有哪些?

Collection为子集层级的根USB。两个子集代表一组对象,这些对象即为它的元素。Java平台不提供这个USB任何直接的同时实现。

Set是两个不能包涵重复元素的子集。这个USB对数学子集抽象进行建模,被用来代表子集,就如一副牌。

List是两个有序子集,能包涵重复元素。你能透过它的索引来访问任何元素。

List更像长度动态变换的数组。

Map是两个将key映射到value的对象.两个Map不能包涵重复的key:每个key最多只能映射两个value。

许多其它的USB有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

4.为何Collection不从Cloneable和SerializableUSB继承?

CollectionUSB指定一组对象,对象即为它的元素。如何保护这些元素由Collection的具体实现决定。例如,许多如List的Collection同时实现允许重复的元素,而其它的如Set就不允许。

很多Collection同时实现有两个公有的clone方法。然而,把它放到子集的大部份同时实现中也是没有意义的。这是因为Collection是两个抽象表现。关键的是同时实现。

当与具体同时实现打交道的时候,克隆或序列化的语义和含义才发挥作用。所以,具体同时实现应该决定如何对它进行克隆或序列化,或它是否能被克隆或序列化。点击这里一文学会序列化。

在大部份的同时实现中授权克隆和序列化,最终导致更少的灵活性和更多的限制。特定的同时实现应该决定它是否能被克隆和序列化。点击这儿一文学会序列化。

5.为何MapUSB不继承CollectionUSB?

尽管MapUSB和它的同时实现也是子集架构的一部份,但Map不是子集,子集也不是Map。因此,Map继承Collection毫无意义,反之亦然。

如果Map继承CollectionUSB,那么元素去哪儿?Map包涵key-value对,它提供抽取key或value列表子集的方法,但是它不适合“一组对象”规范。

6.Iterator是甚么?

IteratorUSB提供遍历任何Collection的USB。他们能从

7.Enumeration和IteratorUSB的区别?

Enumeration的速度是Iterator的两倍,也采用更少的内存。Enumeration是非常此基础的,也满足了此基础的需要。但是,与Enumeration相比,Iterator更加安全可靠,因为当两个子集正在被遍历的时候,它会阻止其它缓存去修改子集。

迭代器取代了Java子集架构中的Enumeration。迭代器允许调用者从子集中移除元素,而Enumeration不能做到。为了使它的功能更加清晰,迭代器方法名早已历经改善。

8.为何没有像Iterator.add()这样的方法,向子集中添加元素?

语义不明,已知的是,Iterator的协议不能确保迭代的次序。然而要注意,ListIterator没有提供两个add操作,它要确保迭代的顺序。

它能在当前Iterator的顶层同时实现,但是它用得很少,如果将它加到USB中,每个继承都要去同时实现它,这没有意义。

10.Iterater和ListIterator之间有甚么区别?

(1)他们能采用Iterator来遍历Set和List子集,而ListIterator只能遍历List。

(2)Iterator只能向前遍历,而LIstIterator能双向遍历。

面元素的索引位置。

11.透过迭代器fail-fast属性,你明白了甚么?

ConcurrentModificationException。

Collection中大部份Iterator的同时实现都是按fail-fast来设计的(ConcurrentHashMap和CopyOnWriteArrayList这类mammalian子集类除外)。

12.fail-fast与fail-safe有甚么区别?

Iterator的fail-fast属性与当前的子集共同起作用,因此它不会受到子集中任何改动的影响。Java.util包中的大部份子集类都被设计为fail-fast的,

而java.util.concurrent中的子集类都为fail-safe的。

Fall—fast迭代器抛出ConcurrentModificationException,

fall—safe迭代器从不抛出ConcurrentModificationException。

13.在迭代两个子集的时候,如何避免?

ConcurrentModificationException?

在遍历两个子集的时候他们能采用mammalian子集类来避免ConcurrentModificationException,比如采用CopyOnWriteArrayList,而不是ArrayList。

14.为何IteratorUSB没有具体的同时实现?

IteratorUSB定义了遍历子集的方法,但它的同时实现则是子集同时实现类的责任。每个能够返回用于遍历的Iterator的子集类都有它他们的Iterator同时实现内部类。

这就允许子集类去选择迭代器是fail-fast还是fail-safe的。比如,ArrayList迭代器是fail-fast的,而CopyOnWriteArrayList迭代器是fail-safe的。

15.UnsupportedOperationException是甚么?

UnsupportedOperationException是用于表明操作不支持的异常。在JDK类中已被大量运用,在子集架构java.util.Collections.UnmodifiableCollection将会在大部份add和remove操作中抛出这个异常。

16.hashCode()和equals()方法有何关键性?

HashMap采用Key对象的hashCode()和equals()方法去决定key-value对的索引。点击这儿一文搞懂它之间的关系。

些方法也会被用到。如果这些方法没有被正确地同时实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它是相同的,然后覆盖它,而非把它存储到不同的地方。

同样的,大部份不允许存储重复数据的子集类都采用hashCode()和equals()去查找重复,所以正确同时实现它非常关键。equals()和hashCode()的同时实现应该遵循以下规则:

如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()总是为true的。

如果o1.hashCode() == o2.hashCode(),并不意味着o1.equals(o2)会为true。

17.MapUSB提供了哪些不同的子集视图?

MapUSB提供三个子集视图:

(1)Set keyset():返回map中包涵的大部份key的两个Set视图。子集是受map支持的,map的变化会在子集中反映出来,反之亦然。当两个迭代器正在遍历两个子集时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。子集支持透过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。

它不支持add和addAll操作。

2)Collection values():返回两个map中包含的大部份value的两个Collection视图。这个collection受map支持的,map的变化会在collection中反映出来,反之亦然。当两个迭代器正在遍历两个collection时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。子集支持透过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。

3)Set> entrySet():返回两个map钟包涵的大部份映射的两个子集视图。这个子集受map支持的,map的变化会在collection中反映出来,反之亦然。当两个迭代器正在遍历两个子集时,若map被修改了(除迭代器自身的移除操作,和对迭代器返回的entry进行setValue外),迭代器的结果会变为未定义。子集支持透过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。

18.HashMap和HashTable有何不同?

(1)HashMap允许key和value为null,而HashTable不允许。

(2)HashTable是同步的,而HashMap不是。所以HashMap适合单缓存环境,HashTable适合多缓存环境。

(3)在Java1.4中引入了LinkedHashMap,HashMap的两个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。

(4)HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。

(5)HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该采用CocurrentHashMap。

19.如何决定选用HashMap还是TreeMap?

对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对两个有序的key子集进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

20.ArrayList和Vector有何异同点?

ArrayList和Vector在很多时候都很类似。

(1)两者都是基于索引的,内部由两个数组支持。

(3)ArrayList和Vector的迭代器同时实现都是fail-fast的。

(4)ArrayList和Vector两者允许null值,也能采用索引值对元素进行随机访问。

以下是ArrayList和Vector的不同点。

(1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该采用CopyOnWriteArrayList。

(2)ArrayList比Vector快,它因为有同步,不会过载。

表和只读列表。

21.Array和ArrayList有何区别?甚么时候更适合用Array?

Array能容纳基本类型和对象,而ArrayList只能容纳对象。

Array是指定大小的,而ArrayList大小是固定的。

Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。

(1)如果列表的大小早已指定,大部份情况下是存储和遍历它。

(2)对于遍历基本数据类型,尽管Collections采用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。

(3)如果你要采用多维数组,采用[][]比List>更容易。

22.ArrayList和LinkedList有何区别?

ArrayList和LinkedList两者都同时实现了ListUSB,但是它之间有些不同。

(1)ArrayList是由Array所支持的基于两个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前两个和下两个节点相连接。所以,尽管有采用索

(2)与ArrayList相比,在LinkedList中插入、添加和删除两个元素会更快,因为在两个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引。

(3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。

23.哪些子集类提供对元素的随机访问?

ArrayList、HashMap、TreeMap和HashTable类提供对元素的随机访问。

24.哪些子集类是缓存安全可靠的?

Vector、HashTable、Properties和Stack是同步类,所以它是缓存安全可靠的,能在多缓存环境下采用。Java1.5mammalianAPI包括许多子集类,允许迭代时修改,因为它都工作在子集的克隆上,所以它在多缓存环境中是安全可靠的。

25.mammalian子集类是甚么?

Java1.5并承揽(java.util.concurrent)包涵缓存安全可靠子集类,允许在迭代时修改子集。迭代器被设计为fail-fast的,会抛出ConcurrentModificationException。一部份类为:CopyOnWriteArrayList、 ConcurrentHashMap、CopyOnWriteArraySet。

26.队列和栈是甚么,列举它们的区别?

栈和队列两者都被用来预存储数据。java.util.Queue是两个USB,它的同时实现类在Java并承揽中。队列允许先进先出(FIFO)检索元素,但并非总是这样。DequeUSB允许从两端检索元素。栈与队列很相似,但它允许对元素进行后进先出(LIFO)进行检索。Stack是两个扩展自Vector的类,而Queue是两个USB。

27.Collections类是甚么?

Java.util.Collections是两个工具类仅包涵静态方法,它操作或返回子集。

它包涵操作子集的多态演算法,返回两个由指定子集支持的新子集和其它许多内容。

这个类包涵子集架构演算法的方法,比如折半搜索、排序、混编和逆序等。

28.Comparable和ComparatorUSB有何区别?

Comparable和ComparatorUSB被用来对对象子集或者数组进行排序。

ComparableUSB被用来提供对象的自然排序,他们能采用它来提供基于单个逻辑的排序。

ComparatorUSB被用来提供不同的排序演算法,他们能选择需要采用的Comparator来对给定的对象子集进行排序。

29.他们如何对一组对象进行排序?

如果他们需要对两个对象数组进行排序,他们能采用Arrays.sort()方法。如果他们需要排序两个对象列表,他们能采用Collection.sort()方法。

两个类都有用于自然排序(采用Comparable)或基于标准的排序(采用Comparator)的重载方法sort()。Collections内部采用数组排序方法,大部份它两者都有相同的性能,只是Collections需要花时间将列表转换为数组。

30.当两个集合被作为参数传递给两个函数时,如何才能确保函数不能修改它?

在作为参数传递之前,他们能采用Collections.unmodifiableCollection(Collection c)方法创建两个只读子集,这将确保改变子集的任何操作都会抛出UnsupportedOperationException。

# 为甚么要做自我介绍

很多人的求职复试的过程中都会遇到这个难题:

“请做个自我介绍。”

有的人,能口若悬河、妙语连珠讲3分钟,有的人,可能磕磕巴巴,讲了30秒,前者一定能胜过后者,然则未必。

通常说来,大大小小的复试,都会被问到这个难题,甚至有些复试技术还有些生硬的复试官,屁股还没坐稳,就把这个难题抛给应聘人员了,那么作为求职者,要首先明白,复试官为甚么要让你做自我介绍?简单说来,包括以下几个原因:

1、复试官的技巧还不是很娴熟,采用复试的惯常流程;

2、透过自我介绍,判断求职者的基本素质(比如口头语言表达能力、逻辑能力等);

3、透过自我介绍,找到简历上缺失的或者不一致的细节,后续追问;

4、透过自我介绍,建立对应聘者的立体、整体的初步印象和概念。

简言之,自我介绍的意义和价值就在于,透过简短的口头语言陈述,让复试官初步了解你是两个甚么样的复试候选人。

学习IT相关内容,找“职坐标在线”

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务