鸿鹄的JAVA学习第八课:数据结构和集合进阶(2)

目录

一,数据结构

1.数据结构概述

2.数据结构的作用

3.数据结构的分类

(1)线性结构

(2)树形结构

(3)图结构

(4)散列结构(哈希表)

(5)其他特殊结构

4.总结

二,LinkedList集合

1.LinkedList集合的基本概念

2.LinkedList 的数据结构特点

3.LinkedList 的常用方法

3.1. 实现 List 接口的方法

3.2. 作为双端队列的方法

4.LinkedList 的遍历方式

5.总结

三.set系列集合 

1.Set 集合的基本概念

2.Set 接口的常用方法

3.set集合的遍历 

3.1增强 for 循环

3.2迭代器遍历

四.HashSet集合

1. 数据结构与原理

2.构造方法

五.TreeSet集合 

1. 数据结构与原理

2. 构造方法

3.TreeSet集合的特殊遍历 


一,数据结构

1.数据结构概述

数据结构(Data Structure) 是计算机存储、组织和管理数据的一种方式,旨在高效地访问和修改数据。它定义了数据之间的逻辑关系、操作规则以及物理存储方式,是算法设计和程序优化的基础。

2.数据结构的作用

  • 高效管理数据:通过合理组织数据,减少时间和空间复杂度。

  • 简化问题解决:将现实问题抽象为数据模型,便于编程实现。

  • 优化资源利用:根据场景选择合适结构,平衡内存占用与操作效率。

3.数据结构的分类

(1)线性结构

  • 特点:数据元素按顺序排列,一对一关系。

  • 常见类型

    • 数组:连续内存存储,支持快速随机访问。

    • 链表:节点通过指针链接,插入/删除高效。

    • 栈(Stack):后进先出,用于函数调用、括号匹配。

    • 队列(Queue):先进先出,如任务调度、缓冲池。

(2)树形结构

  • 特点:数据分层或分叉,一对多关系。

  • 常见类型

    • 二叉树:每个节点最多两个子节点,支持快速搜索(如二叉搜索树)。

    • 堆(Heap):用于优先队列、排序算法(如堆排序)。

    • B树/B+树:数据库索引的核心结构,优化磁盘读写。

(3)图结构

  • 特点:数据多对多关系,由节点(顶点)和边组成。

  • 应用场景:社交网络、路径规划(Dijkstra算法)、推荐系统。

(4)散列结构(哈希表)

  • 特点:通过哈希函数直接定位数据,理想情况下操作时间复杂度为O(1)。

  • 应用场景:字典、缓存系统(如Redis)、数据去重。

(5)其他特殊结构

  • 并查集:处理不相交集合的合并与查询。

  • 跳表:链表的多层索引结构,支持高效搜索。

4.总结

数据结构是计算机科学的基石,它决定了程序的效率和可维护性。掌握常见结构(如数组、链表、树、图)的特性和适用场景,是写出高性能代码的关键。学习时建议结合算法(如排序、搜索)实践,深入理解其设计思想。

二,LinkedList集合

1.LinkedList集合的基本概念

LinkedList是 Java 集合框架中List接口的实现类之一,基于双向链表数据结构实现,允许存储null元素,且保留插入顺序。

2.LinkedList 的数据结构特点

  • 每个节点包含:
    • item:存储的数据元素。
    • prev:指向前驱节点的引用。
    • next:指向后继节点的引用。
  • 头节点(first)和尾节点(last):链表的起点和终点,便于首尾操作。

3.LinkedList 的常用方法

3.1. 实现 List 接口的方法

方法描述
add(E e)向链表尾部添加元素,返回true
add(int index, E element)在指定索引处插入元素(需遍历链表,效率较低)
get(int index)获取指定索引处的元素(需遍历链表,效率较低)
set(int index, E element)修改指定索引处的元素,返回旧值
remove(int index)删除指定索引处的元素,返回被删除的元素
size()返回链表中元素的个数
contains(Object o)判断链表是否包含指定元素(需遍历链表)
import java.util.LinkedList;

public class Main2 {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("aaa");
        list.add("bbb");
        list.add(1,"ccc");
        String r=list.get(2);//返回“bbb”
        System.out.println(r);
        for (String bookName : list) {
            System.out.println(bookName);
        }//返回“aaa”,"ccc","bbb"
        int a=list.size();
        System.out.println(a);//返回3
        list.set(2,"ddd");
        for (String bookName : list) {
            System.out.println(bookName);
        }//返回“aaa”,"ccc","ddd"
    }
}

