26.数据结构概述

一、数组、链表、栈、堆、列表、队列、优先队列(堆)、二叉树、AVL树、红黑树、Trie字典树、并查集、MAP、哈希表

略。

(请移步数据结构专题。)

红黑树约束(与2-3树或者2-4树的性质等价)

  • 节点要么黑,要么红
  • 根节点黑
  • 叶子节点(特指空节点)黑
  • 红节点的子节点黑
  • 黑平衡(任何一个节点到其每一个叶子结点的所有路径上黑色节点数相同)

二、List接口(存取有序)

继承自Collection,属于单列集合

  • 允许重复,
  • 线性方式存储(存储有序),
  • 带有索引。

常用方法(省略 public)

  • E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素
  • 继承了Collection中所有方法。
  • void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
  • E get(int index) :返回集合中指定位置的元素。
  • E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。

List 子类

  1. ArrayList 增删慢,查找快

  2. LinkedList 链表结构,增删快,查找慢。

使用LinkedList不能使用多态,因为有些方法是它特有的,他的父类List没有

LinkedList常用方法(省略public):
- void addFirst(E e) : 将指定元素插入此列表的开头
- void addList(E e): 将指定元素添加到此列表的结尾
- E getFirst(): 返回此列表的第一个元素。
- E getLast() :返回此类彼岸的最后一个元素
- E removeFirst() : 移除并返回列表的第一个元素
- E removeLast() : 移除并返回此列表的最后一个元素
- E pop() :从此列表所便是的堆栈处弹出一个元素
- void push(E e) :将元素推入此勒边所表示的堆栈。
- boolean isEmpty() :判断列表是否为空。

  1. Vector
    • 已被废弃,不用
    • 同步的,效率低,安全性高,有锁(ArrayList是不同步的,安全性低,没锁)

三、Set接口

Set接口是没有索引的,不能使用普通的for遍历

没有扩充Collection接口的功能,而且还比较严格了一些

1. HashSet

  • 不可重复(依赖hashCode与equals方法)
  • 无索引
  • 存取无序
  • 底层是HashMap
  • 查询的速度非常快。
  • 迭代器、增强for遍历。

哈希值:默认情况下,以逻辑地址(似乎不是物理地址)进行hash计算

HashSet存储的底层结构特点:

  • 哈希表(链地址法),哈希值,十进制整数
    public native int hashCode() 这是一个本地方法(对应平台操作系统的方法);

  • 长度小于等于8,为链表。

  • 链表长度超过8,超过8的链表转为红黑树(在可转的情况下,应该是平均情况下)

HashSet存储自定义类型元素,为了保证集合对象唯一,需要重写

    1. HashCode 方法(默认是以地址进行hash计算), 负责计算索引
    1. equals 方法,负责判断逻辑上的相等。
import java.util.Objects;

public class Student{
    private String name;
    private int age;

    public Student(String name, int age) { this.name = name;this.age = age; }
    public Student() { }
    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 boolean equals(Object o) {
        if(this == o) return true;
        if(o == null || this.getClass() != o.getClass()) return false;

        Student stu = (Student) o;
        return age == stu.getAge() && Objects.equals(name, stu.getName());
    }

    /**默认是以地址进行计算Hash计算*/
    @Override
    public int hashCode() {
        /**Objects工具类,对应的hash方法,底层是可变长参数*/
        return Objects.hash(name, age);
    }
}

2. LinkedHashSet

  • 存取有序(根据Linked链表记录存入的顺序)
  • 基于链表的Hash表,

你可能感兴趣的:(26.数据结构概述)