Hashset 判断重复值的步骤
步骤1:通过hashCode(),判断哈希值
步骤2:如果哈希值相同,则调用equals()
例:
@Override
public int hashCode() {
return Objects.hash(this.name,this.page,this.price);
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj instanceof Book) {
Book book = (Book)obj;
return this.name.equals(book.name) &&
this.page == book.page &&
this.price == book.price;
}
return false;
}
Collection接口
特点:单列集合,集合中仅保存值
List接口: 特点:有序、允许重复值
ArrayList类
数据结构:基于Object[]数组实现的
初始化
(1)elementData被初始化为空数组
ArrayList<String> list5 = new ArrayList<>();
(2)内部数组elementData被初始化成指定容量的数组
ArrayList<String> list6 = new ArrayList<>(20000);
(3)内部数组elementData按照传入集合进行初始化
ArrayList<String> list7 = new ArrayList<>(Arrays.asList(""));
适用场景:
ArrayList适合数据连续性遍历,读多写少的场景
扩容:
默认为空数组,第一次添加元素,数组增至10,容量不足按原容量1.5倍扩容增长.
常用方法:
添加新元素:
(1)boolean add(E e) 添加新元素至集合尾部
(2)void add(int index,E element) 添加元素到下标位置
(3)boolean addAll(Arrays.asList("元素")) 添加集合内所有元素到当前集合
获取元素
(1)E get(int index) 获取指定位置下标的元素
(2)List<E> subList(int fromIndex,int toIndex 截取指定位置
判断元素
(1)boolean contains(Object o) 判断集合中是否存在元素
(2)boolean equals(Object o)判断两个集合中元素是否相同
(3)int indexOf(Object o)查找指定元素的下标位置
删除元素
(1)void clear() 清空集合
(2)boolean remove(Object o) 删除指定内容的元素
(3)E remove(int index) 删除指定位置元素
(4)boolean removeAll(Collection c) 删除当前集合与指定集合的相同元素
(5)boolean retainAll(Collection 保留当前集合与指定集合相同元素
修改元素
E set(int index,E element) 将指定下标位置的元素,修改为指定新元素
排序
void sort(new Comparator<String>(){重写compare方法}) 按照 Comparator接口实现类的比较规则,对集合诶元素进行排序
转换
T[] toArray(T[] a) 将当前集合转换为数组
迭代器
Iterator<E> iterator() 该迭代器仅提供向后遍历
ListIterator<E> listIterator(int index) 该迭代器提供向前或向后遍历
LinkedList类 基于双向链表实现的
由于采用链表结构,每次添加元素,都会创建新的Node节点并分配空间,所有不存在扩容
适用场景:频繁添加删除操作,写多读少。
常用方法:
添加元素:
(1)boolean add(E e) 添加新元素至链表尾部
(2)void addFirst(E e) 添加新元素至链表头部
(3)void addLast(E e) 添加新元素至链表尾部
获取元素:
(1)E get(int index) 遍历链表,查找指定位置的元素
(2)E getFirst() 获取链表中的头元素
(3)E getLast() 获取链表的伪元素
判断元素:
int indexOf(Object o) 查找链表指定元素下标位置
删除元素:
E remove() 删除链表中的头元素
boolean remove(Object o) 删除指定内容的严肃
E remove(int index) 删除指定位置元素
E removeFirst() 删除链表中的头元素
E removeLast() 删除链表中的尾元素
default void sort(Comparator c) 按照Comparator比较器,将链表中所有元素排序
T[] toArray(T[] a) 将链表转换成数组
Vector类
线程安全
性能较差
扩容方式:自定义增长或扩容2倍
Set接口 无序,值唯一
HashSet类
特点:无序唯一,输出的顺序既不是添加的顺序,也不是String排序的顺序。
数据结构:维护了一个HashMap来进行存储,元素值保存在HashMapkey的位置。
经常用Set用于去除重复元素。并且元素也需要正确实现equals()和hashCode()方法,否则该元素无法正确地放入Set。
核心代码:
public class HashSet<E> implements Set<E> {
// 持有一个HashMap
private HashMap<E, Object> map = new HashMap<>();
// 放入HashMap的value(常量)
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean remove(Object o) {
return map.remove(o) == PRESENT;
}
}
常用方法
boolean add(E e) 添加新元素
void clear() 清空集合
boolean contains(Object o) 判断集合中是否包含指定元素
boolean isEmpty() 判断集合是否为空
Iterator<E> iterator 获取迭代器
boolean remove(Object o) 删除元素
int size() 获取集合长度(元素个数)
LinkedHashSet类
特点:有序