java集合面试题总结及答案,java集合和数组的区别面试题
如何解决写爬虫IP受阻的问题?立即使用。
HashMap 和 Hashtable 有什么区别?
HashMap和Hashtable都实现了Map接口,所以很多特性非常相似。但是,它们有以下区别:HashMap允许键和值为空,而Hashtable不允许键或值为空。(推荐学习:java面试题目)
Hashtable是同步的,但是HashMap不是。所以HashMap更适合单线程环境,Hashtable适合多线程环境。
HashMap提供了一组应用迭代的键,所以HashMap很快就会失败。另一方面,Hashtable提供了键的枚举。
通常,Hashtable被认为是一个遗留类。
数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用 Array 而不是 ArrayList?
下面列出了Array和ArrayList之间的区别:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
数组的大小是固定的,数组列表的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll()、removeAll()、iterator()等等。对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,在处理固定大小的基本数据类型时,这种方法相对较慢。
ArrayList 和 LinkedList 有什么区别?
ArrayList和LinkedList都实现List接口,它们有以下区别:
ArrayList是一个基于索引的数据接口,它的底层是一个数组。它可以随机访问具有O(1)时间复杂度的元素。与此对应,LinkedList以元素列表的形式存储其数据,每个元素都与其前后的元素相链接。在这种情况下,查找一个元素的时间复杂度为O(n)。
与ArrayList相比,LinkedList的插入、添加和删除速度更快,因为当一个元素被添加到集合中的任意位置时,不需要像数组一样重新计算大小或更新索引。
LinkedList比ArrayList占用更多内存,因为LinkedList为每个节点存储两个引用,一个指向上一个元素,另一个指向下一个元素。
也可以参考ArrayList vs. LinkedList。
Comparable 和Comparator 接口是干什么的?列出它们的区别。
Java提供了一个类似的接口,它只包含一个compareTo()方法。这种方法可以一个接一个地对两个对象进行排序。具体来说,它返回一个负数、0和一个正数,以指示输入对象小于、等于或大于现有对象。
Java提供了一个带有两个方法的比较器接口,compare()和equals()。Compare()方法用于对两个输入参数进行排序,返回负数,0,正数表示第一个参数小于、等于、大于第二个参数。
equals()方法需要一个对象作为参数,用于确定输入参数是否等于比较器。只有当输入参数也是比较器,并且输入参数和当前比较器的排序结果相同时,此方法才返回true。
HashSet 和 TreeSet 有什么区别?
HashSet是由哈希表实现的,所以它的元素是无序的。add(),remove(),contains()方法的时间复杂度为O(1)。
另一方面,TreeSet是通过树形结构实现的,它的元素是有序的。因此,add()、remove()、contains()方法的时间复杂度为O(logn)。
HashMap 和 ConcurrentHashMap 的区别?
ConcurrentHashMap是线程安全HashMap的实现。主要区别如下:
ConcurrentHashMap将整个bucket数组分成段,然后使用一个lock锁来保护每个段。与Hashtable的syn key锁相比,锁的粒度更细,并发性能更好。HashMap没有锁定机制,也不是线程安全的。
HashMap的键值对允许Null,但ConCurrentHashMap不允许null。
JDK8之后,ConcurrentHashMap以一种全新的方式实现,使用CAS算法。
List、Set、Map 是否继承自 Collection 接口?
列表、集合是,地图不是。它是Map键值对的映射容器,与List和Set有明显的区别,而Set存储的是分散的元素,不允许重复的元素(数学中集合也是如此)。List是一个线性结构的容器,适合用数字索引访问元素。
说出 ArrayList、Vector、LinkedList 的存储性能和特性?
ArrayList和Vector都使用数组来存储数据。为了添加和插入元素,该数组中的元素数量大于实际存储的数据。它们都允许通过序列号直接索引和插入元素。但是插入元素涉及数组元素移动等内存操作,所以索引数据快,插入数据慢。Vector的性能通常比ArrayList差,因为它的同步方法(线程安全)。
LinkedList使用双链表实现存储(内存中分散的内存单元通过额外的引用链接起来,形成一个可以用序列号索引的线性结构。与数组的连续存储模式相比,这种链式存储模式实际上具有更高的内存利用率)。按序号索引数据需要向前或向后遍历,但插入数据时只需要记录该项的前后项,所以插入速度更快。
Vector属于遗留容器(早期JDK使用的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),现在不推荐使用。但是,由于ArrayList和LinkedListed都是非线程安全的,如果需要多个线程来操作同一个容器,可以通过工具类集合中的synchronizedList方法将其转换为线程安全的容器,然后使用(这实际上是装饰模式的最佳示例,通过将现有对象传递到另一个类的构造函数中来创建新对象,从而添加新函数)。
List、Map、Set 三个接口存储元素时各有什么特点?
列表是有序的集合。使用这个接口,您可以精确地控制每个元素的插入位置。用户可以使用index(元素在列表中的位置,类似于数组下标)来访问列表中的元素,类似于Java中的数组。
集合是不包含重复元素的集合,即任意两个元素e1和e2有e1.equals(e2)=false,集合最多有一个null元素。
Map接口:请注意Map不继承集合接口,Map提供键到值的映射。以上是关于java集合差异的面试问题详情。更多信息请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。