集合:
性质:是一个用于存储多个对象的容器,容器内的对象就是元素容器内存储的都是元素的地址,集合框架中含多种接口,抽象类
实现类等来满足我们的需求,(元素必须是引用类型的数据,不能是基本数据类型的数据)
Collection
集合的顶级父接口
常用方法:boolean add(E e)
int size()
boolean addAll(Collection c)
void clear()
boolean contains(Object obj)
boolean containsAll(Collection c)
boolean isEmpty()
boolean remove(Object o)
boolean removeAll(Collection c)
boolean retainAll(Collection c)
List(列表):
性质:此接口对应的实现类的特点是:有序的,可以重复的
常用方法:void add(int index,E element)
E get(int index)
int indexOf(Object obj)
E set(int index,E newElement)
boolean remove(int index)
List<E> subList(int fromIndex,int endIndex)
此方法在堆中不会产生新的集合对象。
变量引用的父集的一部分。
修改子集,会影响父集
int lastIndexOf(Object obj)
实现类:ArrayList(性质:底层是基于动态数组的数据结构,有序存放)
LinkedList(底层是基于双链表的数据结构,每一个存储单元都要涉及到其他两个引用)
优缺点:在执行get()/set()时,ArrayList的效率高,LinkedList需要移动指针,效率低
在增加/删除操作时,LinkedList效率高,ArrayList效率低(需要扩容,移动元素)。
Vector:是一个比较古老的集合类型,线程安全,但是效率特别低,不建议使用
Stack(栈):
常用方法:void push(E e)将项目推送到此堆栈的顶部。
E pop()删除此堆栈顶部的对象
Queue(队列):
性质:通常是一段进(offer)一段出(poll)
常用方法:boolean offer(E e)
E pool()
E peek()
子接口:Deque(双端队列)性质:两端都可以进,也都可以出
常用方法:boolean offerFiret(E e):在deque的前面插入对象e,违反容量限制返回false
boolean offerLast(E e):在deque的后面添加对象e,违反容量限制返回false
E pollFirst():检查并删除deque第一个元素
E pollLast():检查并删除deque最后一个元素
E peekFirst():返回队首元素
E peekLast():返回队尾元素
Set接口:
性质:无序,存储的元素与添加顺序无关,不可重复(使用equals方法来判定是否重复)
能存储null元素,只能存储一次
当向集合中
子类:HashSet(通过实现hash算法的一种数据结构,无序,不重复)
LinkedHashSet(通过实现hash算法的一种数据结构,但是通过链表来维持顺序。顺序与添加顺序一致)
TreeSet(使用二叉树的一种数据结构,顺序与自然排序有关系,支持定制排序)
Hash算法机制
当向集合添加元素时我们需要调用equals方法来一一校验。但是元素过多时,我们校验的次数明显增多,因此效率就很低。
提高效率的方法:我们为元素对象,提供一个hash算法(哈希值),用于返回此元素的一个hash值(int值)。并且在集合所占的内存中开辟很多小的区域
每个区域用于存储一定范围哈希值的元素。
重写HashCode方法:
重写规则:尽可能的让所有的成员变量都参与运算,
尽可能的避免出现hash值碰撞
注意:
重写的必要性:
(1)如果重写了equals(), 有必要重写hashCode方法
(2)如果equals()返回true, hashCode返回值有必要相同
(3)如果equals()返回false,hashCode返回值不一定相同,
如果返回值不同,可以提高检索的效率
反过来说:
(1)hashCode值相同,equals方法可能不同
(2)hashCode值不同,equals方法一定不同