java集合面试题总结及答案,java集合和数组的区别面试题

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: