集合
-
List集合的概述
-
有序集合,这里的有序指的是存取顺序
-
与Set集合不同,列表通常允许重复的存储元素
-
List集合的特点
-
存取有序 可以重复 有索引
数据结构模型:先进后出(栈);
数据结构队列:先进先出; -
数组是一种查询快,增删慢的模型;
-
单向链表的数据结构:
private static final int DEFAULT_CAPACITY = 10;//默认容量为
自动扩容1.5倍
LinkList
LinkList:底层是链表数据结构,查询慢,增删快;
list.get(int index);获取下标中的元素
Node<E> node(int index) {
if (index < (size >> 1)) {//判断离数组开头和结尾那个近;
Node<E> x = first;//若没有数组长度一半大就从开头查询
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;//若是有则是从结尾开始查询
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
Set集合概述
TreeSet特点
public int compareto(Student o) {
//按照对象年龄排序【this.age】指的是当前存入的元素,【o.age】指的是已经存在的元素;
int reslt = this.age - o.age;
//this.name.compareto(o.getName())String的构造方法:按字典顺序比较两个字符串。
reslt = reslt == 0 ? this.name.compareto(o.getName()) : reslt;
return reslt;
}
二叉查找树
规则:以根节点挨个比较,左边存小节点,右边存大节点,一样的不存;
【没有规则的树是普通二叉树】
平衡二叉树:
- 二叉树左右两个子树(子节点)的高度差不超过1
- 任意节点的左右两个子树(子节点)都是一颗平衡二叉树
7 — 左节点长度是3,右节点长度4 (符合要求);
4 —左右节点长度都是2;(符合要求)
10 — 左节点长度是0,右节点长度是3;(不符合要求)
所以不是平衡二叉树
以此类推;
是平衡二叉树;
为了防止树的分支长短不一,于是就有了旋转来平衡二叉树!!!↓
↓
左旋转平衡二叉树;
将9节点暂时忽略不看;
↓
↓
再来处理9节点;
↓
通过旋转,但这样又不符合二叉树的规律,所以这时候将9节点降级成为7的右子节点;
↓
左旋:就是将根节点的右侧往左拉,原先的右子节点变成新的父节点,且把多余的左子节点出让,给已经降级的根节点当右子节点;
同理所得*** 右 旋 ***
方法:
红黑树
概述:红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构;
1972年,当时被称之为【①平衡二叉B树】,再后来,1978年才称之为“红黑树”。
红黑树:是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色,【②每一个节点可以是红或者黑;】【③红黑树不是高度平衡的,它的平衡是通过“红黑规则”进行实现的;】
每一个节点是红色或者是黑色,根节点必须是黑色
每个叶节点(Nil)是黑色的
不能出现两个红色节点相连
对每个节点,到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;
HashSet
特点:
底层数据结构是哈希表
不能保证存取顺序完全一致
没有索引的方法,不能使用普通for方法遍历循环
Set集合,元素唯一,不重复
哈希值:是JDK根据对象的地址或者属性值,算出来的int类型整数;
HashSet 1.7版本原理
底层结构是:哈希表。(数组+链表)
数组默认长度为16,加载因子为0.75
(当数组存了16*0.75=12个元素时,数组扩容两倍)
首先会先获取元素的hash值,计算出在数组中应存入的索引
先会判断该索引处是否为null
如果是null,直接添加
如果不是null,则与链表中的所有的元素,通过equals方法比较属性值
若相同就不存,不相同则存入链表;
新的元素添加链接在下方的旧元素
HashSet 1.8版本原理
当挂在下面的元素过多,不利于添加,也不利于查询,所以当链表长度超过8的时候,链表就自动转换成红黑树;
public class MyHashSetDemo {
public static void main(String[] args) {
HashSet<Student> set = new HashSet<>();
Student a = new Student("a", 11);
Student aa = new Student("a", 11);
Student b = new Student("b", 22);
set.add(a);
set.add(b);
set.add(aa);
//没有重写hashcode是计算地址的hash值,
//重写hashcode是计算属性的hash值
System.out.println(set.size());
System.out.println(set.hashCode());
System.out.println(set.hashCode());
System.out.println(a.hashCode());
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(aa.hashCode());
}
}
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
整理是在是太麻烦了这是我在有道云的笔记,一起来讨论把!!!
后续会一直更完集合