Java学习笔记(十六)
Java部分:
队列(Queue):
-
底层实现:
链表或数组,队列是FIFO先进先出,有序但是没有下标
-
常用API
offer()
peek()
Poll()
-
子接口-Deque
1)作为队列实现,双端队列
有First/Last方法
2)作为栈实现
FILO先进后出
pop()出站 push()进栈
-
注意
a.LinkedList实现了Deque接口,允许重复,但是不允许Null
b.stack和LinkedList都可以作为栈使用,此时应该优先使用LinkedList而不是Stack类
c. Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。
Set集合:
HashSet(散列表,没有顺序但不是随机的)
-
底层数据结构:
链表数组,数组内的元素是链表
-
特点:
a.存储位置不是真正的随机,内存存储位置根据hashCode值计算 - 无序的
b.不允许有重复值(set不允许重复值),允许Null - 使用equals方法判断是否重复
c.线程不安全,高效
-
储存过程
a.根据hashCode计算内存位置
b.如果位置上没有元素,就直接添加
c.如果位置上有元素,则使用equals方法进行比较
d.比较时,如果相同则不存入
e.如果不相同,挨个遍历链表中的元素,使用equals比较是否相同,如果不相同则在链表末尾添加
-
注意
a.hashCode 和 equals 必须一起重写
b.HashSet存入和取出顺序是无关的,如果想要让插入顺序和遍历顺序有关,则使用LinkedHashSet
c.类比ArrayList,是使用最多的Set
TreeSet(实现了SortedSet):
-
底层数据结构
红黑树实现,不允许Null
-
特点
a.可排序,TreeSet专门用于Set排序
b. 不要修改已经存入集合的实例变量,这将导致它与其他对象的大小顺序发生改变,但TreeSet集合不会再次调整它们的顺序,这点和HashSet一样
c.性能低于HashSet,除非有排序需要不然使用HashSet
-
储存过程
a.跟根节点进行比较 - compareTo方法进行比较
b. 如果比根节点大,存储在右边
c.如果比根节点小,存储在左边
d.如果和根节点一样,就不存入
排序:
自然排序(默认排序):
要求:
a.实现了Compareable接口
b.重写Comparable接口中的 compareTo()
数组和集合的排序方式:
数组:Arrays.sort()
List:Collections.sort()
TreeSet和TreeMap在初始化时就是有序的,new即有序
自定义比较器:
要求:
a.使用匿名内部类形式直接实现Comparetor接口
b.并且重写Comparator接口中的 compare()
数组和集合的排序方式:
数组:Arryas.sort(数组,new Comparator(){})
List:: Collections.sort(集合)
TreeSet和TreeMap在初始化时多加入new Comparator(){}参数。