Java容器面试题

Java容器

18.Java容器都有哪些

答:

  • List、Map和Set
19.Collection 和 Collections 有什么区别?

答:

  • Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的表现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
  • Collections是一个包装类。它包含有各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化),大多数都是用来处理线性表的。此类不能被实例化,就像一个工具类,服务于Java的Collection框架。
20.List、Map和Set之间的区别是什么?

答:

  • List:有序集合
  • Set:无重复集合,LinkedHashSet按照插入排序,SortedSet可排序,HashSet无序
  • Map:键值对集合
21.HashMap和HashTable有什么区别?

答:

  • HashMap相当于哈希表,但是它是非同步的,并且允许空值作为键和值,但是哈希表不允许为空。
  • 主要之一HashMap与Hashtable的区别是HashMap是非同步的,而Hashtable是同步的,这意味着哈希表线程安全,可以在多个线程之间共享,但是HashMap如果没有适当的同步,就不能在多个线程之间共享。
  • Hashtable和HashMap之间一个更显著的区别是,由于线程安全性和同步性,如果在单线程环境中使用,Hashtable比HashMap慢得多。因此,如果您不需要同步,并且HashMap仅由一个线程使用,那么它的性能将优于Java中的Hashtable。
22.如何决定使用HashMap还是TreeMap?

答:

  • TreeMap的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。
  • HashMap的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。
    如果需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。
23.HashMap实现原理

答:

  • HashMap键是由hashcode存储,里面数据结构有数组,链表,JDK1.8之后加入红黑树。数组初始化长度为16,当需要存储时,重写键的hashcode方法,然后对长度取模,存入到数组对应位置的链表中,当链表结点大于8时并且数组长度大于64时,链表就会转换为红黑树,当结点个数小于6时,又会转换为链表。当数组个数大于初始化长度*负载因子就会扩容。
  • 重写hash值得方法是右移16位,然后在和hash值做异或操作,充分利用高位和地位。
  • 取模操作,就是hash值对长度-1做&操作,原理:对无符号数的取模和取余时一样的,hash值对2^n取余,就是将hash值的二进制表示右移n位,结果就是商,移动的n位就是余数,当length位2的n次方,则2的n次方-1的二进制表示就等于(n个1)。
24.HashSet实现原理

答:

  • HashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object();
25.ArrayList和LinkedList区别是什么

答:

  • ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。
  • LinkedList使用了循环双向链表数据结构。与基于数组ArrayList相比,这是两种截然不同的实现技术,这也决定了它们将适用于完全不同的工作场景。
  • LinkedList链表由一系列表项连接而成。一个表项总是包含3个部分:元素内容,前驱表和后驱表,在JDK的实现中,无论LikedList是否为空,链表内部都有一个header表项,它既表示链表的开始,也表示链表的结尾。表项header的后驱表项便是链表中第一个元素,表项header的前驱表项便是链表中最后一个元素。
    参考地址:https://www.cnblogs.com/wwwcnblogscom/p/8036411.html
26.如何实现数组和List之间的转换

答:

  • 数组转 List:使用 Arrays. asList(array) 进行转换。
  • List 转数组:使用 List 自带的 toArray() 方法。
27.ArrayList和Vector的区别是什么

答:

  • 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
  • 性能:ArrayList 在性能方面要优于 Vector。
  • 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加50%。
28.在Queue中poll()和remove()有什么区别?
  • poll()和remove()都将移除并且返回对头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。
    扩展
    offer()和add()的区别
  • add()和offer()都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。可以据此在程序中进行有效的判断!
    peek()和element()的区别
  • peek()和element()都将在不移除的情况下返回队头,但是peek()方法在队列为空时返回null,调用element()方法会抛出NoSuchElementException异常。
29.哪些集合类是线程安全的?

答:

  • Vector:就比Arraylist多了个同步化机制(线程安全)。
  • Hashtable:就比Hashmap多了个线程安全。
  • ConcurrentHashMap:是一种高效但是线程安全的集合。
  • Stack:栈,也是线程安全的,继承于Vector。
30.迭代器Iterator是什么?

答:

  • 首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。
  • Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
  • 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

分享Java知识,一起学习进步,有兴趣可以来我的个人网站哟!
网站地址:http://www.baterman.cn/

你可能感兴趣的:(Java,知识回顾,java)