List集合体系的特点:
1. 元素存取有序 (存入和取出元素的顺序一致) 321->321 排序: 从小到大
2. 元素可以重复
3. 有索引
常用特有成员方法
void add(int index, E element): 将指定的元素, 添加到该集合中的指定位置上
E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素
E set(int index, E element): 用指定元素替换集合中指定位置的元素, 返回值的更新前的元素
E get(int index): 返回集合中指定位置的元素
ArrayList集合的特点:
ArrayList底层的数据结构:数组
查询快 增删慢 线程不安全.效率高
ArrayList适用场景:
存储的数据"查询多, 增删少"的场景. 如用一个ArrayList存储中国城市名
LinkedList底层的数据结构:链表
LinkedList的特点:查询慢 增删快 线程不安全, 效率高
LinkedList适用场景: 存储的数据"查询少, 增删多"的场景. 如用LinkedList实现栈或队列
特有成员方法(主要操作开头和末尾元素)
void addFirst(E e): 将指定元素插入此列表的开头
void addLast(E e): 将指定元素添加到此列表的结尾
E getFirst(): 返回此列表的第一个元素
E getLast(): 返回此列表的最后一个元素
E removeFirst(): 移除并返回此列表的第一个元素
E removeLast(): 移除并返回此列表的最后一个元素
E pop(): (其实就是removeFirst())从此列表所表示的栈中弹出一个元素
void push(E e): (其实就是addFirst())将元素添加到此列表所表示的栈中
Vector底层的数据结构:数组
Vector的特点:查询慢 增删快 (同步)线程安全, 效率低
set集合
Set集合体系特点:1. 元素不可重复 2. 没有索引
HashSet特点:
1. 元素不可重复
2. 没有索引
3. 元素存取无序 (存入和取出顺序有可能不一致)
4. 底层采用 哈希表 结构. (查询快) 哈希表 = 数组 + 链表或红黑树
常用方法:
boolean add(E e):添加元素 ,根据元素的hashCode()和equals()方法判断是否重复,重复则不添加并返回false,不重复则添加并返回true
什么是哈希值:
哈希值是一个十进制数值,一般是通过将该对象的内部地址转换成一个整数来实现的
hashCode()方法的作用
方法内部的算法用于将对象计算为一个哈希值, 便于根据哈希值比较对象是否"相等" 哈希值主要是为了提高对象存储在 哈希表 中的效率
注意:
1. 如果我们不满意Object中的哈希值计算方法, 可以重写hashCode()方法
但在Java代码中不能直接重写带有 native 的方法, 重写时应该将 native 去掉
2. hashCode() 方法有可能将"不同的对象"计算出"相同的哈希值", 这称为"哈希冲突", 在出现冲突后, 一 般再通过 equals() 方法来继续判断对象是否"相等"
LinkedHashSet集合
LinkedHashSet特点:
1. 元素存取有序 (存入和取出顺序一致)
2. 元素不可重复
3. 没有索引
LinkedHashSet底层数据结构:
哈希表 + 链表 (也就是: 数组 + 链表或红黑树 + 链表)
其中, 哈希表用于存储数据, 额外的链表用于记录元素添加时的先后顺序, 以便在获取元素时保持顺序一致
总结: 什么时候用List, 什么时候用Set?
要存储的元素可以重复的, 用List集合:
增删少, 用ArrayList
增删多, 用LinkedList
要存储的数据要求不重复, 或者相对一个集合去重, 用Set集合:
不要求存取顺序一致, 用HashSet
要求存取顺序一致, 用LinkedHashSet