为什么要引入集合框架?
由于数组的弊端:
1.长度不可变,一旦初始化长度固定;
2.在n个地方需要存储多个数据,都需要专门去编写数组的操作方法,如此一来,没有体现DRY原则(不重复写代码)-----》即封装思想;
3.即使每个人都是要使用数组的类,不同的人定义的类名方法名不同,实现细节也参差不齐;
4.容器类好用,但是不能集中统一管理,不同的写的五花八门;
什么是集合框架?
集合框架是为表示和操作集合而规定的一种统一标准的体系结构。任何集合框架都包括三大块内容:
1.对外的接口;
2.接口的实现.
3.集合运算的算法(底层都对应着某一种数据结构的算法)
为什么要使用集合框架?
1. 提供功能的复用(java.until包);
2. 让程序员专注于业务开发,而不是数据结构以及算法;
常用集合类:
Set集:对象不按特定顺序排序,不允许重复(就如同数学的集合);
List(列表):对象按照索引位置排序,所以允许重复;
Map(映射):集合中每一个元素都包含一对key和value对象,不允许key重复,但是值value可以重复,即可以一对多;
Set集合,List集合,Map集合区别画图帮助理解:
Vector:
设计原理(读源代码):
底层用来存储数据的,我们通过Vector对象的add方法来存储数据,其实底层依然是存储到elementData数组中
存储原理:
通过源码分析,发现在Vector类中有一个Object类型数组
1. 表面上把数据存储到Vector对象中,其实底层依然是把数据存储到Object数组中
2. 我们发现该数组元素的类型是Object类型,意味着集合中只能存储任意类型的对象
集合中只能存储对象,不能存储基本数据类型的值
3.集合类中存储的对象,都存储的是对象的引用而不是对象本身,图示和代码如下:
栈(Stack):
继承Vector,也是基于数组实现,因此把数组的最后一个元素未知作为栈顶,数据结构的一种,操作的永远是栈顶元素;
存储特点:后进先出
栈结构的实例:
1. QQ消息,最顶上是最新的消息
2. 手枪装弹,弹夹压弹之后,后装的先出去
要来实现栈的存储结构可以使用数组,也可以使用链表
ArrayList类:
(常用方法参照Vector)
java集合框架出现之后用来取代Vector类的
二者的区别:
Vector类的方法使用了synchronized关键字,线程安全,性能较低,适用于多线程环境
ArrayList类的方法都没有使用synchronized,不同步,线程不安全,但是性能较高
即使在多线程环境下,也不用Vector类,我们使用
List list = Collections.synchronizedList(new ArrayList(...));
相同点:
底层原理都基于数组算法实现,一模一样
设计上稍有区别,创建对象Vector会初始化一个长度为10的数组
而ArrayList初始化的则是一个空数组,直到调用add方法才会初始化长度为10的数组
Linkedlist类(线程不安全,而多线程环境下需要保证线程安全)双向链表,单向队列,双向队列,栈的实现类;
Linkedlist类实现单向队列和双向队列的接口,自身提高了栈操作的方法,链表操作的方法;
Linkedlist类中存在很多功能相同的方法,因为Linkedlist表示了多种数据结构的实现,每一种数据结构的操作的方法名字不同