微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Collection集合

集合

在这里插入图片描述

  • List集合的概述

  • 有序集合,这里的有序指的是存取顺序

  • 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素

  • 与Set集合不同,列表通常允许重复的存储元素

  • List集合的特点

  • 存取有序 可以重复 有索引

    数据结构模型:先进后出(栈);
    数据结构队列:先进先出;

    在这里插入图片描述

  • 数组是一种查询快,增删慢的模型;

    • 删除数据时,将原始数据删除,同时后面每个数据向前移动,补充下标给删除数据不为空,导致效率低;

    • 添加数据时,添加位置后的后面每个数据向后移动,再添加元素,补充下标指定的元素不为空,导致效率低;

  • 单向链表的数据结构:

    • 链表是一种增删快,查询慢的模型;

    • 一个节点的数据都存储有下一个节点的地址,所以增删只需匹配地址即可,若是查询只能是从头查到尾;

      在这里插入图片描述


      ArrayList
      ArrayList:底层是数组结构,查询快,增删慢;

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集合概述

  • 可以去除重复
  • 存储顺序不一致
  • 没有索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取删除Set集合里面的元素

TreeSet特点

  • 不可重复的集合
  • 没有索引方法
  • 可以将元素按照规则进行排序(自定义比较器方法(compareto)时,同时也要自定义排序规则否则添加不进去;)按照需求要求的主次条件来判断
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);
    }
}

整理是在是太麻烦了这是我在有道云的笔记,一起来讨论把!!!
后续会一直更完集合

原文地址:https://www.jb51.cc/wenti/3279673.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