19.javase-java基础语法-集合
集合
1.集合的由来?
我们学习的是Java – 面向对象 – 操作很多对象 – 存储 – 容器(数组和StringBuffer) – 数组,而数组的长度固定,所以不适合做变化的需求,Java就提供了集合供我们使用。
2.集合和数组的区别?
A:长度区别
数组固定
集合可变,但其实底层也是其他方式实现的.
B:内容区别
数组可以是基本类型,也可以是引用类型
集合只能是引用类型
C:元素内容
数组只能存储同一种类型
集合可以存储不同类型(其实集合一般存储的也是同一种类型)
3.集合的继承体系结构?
由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。
- Collection:Collection 是集合 List、Set、Queue 的最基本的接口。
- Iterator:迭代器,可以通过迭代器遍历集合中的数据
- Map:是映射表的基础接口
List
Java 的 List 是非常常用的数据类型。List 是有序的 Collection。Java List 一共三个实现类:
分别是 ArrayList、Vector 和 LinkedList
一.ArrayList(数组)
特点:
1.底层是数组实现,也就代表了元素是存储地址连续.
2.线程不安全的
3.增删慢,查询快,增删都有可能导致数组扩容,因为数组的容量是固定的,所以如果要扩容就会重新创建一个数组,并且复制原数组的元素.底层:
1.底层是对象数组.
2.默认初始容量为10.
3.扩容时,扩容0.5.
底层数组.
当数组容量满了之后,扩容倍数.
常用方法:
增加
boolean add(Element e) //增加指定元素到链表尾部.
void add(int index, Element e) //增加指定元素到链表指定位置.
boolean addAll(Collection<? extends E> c) //将指定collection中的所有元素插入到ArrayList中
boolean addAll(int index, Collection<? extends E> c) //从指定的位置开始,将指定collection 中的所有元素插入到ArrayList中删除
void clear() //从链表中删除所有元素.
E remove(int index) //删除链表中指定位置的元素.
boolean removeIf(Predicate<? super E> filter) //根据重写Predicate类的test方法选择删除集合中的元素
boolean removeAll(Collection<?> c) //移除ArrayList中Collection所包含的所有元素
boolean remove(Object o) //移除ArrayList中首次出现的指定元素(如果存在则移除并返回true,否则返回false)获取
E get(int index) //获取链表中指定位置处的元素.
Object[] toArray() //获取一个数组,数组中所有元素是链表中的元素.(即将链表转换为一个数组)
T[] toArray(T[] a) //构造一个数组
List subList(int fromIndex, int toIndex) //获取从fromIndex到toIndex位置的元素查询
E set(int index, E element) //将链表中指定位置上的元素替换成新元素。
搜索元素
boolean contains(Object o) //如果链表包含指定元素,返回true.
int indexOf(Object o) //返回元素在链表中第一次出现的位置,如果返回-1,表示链表中没有这个元素。
int lastIndexOf(Object o) //返回元素在链表中最后一次出现的位置,如果返回-1,表示链表中没有这个元素。
检查链表是否为空
boolean isEmpty() //返回true表示链表中没有任何元素. 判断逻辑是size == 0 获取链表大小
int size() //返回链表长度(链表包含元素的个数).
二.Vector(数组实现、线程同步)
特点:
1.同ArrayList一样底层是数组.
2.线程安全的,加了锁,影响性能.
3.增删慢,查询快,增删都有可能导致数组扩容,因为数组的容量是固定的,所以如果要扩容就会重新创建一个数组,并且复制原数组的元素.
底层:
1.底层是数组.
2.初始容量和容量增幅由自己创建对象时传入.
创建Vector对象时指定初始容量,和扩容容量增幅.
数组容量增幅,如果指定了,用指定的增幅,如果没有则扩容一倍.
线程锁,用synchronized关键字实现
常用方法:
略
三.LinkList(链表)
LinkedList双向链表:其实java中并不存在什么集合的存储结构,包括链表这种存储结构也是相同的,他其实就是把一堆存储在存储在不同位置的内存区域通过一个关系联系起来,合起来就叫做链表.举个例子来说:ArrayList就是住在一个村的人也就是存储位置连续,而LinkedList就是你的同学,你们只是有一种逻辑上的联系在.
特点:
1.底层是双向链表.Node对象.
2.线程不安全.
3.增删快,查询慢.
数据结构模型:双向链表