集合
1.集合的由来?
我们学习的是Java – 面向对象 – 操作很多对象 – 存储 – 容器(数组和StringBuffer) – 数组,而数组的长度固定,所以不适合做变化的需求,Java就提供了集合供我们使用。
2.集合和数组的区别?
A:长度区别
数组固定
集合可变,但其实底层也是其他方式实现的.
B:内容区别
数组可以是基本类型,也可以是引用类型
集合只能是引用类型
C:元素内容
数组只能存储同一种类型
集合可以存储不同类型(其实集合一般存储的也是同一种类型)
3.集合的继承体系结构?
由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。
- Collection:Collection 是集合 List、Set、Queue 的最基本的接口。
- Iterator:迭代器,可以通过迭代器遍历集合中的数据
- Map:是映射表的基础接口
Collection接口
Collection接口
//collection继承自Iterable接口
public interface Collection<E> extends Iterable<E> {
collection顶层接口中声明的方法
1.判断
boolean isEmpty(); #空
boolean contains(Object o); #包含元素
boolean containsAll(Collection<?> c); #判断是否参数集合为子集
2.获取
int size(); #获取长度
Iterator iterator(); #获取迭代器
Object[] toArray(); #转为数组
3.增加元素
boolean add(E e); #添加元素
4.删除元素
boolean remove(Object o); #删除元素
void clear(); #清空元素
5.交集/并集/差集
boolean retainAll(Collection<?> c); #获取交集
boolean addAll(Collection<? extends E> c); #获取并集
boolean removeAll(Collection<?> c); #获取差集
Iterable接口提供三个方法
Iterator接口提供4个方法用来遍历集合
List
Java 的 List 是非常常用的数据类型。List 是有序的 Collection。Java List 一共三个实现类:
分别是 ArrayList、Vector 和 LinkedList
一.ArrayList(数组)
特点:
1.底层是数组实现,也就代表了元素是存储地址连续.
2.线程不安全的
3.增删慢,查询快,增删都有可能导致数组扩容,因为数组的容量是固定的,所以如果要扩容就会重新创建一个数组,并且复制原数组的元素.底层:
1.底层是对象数组.
2.默认初始容量为10.
3.扩容时,扩容0.5.
底层数组.
当数组容量满了之后,扩容倍数.
常用方法:
除了集合的基本方法,他多了这些方法.
增加
void add(int index, Element e) //增加指定元素到链表指定位置.
boolean addAll(int index, Collection<? extends E> c) //从指定的位置开始,将指定collection 中的所有元素插入到ArrayList中删除
E remove(int index) //删除链表中指定位置的元素.获取
E get(int index) //获取链表中指定位置处的元素.
List subList(int fromIndex, int toIndex) //获取从fromIndex到toIndex位置的元素查询
E set(int index, E element) //将链表中指定位置上的元素替换成新元素。
int indexOf(Object o) //返回元素在链表中第一次出现的位置,如果返回-1,表示链表中没有这个元素。
int lastIndexOf(Object o) //返回元素在链表中最后一次出现的位置,如果返回-1,表示链表中没有这个元素。
二.Vector(数组实现、线程同步)
特点:
1.同ArrayList一样底层是数组.
2.线程安全的,加了锁,影响性能.
3.增删慢,查询快,增删都有可能导致数组扩容,因为数组的容量是固定的,所以如果要扩容就会重新创建一个数组,并且复制原数组的元素.
底层:
1.底层是数组.
2.初始容量和容量增幅由自己创建对象时传入.
创建Vector对象时指定初始容量,和扩容容量增幅.
数组容量增幅,如果指定了,用指定的增幅,如果没有则扩容一倍.
线程锁,用synchronized关键字实现
常用方法:
略
三.LinkedList(链表)
LinkedList双向链表:其实java中并不存在什么集合的存储结构,包括链表这种存储结构也是相同的,他其实就是把一堆存储在存储在不同位置的内存区域通过一个关系联系起来,合起来就叫做链表.举个例子来说:ArrayList就是住在一个村的人也就是存储位置连续,而LinkedList就是你的同学,你们只是有一种逻辑上的联系在.
特点:
1.底层是双向链表.Node对象.
2.线程不安全.
3.增删快,查询慢.
数据结构模型:双向链表
LinkedList的元素结构,他的属性里列出了头元素和尾部元素,以及链表尺寸三个属性.
这个LinkedList的内部内Node节点类,节点类的属性有三个,第一个E就是存储的元素值,next和prev就是存储的上下节点.
常用方法:
LinkedList的常用方法相对于ArrayList多了多余收尾位置的元素的操作,因为链表增加删除都比较快,所以多了索引操作相关的方法.
增加
LinkedList提供了多个添加元素的方法:
●boolean add(E e)
在链表尾部添加一个元素,如果成功,返回true,否则返回false。
●void addFirst(E e)
在链表头部插入一个元素。
●addLast(E e)
在链表尾部添加一个元素。
●void add(int index, E element)
在指定位置插入一个元素。
删除LinkedList提供了多个删除元素的方法:
●boolean remove(Object o)
从当前链表中移除指定的元素。
● E remove(int index)
从当前链表中移除指定位置的元素。
● E removeFirst()
从当前链表中移除第一个元素。
● E removeLast()
从当前链表中移除最后一个元素。
● E remove()
从当前链表中移除第一个元素,同removeLast()相同。
获取LinkedList提供了多个获取元素的方法:
● E get(int index)
从当前链表中获取指定位置的元素。
● E getFirst()
从当前链表中获取第一个元素。
● E getLast()
从当前链表中获取最后一个元素。
LinkedList可实现队列的FIFO(first in first out)和栈的LIFO(last in first out)算法.
具体实现就是正向取值为栈LIFO算法,逆向取值为队列FIFO算法.