数据结构

本文介绍了Java中的数据结构,如栈、队列、数组、链表、红黑树等,还阐述了List、Set集合相关知识。List集合有序且可重复,其ArrayList查询快、增删慢,LinkedList则相反;Set集合无序且不重复,HashSet底层是哈希表,LinkedHashSet能保证元素有序。此外,还提及可变参数和集合工具类Collections的常用功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构

队列
数组
链表
  • 链表:linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每
    个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。我们常说的
    链表结构有单向链表与双向链表,那么这里给大家介绍的是单向链表。

查询慢,增加删快。
在这里插入图片描述
在这里插入图片描述

红黑树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 我们要说的是二叉树的一种比较有意思的叫做红黑树,红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然
    是一颗二叉查找树。也就意味着,树的键值仍然是有序的。
    红黑树的约束:
    1. 节点可以是红色的或者黑色的
    2. 根节点是黑色的
    3. 叶子节点(特指空节点)是黑色的
    4. 每个红色节点的子节点都是黑色的
    5. 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
      红黑树的特点:
      速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍

List集合

  • java.util.List接口 extends Collection接口
    List接口的特点:
    1.有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123)
    2.有索引,包含了一些带索引的方法
    3.允许存储重复的元素

  • List接口中带索引的方法(特有)
    - public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
    - public E get(int index):返回集合中指定位置的元素。
    - public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
    - public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
    注意:
    操作索引的时候,一定要防止索引越界异常
    IndexOutOfBoundsException:索引越界异常,集合会报
    ArrayIndexOutOfBoundsException:数组索引越界异常
    StringIndexOutOfBoundsException:字符串索引越界异常

  • //List集合遍历有3种方式
    //使用普通的for循环
    for(int i=0; i<list.size(); i++){
    //public E get(int index):返回集合中指定位置的元素。
    String s = list.get(i);
    System.out.println(s);
    }
    //使用迭代器
    Iterator it = list.iterator();
    while(it.hasNext()){
    String s = it.next();
    System.out.println(s);
    }
    //使用增强for
    for (String s : list) {
    System.out.println(s);
    }

List的子类
ArrayList
  • java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为
    查询数据、遍历数据,所以 ArrayList 是最常用的集合
    注意:此实现不是同步的
LinkedList
  • java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。
  • java.util.LinkedList集合 implements List接口
    LinkedList集合的特点:
    1.底层是一个链表结构:查询慢,增删快
    2.里边包含了大量操作首尾元素的方法
    注意:使用LinkedList集合特有的方法,不能使用多态
    - public void addFirst(E e):将指定元素插入此列表的开头。
    - public void addLast(E e):将指定元素添加到此列表的结尾。
    - public void push(E e):将元素推入此列表所表示的堆栈。
    - public E getFirst():返回此列表的第一个元素。
    - public E getLast():返回此列表的最后一个元素。
    - public E removeFirst():移除并返回此列表的第一个元素。
    - public E removeLast():移除并返回此列表的最后一个元素。
    - public E pop():从此列表所表示的堆栈处弹出一个元素。
    - public boolean isEmpty():如果列表不包含元素,则返回true。
Vector集合

Set接口

  • java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。与 List 接口不同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

  • java.util.Set接口 extends Collection接口
    Set接口的特点:
    1.不允许存储重复的元素
    2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
    java.util.HashSet集合 implements Set接口
    HashSet特点:
    1.不允许存储重复的元素
    2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
    3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
    4.底层是一个哈希表结构(查询的速度非常的快)

HashSet是Set接口的实现类

  • 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)
    在Object类有一个方法,可以获取对象的哈希值
    int hashCode() 返回该对象的哈希码值。
    hashCode方法的源码:
    public native int hashCode();
    native:代表该方法调用的是本地操作系统的方法
HashSet集合存储数据的结构(哈希表)

在这里插入图片描述
在这里插入图片描述

Set集合存储元素不重复的原理

在这里插入图片描述
在这里插入图片描述

HashSet存储自定义类型元素
  • 给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一。
  • 为什么?:因为HashSet在存储数据的时候,先查询数据的hash值是否存在,如果不存在,就存储,如果存在,就继续用equals方法进行判断比较是否相同。
    如果不重写hashCode()方法,相同数据计算得到的hash值会不同。重写后才会相同–>具体重写后会相同的原因???

Q: Set集合存储元素不重复的原理?
A:

LinkedHashSet(有序、不允许重复)
  • java.util.LinkedHashSet集合 extends HashSet集合
    LinkedHashSet集合特点:
    底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
可变参数
  • 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格
    式:
    修饰符 返回值类型 方法名(参数类型… 形参名){ }

  • 可变参数:是JDK1.5之后出现的新特性
    使用前提:
    当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数.
    使用格式:定义方法时使用
    修饰符 返回值类型 方法名(数据类型…变量名){}
    可变参数的原理:
    可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
    传递的参数个数,可以是0个(不传递),1,2…多个

  • 可变参数的注意事项
    1.一个方法的参数列表,只能有一个可变参数
    2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾

Collections(集合工具类)

常用功能
  • java.utils.Collections 是集合工具类,用来对集合进行操作。部分方法如下:

  • public static boolean addAll(Collection c, T… elements) :往集合中添加一些元素。
    public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。
    public static void sort(List list) :将集合中元素按照默认规则(升序)排序。
    public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排序。

  • java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
    public static void sort(List list):将集合中元素按照默认规则排序。

    注意:
    sort(List list)使用前提
    被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则

    Comparable接口的排序规则:
    自己(this)-参数:升序

Collections.sort方法的实体类必须implements Comparable接口,并覆盖compareTo方法。
在这里插入图片描述

  • java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
    public static void sort(List list,Comparator<? super T> ):将集合中元素按照指定规则排序。

    Comparator和Comparable的区别
    Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
    Comparator:相当于找一个第三方的裁判,比较两个

    Comparator的排序规则:
    o1-o2:升序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值