java中集合框架的概述
java集合类主要用于保存对象的。
常用的集合对象:
Colletion接口,Collection接口是集合中的顶层容器,表示的是一组对象,它的下面有两个子接口List接口和Set接口。
List接口:元素有序,可以重复。
ArrayList:底层以数组进行存储元素,存储在ArrayList中的元素是有序的,当容量不足时可以自动扩容。
LinkedList:底层以链表进行存储元素,插入和删除效率高。
Set接口:元素无序,不可以重复。
HashSet:底层是基于散列表实现的,底层的方法基本调用的HashMap中的方法,。
TreeSet:方法基本调用了TreeMap中的方法。
Map接口,以键值对的方式存储对象,不能存在重复的键,每个键也最多只能映射到一个值。
HashMap:底层是基于散列表实现的,jdk1.6使用数组和链表来存储元素,jdk1.8做了优化使用了数组,链表和红黑树来实现,当链表长度超过阈值 是,就会将链表转换成红黑树,从而减少查找时间。
Hashtable:现在基本不使用Hashtable了,在多线程环境下它的效率没有ConcurrentHashMap的效率高
TreeMap:底层基于红黑树实现的,能够自动对添加的对象进行排序,这个对象要实现Comparable接口。
ConcurrentHashMap:jdk1.5引入的并发包中的类。采用多个分段锁,把Map分成多个Segment。
注意:Collections并不是集合,它是一个操作集合的工具类。与Arrays工具类类似。提供了许多操作集合的方法。
ArrayList
对于不需要频繁的查找和删除的操作,可以考虑选用ArrayList来进行存储。ArrayList不是线程同步的,不适于多线程环境下。如果在多线程环境下可以使用
Collections.synchronizedList(new ArrayList()),来将该列表包装起来。
LinkedList
适用于查找和删除操作频繁的情况,不适应需要频繁查找的情况。不是线程同步的。
ArrayList和LinkedList的区别?
1.ArrayList是基于数组来实现的,LinkedList是基于链表来实现的。
2.ArrrayList适合用于频繁的查找操作,LinkedList则适用于频繁的插入和删除操作。(多数据情况下,对于单条数据插入和删除ArrayList效率优于LinkedList)
HashSet和TreeSet
TreeSet在进行添加对象时,该对象应该实现内部比较器Comparable接口,否则抛出异常。
HashMap和Hashtable的区别与联系
1.Hashtable是线程同步的,Hashtable中的大部分方法都加了synchronized进行同步,HashMap是非线程同步的,不适合用在多线程环境下。
2.HashMap和Hashtable底层都是基于散列表来实现的。
3.Hashtable 是允许空的键值对的,Hashtable则不允许。
4.Hashtable还继承了Dictionary接口.
5.现在基本上不在使用Hashtable,在多线程环境下可以使用ConcurrentHashMap。