Java学习第十七天知识点
Queue(I) - 队列
1.底层实现:基于数组或者链表实现
2.特点:
a.先进先出(后进后出)
b.队列也是线性结构,有顺序的,但是本身没有标号
3.常用API:
offer() - 向队列尾部追加元素
poll() - 向队列头部取出元素(出队列)
peek() - 向队列头部获取元素(队列不变)
4.Deque(I) - 可以作为双端队列/栈
1).底层实现:基于数组或者链表实现
2).特点:
a.作为双端队列 - 先进先出
作为栈 - 先进后出
b.只能通过方法区分是队列/栈
3).常用API:
作为双端队列:
带有First()/Last()
作为栈:
push() - 压栈
pop() - 弹栈
Set(I) - 和Collection中的API完全一致
1.特点:
a.Set集合截取Map(映射表)
b.Set集合的物理空间是不连续的,添加没有顺序(不是随机)
c.Set集合不允许有重复值,值是唯一的
d.使用equals()判断元素是否重复
2.实现类
1).HashSet©
(1).存储过程 -> 看图
a.调用自身的hashCode()计算存储位置
b.如果该位置上没有元素,则直接存入
c.如果该位置上有元素,则调用equals()和该位置上所有元素进行比较
d.如果相同,则不存入
e.如果不相同,则存入该链表的末尾
(2)结论:
a. hashCode() 和 equals() 必须一起重写
b. equals() 判断两个相同的对象,hashCode()必须一致
c. equals判断两个不相等的对象, hashCode值尽量不等
d. 在同一个类中,基本可以忽略hashCode值尽量不等的情况.
代码:
package week5day01;
import java.util.HashSet;
public class Demo02Set {
public static void main(String[] args) {
HashSet<Student> set=new HashSet<>();
set.add(new Student("第一个",18));
set.add(new Student("第二个",21));
set.add(new Student("第一个",18));
set.add(new Student("第二个",21));
System.out.println(set);
System.out.println("----------------------");
Student stu1=new Student("第一个",18);
Student stu2=new Student("第二个",21);
HashSet<Student> set1=new HashSet<>();
set1.add(stu1);
set1.add(stu2);
System.out.println(set1);
System.out.println(set1.size());
//值修改后,删不掉。除非你改回来。(靠哈希code定位)
// 因为是拿 "第一个",20 去比较,可是原来是18 ,但是20还在18的位置上,哈希值没变,所以20和18哈希值不一样,不能删
//删除不掉三种情况(1、找不到 2、值不对 3、哈希值不对)
//set1.remove(new Student("第一个",18) );
stu1.setAge(20);
set1.remove(new Student("第一个",20));
System.out.println(set1);
System.out.println(set1.size());
}
}
2).TreeSet© - 二叉树
完全二叉树、满二叉树(除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。)…
主要掌握便利方式:
二叉树的遍历主要有三种:
(1)先(根)序遍历(根左右)
(2)中(根)序遍历(左根右)
(3)后(根)序遍历(左右根)