容器

  • .java 容器都有哪些?
  • 19.Collection 和 Collections 有什么区别?
  • 数组和集合的区别:
 1.数组的大小是固定的,并且同一个数组只能是相同的数据类型
 2.集合的大小是不固定的,在不知道会有多少数据的情况下可使用集合。
  • 集合的三种类型:list(列表)、set(集)、map(映射)
List接口和Set接口属于Collection接口,Map接口和Collection接口并列存在(同级)。
  • HashMap和Hashtable的区别
答案:1.继承的父类不同 2.Hashtable线程安全,HashMap不安全 3.Hashtable key不能为空,HashMap可以
HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
  • 22.如何决定使用 HashMap 还是 TreeMap?
如果用来排序,使用TreeMap,默认按键值升序排列;
TreeMap的实现是基于红黑树结构。
线程不安全
如果快速插入删除,使用HashMap,
数据结构主要是桶(数组),链表或红黑树(jdk1.8以后)
线程不安全
  • 23.说一下 HashMap 的实现原理?
  • 24.说一下 HashSet 的实现原理?
HashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object();
HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值。
 所以判断key是否存在就要重写元素的类的equals()和hashCode()方法,当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。
Set集合不包含重复的元素,这是使用Set的主要原因。
有三种常见的Set实现——HashSet, TreeSet和LinkedHashSet。
什么时候使用它们,使用哪个是个重要的问题。
总体而言,如果你需要一个访问快速的Set,你应该使用 HashSet;
当你需要一个排序的Set,你应该使用TreeSet;
当你需要记录下插入时的顺序时,你应该使用LinedHashSet。
ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现
在需要频繁读取集合中的元素时,更推荐使用 ArrayList, 而在插入和删除操作较多时,更推荐使用 LinkedList。
数组转 List ,使用 JDK 中 java.util.Arrays 工具类的 asList 方法
List 转数组,使用 List 的toArray方法。无参toArray方法返回Object数组,传入初始化长度的数组对象,返回该对象数组
线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。 性能:ArrayList 在性能方面要优于 Vector。 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,ArrayList 使用自动装箱来减少编码工作量;而当处理固定大小的基本数据类型的时候,这种方式相对比较慢,这时候应该使用Array。
poll()和 remove()有什么区别?
poll()和remove()都将移除并且返回对头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。
peek()和element()的区别
peek()和element()都将在不移除的情况下返回队头,但是peek()方法在队列为空时返回null,调用element()方法会抛出NoSuchElementException异常。
offer()和add()的区别
add()和offer()都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。可以据此在程序中进行有效的判断!
Vector:就比Arraylist多了个同步化机制(线程安全)。
Hashtable:就比Hashmap多了个线程安全。
ConcurrentHashMap:是一种高效但是线程安全的集合。
Stack:栈,也是线程安全的,继承于Vector。
它是一个对象,它的工作是遍历并选择序列中的对象,而客户端的程序员不必知道或关心该序列底层的结构。**
例如Java的Iterator只能单向移动,它能用来: (1)使用方法Iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。 (2)使用next()获得序列中的下一个元素 (3)使用hasNext()检查序列中是否还有元素。 (4)使用remove()将迭代器新近返回的元素删除。
(1) Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationEception的异常。 (2)Iterator遍历集合元素的过程中可以通过remove方法来移除集合中的元素,删除的是上一次Iterator.next()方法返回的对象。 (3)Iterator必须依附于一个集合类对象而存在,Iterator本身不具有装载数据对象的功能。 (4)next()方法,该方法通过游标指向的形式返回Iterator下一个元素。
我们可以用Collections包下的unmodifiableMap方法,通过这个方法返回的map,是不可以修改的。他会报 java.lang.UnsupportedOperationException错。
Collections.unmodifiableList(List) Collections.unmodifiableSet(Set)