3.2. 作为双端队列的方法

  • 头部操作

    方法描述
    addFirst(E e)在头部插入元素
    getFirst()获取头部元素(链表为空时抛异常)
    peekFirst()获取头部元素(链表为空时返回null
    removeFirst()删除并返回头部元素(链表为空时抛异常)
    pollFirst()删除并返回头部元素(链表为空时返回null
  • 尾部操作

    方法描述
    addLast(E e)在尾部插入元素(等价于add(e)
    getLast()获取尾部元素(链表为空时抛异常)
    peekLast()获取尾部元素(链表为空时返回null
    removeLast()删除并返回尾部元素(链表为空时抛异常)
    pollLast()删除并返回尾部元素(链表为空时返回null
import java.util.LinkedList;
public class Main2 {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.addFirst("ddd");//将“ddd”插入头部
        System.out.println(list.getFirst());//返回”ddd“
        System.out.println(list.removeFirst());//删除ddd并返回“ddd”
    }
}

4.LinkedList 的遍历方式

迭代器(Iterator)

Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String element = it.next();
    // 处理元素
}

增强 for 循环

for (String element : list) {
    // 处理元素
}

列表迭代器(ListIterator)

ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
    String element = lit.next();
    if (element.equals("B")) {
        lit.set("C"); // 修改元素
    }
}

5.总结

优点缺点
1. 高效的增删操作(尤其是头尾)1. 随机访问效率低(O (n))
2. 支持双端队列操作2. 内存占用较高
3. 灵活的链表结构

三.set系列集合 

1.Set 集合的基本概念

  • 定义Set是 Java 集合框架中的无序(存储顺序与取出顺序无关)、不允许重复元素的集合接口,主要实现类包括HashSetTreeSetLinkedHashSet
  • 核心特性
    1. 唯一性:通过equals()方法判断元素是否重复,若重复则仅保留一个。
    2. 无序性:不同实现类对 “无序” 的定义不同(如HashSet基于哈希表,无固定顺序;TreeSet按自然顺序或定制顺序排序)。
    3. 不支持索引:无法通过索引访问元素,只能通过迭代器或增强 for 循环遍历。

2.Set 接口的常用方法

方法描述
boolean add(E e)添加元素,若元素已存在则返回false(不执行添加)
boolean remove(Object o)删除指定元素,存在则返回true
boolean contains(Object o)判断是否包含指定元素(通过equals()比较)
int size()返回集合中元素的个数
boolean isEmpty()判断集合是否为空
Iterator<E> iterator()返回迭代器,用于遍历集合元素
void clear()清空集合所有元素
import java.util.HashSet;
public class Main2 {
    public static void main(String[] args) {
        HashSet<String> set=new HashSet<>();
        set.add("aaa");
        set.add("bbb");
        set.add("ccc");//添加“aaa”,"bbb","ccc"
        set.remove("aaa");//删除“aaa”
        System.out.println(set.contains("bbb"));//存在“bbb”,返回true
        System.out.println(set.size());//返回2
        System.out.println(set.isEmpty());//集合中有元素,返回“false”
    }
}

3.set集合的遍历 

3.1增强 for 循环

Set<String> set = new HashSet<>(Arrays.asList("a", "b", "c"));
for (String element : set) {
    System.out.print(element + " "); // 输出顺序不确定(HashSet无序)
}

3.2迭代器遍历

Iterator<String> it = set.iterator();
while (it.hasNext()) {
    String element = it.next();
    // 处理元素
}

 

四.HashSet集合

1. 数据结构与原理

  • 底层实现:基于哈希表(本质是HashMap,元素存储为键,值统一为PRESENT常量)。
  • 唯一性保证
    1. 先通过元素的hashCode()计算哈希值,确定存储位置(桶)。
    2. 若桶中无元素,直接存入;若有元素,通过equals()比较是否重复,重复则不存储。
  • 无序性:元素的存储顺序由哈希值决定,与插入顺序无关。
  • 适用场景:需要快速判断元素是否存在(contains()时间复杂度接近O(1)),无序且允许null的场景。

2.构造方法

HashSet<E> set = new HashSet<>(); // 空集合,默认初始容量16,负载因子0.75
HashSet<E> setWithCapacity = new HashSet<>(initialCapacity); // 指定初始容量
HashSet<E> setFromCollection = new HashSet<>(collection); // 基于现有集合创建

五.TreeSet集合 

1. 数据结构与原理

  • 底层实现:基于红黑树,元素按自然顺序定制 Comparator 顺序排序。
  • 唯一性保证:通过compareTo()(自然顺序)或Comparator.compare()(定制顺序)判断元素是否相等,若比较结果为 0 则视为重复,不存储。
  • 有序性:元素始终按排序规则排列,迭代时按顺序输出。
  • 适用场景:需要元素自动排序、范围查询(如headSettailSet)的场景。

2. 构造方法

TreeSet<E> set = new TreeSet<>(); // 自然排序(元素需实现Comparable接口)
TreeSet<E> setWithComparator = new TreeSet<>(Comparator comparator); // 定制排序
TreeSet<E> setFromCollection = new TreeSet<>(collection); // 基于现有集合创建(自动排序)

3.TreeSet集合的特殊遍历 

TreeSet<Integer> treeSet = new TreeSet<>(Arrays.asList(3, 1, 2));
// 正序遍历(自然顺序)
for (Integer num : treeSet) {
    System.out.print(num + " "); // 输出:1 2 3
}
// 逆序遍历
Iterator<Integer> descendingIt = treeSet.descendingIterator();
while (descendingIt.hasNext()) {
    System.out.print(descendingIt.next() + " "); // 输出:3 2 1
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值