1. JAVA 集合框架的组成
三部分: 接口,接口的实现类,算法类(工具类)
接口如:Collection,List,Map
实现类:ArrayList,LinkedList,HashMap等
算法类:Collections,Arrays
如上图所示
接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
实现类:8个实现类(实线表示),对接口的具体实现。
左下角即为算法类.
在JAVA 集合中又主要分为这三种类型
Set和List集合接口(两者同属 Collection 接口下的 )和Map接口
Set(集) 接口类型:集合中的对象没有特定的方式排序,没有重复对象,但它的某些实现类能对集合中的对象按特定方式排序。
List(列表) 接口类型:是有序的Collection,集合中的对象按照索引位置排序,可以有重复对象,可以按对象在集合中的索引位置检索对象,与数组类似。
Map(映射) 接口类型:集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。它的有些实现类能够对集合中的键对象进行排序。
有趣的是Collection接口不提供随机访问元素的get()方法。因为Collection包括Set,而Set自己维护内部顺序。如果想检查Collection中的元素,那就必须使用迭代器。
而List接口中则出现了 get(int index)方法,其实现类 ArrayList和LinkedList也就实现了这个方法。
另外 Collection 接口的iterator() 和 toArray()方法都用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组.
Iterator接口隐藏底层集合的数据结构,向客户程序提供了遍历各种类型的集合的统一接口。hasNext()判断是否遍历完毕,next()返回下一个元素等等。
除了 Collection接口必备 iterator()方法外,List还提供了一个 listIterator()方法,返回了一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些 add()之类的方法,可以添加,删除,向前或向后遍历。
2.ArrayList 和 LinkedList ,Vector
ArrayList 和 LinkedList 都实现了List接口.因此都实现了List接口中常用的方法,例如 add(),get()等等,但是 LinkedList 除了实现了这些方法外,本身也多出了几种方法,例如addFirst(),addLast(),removeFirst(),removeLast(),getFirst(),getLast()等等.
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
ArrayList 线程不安全 遍历查找元素快 删除和插入元素慢
LinkedList 线程不安全 遍历元素慢 删除和插入元素快
Vector 线程安全 同步 效率都很低 旧的集合框架
如果想让LinkedList 同步的话,保证线程安全,那么可以在创建List时候构造一个同步的List接口类型对象
List list = Collections.synchronizedList(new LinkedList());
总结
1)如果涉及到堆栈,队列等操作,应该考虑用List。如果要进行大量的随机访问,应使用ArrayList;如果经常进行插入与删除操作,用使用LinkedList。
2)HashMap设计用来快速访问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力。
3)Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。LinkedHashSet以插入顺序保存元素。
三部分: 接口,接口的实现类,算法类(工具类)
接口如:Collection,List,Map
实现类:ArrayList,LinkedList,HashMap等
算法类:Collections,Arrays
![](https://i-blog.csdnimg.cn/blog_migrate/3732f3a435689be3a6ca3f1537b48c73.jpeg)
如上图所示
接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
实现类:8个实现类(实线表示),对接口的具体实现。
左下角即为算法类.
在JAVA 集合中又主要分为这三种类型
Set和List集合接口(两者同属 Collection 接口下的 )和Map接口
Set(集) 接口类型:集合中的对象没有特定的方式排序,没有重复对象,但它的某些实现类能对集合中的对象按特定方式排序。
List(列表) 接口类型:是有序的Collection,集合中的对象按照索引位置排序,可以有重复对象,可以按对象在集合中的索引位置检索对象,与数组类似。
Map(映射) 接口类型:集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。它的有些实现类能够对集合中的键对象进行排序。
有趣的是Collection接口不提供随机访问元素的get()方法。因为Collection包括Set,而Set自己维护内部顺序。如果想检查Collection中的元素,那就必须使用迭代器。
而List接口中则出现了 get(int index)方法,其实现类 ArrayList和LinkedList也就实现了这个方法。
另外 Collection 接口的iterator() 和 toArray()方法都用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组.
Iterator接口隐藏底层集合的数据结构,向客户程序提供了遍历各种类型的集合的统一接口。hasNext()判断是否遍历完毕,next()返回下一个元素等等。
除了 Collection接口必备 iterator()方法外,List还提供了一个 listIterator()方法,返回了一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些 add()之类的方法,可以添加,删除,向前或向后遍历。
2.ArrayList 和 LinkedList ,Vector
ArrayList 和 LinkedList 都实现了List接口.因此都实现了List接口中常用的方法,例如 add(),get()等等,但是 LinkedList 除了实现了这些方法外,本身也多出了几种方法,例如addFirst(),addLast(),removeFirst(),removeLast(),getFirst(),getLast()等等.
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
ArrayList 线程不安全 遍历查找元素快 删除和插入元素慢
LinkedList 线程不安全 遍历元素慢 删除和插入元素快
Vector 线程安全 同步 效率都很低 旧的集合框架
如果想让LinkedList 同步的话,保证线程安全,那么可以在创建List时候构造一个同步的List接口类型对象
List list = Collections.synchronizedList(new LinkedList());
总结
1)如果涉及到堆栈,队列等操作,应该考虑用List。如果要进行大量的随机访问,应使用ArrayList;如果经常进行插入与删除操作,用使用LinkedList。
2)HashMap设计用来快速访问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力。
3)Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。LinkedHashSet以插入顺序保存元素。