Queue(I) --队列
1.底层实现:基于数组或者链表实现
2.特点:
a.先进先出
b.队列也是线性结构,有顺序的,但本身没有标号
3.常用API:
//添加方法 --向队列尾部添加元素
queue.offer("张三");
queue.offer("李四");
queue.offer("王五");
System.out.println(queue);//[张三, 李四, 王五]
//poll出列 --向队列头部取出元素 队列改变
String poll = queue.poll();
System.out.println(poll);//张三
System.out.println(queue);//[李四, 王五]
//peek出列 --向队列头部获取元素 队列不变
String peek = queue.peek();
System.out.println(peek);//李四
System.out.println(queue);//[李四, 王五]
4.Deque(I) -可以作为双端队列/栈
a.底层实现:基于数组或者链表实现
b.特点:
作为双端队列 --先进后出
作为栈 --先进后出
只能通过方法区分是队列/栈
LinkedList
//作为list的实现类使用 --queue.add
//作为Queue实现类使用 --入队offer 查看peek 出列poll
作为双端队列带有first()/last()
//作为栈实现 --压栈push 出栈pop 查看peek
Set(I)
–和Collection中的API完全一致
1.特点:
a.Set集合截取Map(映射表)
b.Set集合的物理空间是不连续的,添加没有顺序(不是随机)
c.Set集合不允许有重复值,值是唯一的
d.使用equals()判断元素是否重复
Set<String> set = new HashSet<>();
//往集合中追加数据
set.add("张三");
set.add("李四");
set.add("王五");
System.out.println(set);//[李四, 张三, 王五]
//插入是无序的,无序指的不是随机
//set是不允许重复的
//set 无序且唯一
2.实现类:
①HashSet(C) --散列表(Hash表)
(1)存储过程 --看图
a.调用自身的hashCode()计算存储位置
b.如果该位置上没有元素,则直接存入
c.如果该位置上有元素,则调用equals()和该位置上所有元素进行比较
d.如果相同,则不存入
e.如果不相同,则存入该链表的末尾
(2)结论:
a. hashCode() 和 equals() 必须一起重写
b. equals() 判断两个相同的对象,hashCode()必须一致
c. equals判断两个不相等的对象, hashCode值尽量不等
d. 在同一个类中,基本可以忽略hashCode值尽量不等的情况
/*
自定义类作为泛型
没有重写hashcode()和equals() 插入4个元素
重写hashcode() 没有重写equals() 插入4个元素
重写equals() 没有重写hashcode() 插入4个元素
重写hashcode()和equals() 插入2个元素
*/