Java集合类(概述)

Java集合类(概述)


JDK集合类主要包含两个接口,Collectoin接口和Map接口。

  • Collectoin接口下面主要有三个子接口:ListSetQueue
    • List的实现类主要有:ArrayList,LinkedList和Vector,其中Vector的一个子类是Stack。
    • Set的实现类主要有:HashSet,TreeSet。
    • Queu的实现类主要有:LinkedBlockingQueue,ArrayBlockingQueue和ConcurrentLinkedQueue。
  • Map接口主要有四个实现类:HashMap,ConcurrentHashMap,HashTable,TreeMap。

它们的层次关系如下图所示:

Collection      
  List    
    ArrayList  
    LinkedList  
    Vector  
      Stack
  Set    
    HashSet  
    TreeSet  
  Queue    
    LinkedBlockingQueue  
    ArrayBlockingQueue  
    ConcurrentLinkedQueue  
Map      
  HashMap    
  ConcurrentHashMap    
  HashTable    
  TreeMap    


ArrayList和LinkedList的特点和区别?

ArrayList: 底层用数组实现,由于数组可以通过下标直接访问指定索引的元素,因此,ArrayList通过索引查询元素非常快。但由于插入和删除元素时都会进行数组的重新排列,因此,ArrayList的插入和删除操作比较慢。
LinkedList:底层用链表实现,由于链表没有具体的下标,因此,访问某个索引的节点时需要遍历该节点前面的所有元素,速度比较慢。由于插入和删除元素时只需要更新相应元素的指针(或引用),不用重新排列元素,因此,LinkedList对插入和删除操作比较快。

ArrayList和Vector的区别?

ArrayList非线程安全,Vector线程安全。
在扩容时,ArrayList默认扩容当前容量的50%,但Vector默认扩容当前容量的100%。

为什么Stack会继承自Vector?

这是设计上典型的滥用继承的问题,Stack应该只有push,pop等和栈相关的方法,但由于继承了Vector,Stack就额外增加了一些和Vector相关的方法,比如addElement,removeElement等。
Stack应该持有Vector的一个引用对象,采用静态代理的方式来实现栈,这样就能避免原始设计上的缺陷。

HashSet和TreeSet的区别?

HashSet基于HashMap,用键来存放HashSet的值,由于HashMap的键不能重复,因此,HashSet的值也不会重复,这是集合的一个特点。
TreeSet基于TreeMap,也是用键来存放TreeSet的值。TreeMap的底层实现是红黑树,其根据键排序,可以得到排好序的数据。

LinkedBlockingQueue和ArrayBlockingQueue的区别?

LinkedBlockingQueue底层使用链表来存放数据,而ArrayBlockingQueue底层使用数组来存放数据。
二者的相同点是提供了一个阻塞式容器,生产者可以往里面存放数据,消费者可以从里面获取数据。当容器中没有数据时,如果有消费者试图获取数据,那么消费者线程将阻塞,直到有某个生产者存放了数据。
当容器已满时,如果有生产者试图存放数据,那么生产者线程将阻塞,直到有某个消费者取出了数据。

HashMap和HashTable的区别?

HashMap非线程安全,HashTable线程安全。
HashMap可以允许一个null键和多个null值,但HashTable不允许,会出现NullPointerException。

HashMap和ConcurrentHashMap的区别?

HashMap非线程安全,但ConcurrentHashMap线程安全,其采用分段加锁的方式实现线程安全,效率比HashTable高,是HashTable的替代品。

HashMap和TreeMap的区别?

HashMap中存放的键是随机的,具有较快的访问和存取速度,TreeMap中的键是排好序的。

猜你喜欢

转载自blog.csdn.net/funnyrand/article/details/81452728