数据结构
数据结构 : 数据存储方式 隶属算法学科
不同的数据结构带来了 不同的存储方式,存储效率....
队列和栈结构
数组和链表结构
ArrayList
ArrayList<E> : 完美的底层为数组结构的List集合实现
是最常用的 元素可重复,元素有索引,元素存取有序的单列集合!
创建对象:
ArrayList<E> 集合名 = new ArrayList<E>();
增删改查四类功能:
增:
boolean add(E e) : 添加元素,永远返回true
void add(int index, E element) : 在指定索引位置插入元素
删:
boolean remove(Object o) : 根据传入的元素删除集合中指定元素,返回删除是否成功
E remove(int index) : 根据传入的索引删除指定元素,把被删除的元素返回
void clear() : 清空集合中的所有元素
改:
E set(int index, E element) : 修改指定索引位置上的元素,返回被修改的元素
查:
E get(int index) : 获取指定索引位置上的元素
boolean contains(Object o) : 查询传入的元素是否包含于集合中
boolean isEmpty() : 查询集合中是否为空 -> 没有元素返回true
int size() : 获取集合元素的个数和集合的长度
int indexOf(Object o) : 查询传入元素第一次出现在集合的索引位置,没找到返回-1
int lastIndexOf(Object o) : 查询传入元素最后一次出现在集合的索引位置,没找到返回-1
遍历:
1. 转数组
2. 普通迭代器
3. 增强for
4. 列表迭代器
5. 普通for
ArrayList集合add方法源码分析
结论:
1. 当创建一个ArrayList集合对象时,在内存中会创建一个长度为0的数组;
2. 当往集合中添加第一个元素的时候,会把集合底层的长度为0的数组替换成长度为10的数组
3. 当添加第11个元素的时候,会在内存中重新创建一个长度为15的数组作为集合的底层容器
4. 当集合底层数组的长度为n,添加第n+1个元素时,底层数组都会扩容至原底层数组长度的1.5倍
源码 : n + (n >>1)
面试题 : 当往ArrayList集合中添加第1024个元素,请问集合底层数组的长度是多少?? 1234
LinkedList
LinkedList<E> : 底层数据结构是 链表结构的 list 集合实现
链表结构 : 无索引,查询慢,增删快
LinkedList<E> : 有索引,增删快
LinkedList 实现了 List<E> 接口中所有的抽象方法;
LinkedList<E> 中新增的一些关于头尾操作的方法:
void addFirst(E e)
void addLast(E e)
E removeFirst()
E removeLast()
E getFirst()
E getLast()
LinkedList<E> 底层是双向链表
Vector
Vector<E> : Java最早的单列集合 -> 从1.2版本开始并入到集合体系,被ArrayList取代;
Vector<E>: 底层也是数组结构
Vector<E> 是同步的 -> 在多线程场景下是安全的.
非多线程场景 : ArrayList
多线程场景 : Vector
Set
Set<E> : 元素无索引,元素唯一,元素存取无序的单列集合的根节点
1. 长度可变
2. 只能存对象
3. 元素无索引
4. 元素不可以重复
5. 元素存取无序
创建对象:
Set<E> 集合名 = new 具体实现类<E>();
增删改查四类功能:
增 : boolean add(E e) : 往集合中添加元素,返回添加是否成功
删 : boolean remove(Object obj) : 按照传入的元素值删除元素
void clear() : 清空
改 : 没有set方法,因为没有索引
查 : 没有get方法,因为没有索引
boolean contains(Object o)
boolean isEmpty()
int size()
遍历 :
1. 转数组 : Object[] toArray()
2. 普通迭代器 :Iterator<E> iterator()
3. 增强for
哈希表结构
哈希表 : hashtable
HashSet
HashSet<E> 底层数据结构是hash表的set集合实现
hash表结构带来了: 元素唯一,元素存取无序
创建对象:
HashSet<E> 集合名 = new HashSet<E>();
增删改查四类功能:
增 : boolean add(E e) : 往集合中添加元素,返回添加是否成功
删 : boolean remove(Object obj) : 按照传入的元素值删除元素
void clear() : 清空
改 : 没有set方法,因为没有索引
查 : 没有get方法,因为没有索引
boolean contains(Object o)
boolean isEmpty()
int size()
遍历 :
1. 转数组 : Object[] toArray()
2. 普通迭代器 :Iterator<E> iterator()
3. 增强for
HashSet集合存储自定义元素去重原理
结论:
1. 如果你没有重写元素的hashCode和equals方法,那么HashSet集合会按照元素的地址值进行去重
2. 如果你想按照对象的属性值去重,请在对象所在的类中重写hashCode和equals方法
HashSet集合存储自定义元素去重原理
结论:
1. 如果你没有重写元素的hashCode和equals方法,那么HashSet集合会按照元素的地址值进行去重
2. 如果你想按照对象的属性值去重,请在对象所在的类中重写hashCode和equals方法