学习Java中的数据结构及API这一篇就够了

Java中的数据结构及API

  • 1. 线性表
    • 1-1. 顺序表
      • Array数组
      • ArrayList集合
    • 1-2. 链表
      • 自定义链表
      • LinkedList
  • 2. 队列
    • 2-1. ArrayDeque
    • 2-2. LinkedList
    • 2-3. 区别
  • 3. 栈
    • 3-1. ArrayDeque
    • 3-2. LinkedList
  • 4. 堆
    • 4-1. PriorityQueue
    • 4-2. 小顶堆
    • 4-3. 大顶堆
    • 4-4. PriorityQueue的API
  • 5. 树
    • 5-1. 二叉树定义
  • 6. 图
    • 6-1. 图定义

学习Java中的数据结构及API这一篇就够了_第1张图片

1. 线性表

1-1. 顺序表

顺序表是指用一组地址连续的存储单元依次存储数据元素的线性结构。

Array数组

Array是固定大小的顺序表,定义为:

int[] arr = new int[] {1,2,3,4,5};

ArrayList集合

ArrayList是可以动态扩容的顺序表。

学习Java中的数据结构及API这一篇就够了_第2张图片
学习Java中的数据结构及API这一篇就够了_第3张图片

1-2. 链表

自定义链表

单链表节点

public class ListNode {
     int val; // 值
     ListNode next; // 指向下一个节点
     ListNode(int x) { val = x; }
}

双链表节点

public class ListNode {
     int val; // 值
     ListNode next; // 指向下一个节点
     ListNode pre; // 指向上一个节点
     ListNode(int x) { val = x; }
}

LinkedList

学习Java中的数据结构及API这一篇就够了_第4张图片
此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。

2. 队列

QueueDeque接口都是队列的数据结构

  • Queue是普通队列的接口
  • Deque是双端队列的接口

学习Java中的数据结构及API这一篇就够了_第5张图片


学习Java中的数据结构及API这一篇就够了_第6张图片

2-1. ArrayDeque

ArrayDeque是Java集合框架中的一个双端队列(Deque)实现类。它基于数组实现,可以在两端高效地插入和删除元素。

实现原理

  • ArrayDeque内部维护了一个循环数组,通过两个指针(frontrear)来标记队列的头部和尾部。当向队列中添加元素时,rear指针向后移动;当从队列中删除元素时,front指针向后移动。如果数组满了,ArrayDeque会自动扩容。
  • ArrayDeque的底层数组长度是2的幂次方,这样可以通过位运算来实现循环队列的操作,提高性能。

2-2. LinkedList

LinkedList也是Java集合框架中的一个双端队列(Deque)实现类。它基于链表实现,可以在任意位置高效地插入和删除元素。

实现原理

  • LinkedList内部使用双向链表来存储元素。每个节点都包含一个前驱节点和一个后继节点的引用。通过这种方式,LinkedList可以在任意位置高效地插入和删除元素。
  • LinkedList还有一个头结点和尾节点的引用,分别表示链表的头部和尾部。通过这两个引用,可以快速访问到链表的第一个和最后一个元素。

2-3. 区别

  1. ArrayDeque不允许null元素,而LinkedList则允许null元素。
  2. 如果是使用栈/队列操作,ArrayList明显快于LinkedList
  3. LinkedList实现了List接口 ,可以将值插入到指定位置处。

3. 栈

3-1. ArrayDeque

ArrayDeque可以当作栈来使用

3-2. LinkedList

LinkedList可以当作栈来使用

4. 堆

堆分为大根堆和小根堆:

学习Java中的数据结构及API这一篇就够了_第7张图片

  • 堆中某个节点的值总是不大于或不小于其父节点的值
  • 堆总是一棵完全二叉树

4-1. PriorityQueue

  • Java集合框架中提供了PriorityQueuePriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueue。

学习Java中的数据结构及API这一篇就够了_第8张图片

4-2. 小顶堆

案例:

PriorityQueue队列默认是小顶堆,如果需要大顶堆需要用户提供比较器。

import java.util.PriorityQueue;
 
public class Test2 {
    public static void main(String[] args) {
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
        priorityQueue.offer(12);
        priorityQueue.offer(3);
        priorityQueue.offer(24);
        System.out.println(priorityQueue.peek());
        System.out.println(priorityQueue.poll());
        System.out.println(priorityQueue.peek());
    }
}

输出结果:

学习Java中的数据结构及API这一篇就够了_第9张图片

4-3. 大顶堆

如果需要大顶堆需要用户提供比较器。提供比较器的两种写法如下:

方法一: 定义一个类,使这个类实现Comparator接口

import java.util.Comparator;
import java.util.PriorityQueue;
 
class IntCmp implements Comparator<Integer>{
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2-o1;
    }
}
public class Test2 {
    public static void main(String[] args) {
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new IntCmp());
        priorityQueue.offer(12);
        priorityQueue.offer(3);
        priorityQueue.offer(24);
        System.out.println(priorityQueue.peek());
        System.out.println(priorityQueue.poll());
        System.out.println(priorityQueue.peek());
    }
}

学习Java中的数据结构及API这一篇就够了_第10张图片

方法二: 重写比较器

import java.util.Comparator;
import java.util.PriorityQueue;
 
public class Test2 {
    public static void main(String[] args) {
       PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((a, b) -> {
      		return b - a;
           });
        priorityQueue.offer(12);
        priorityQueue.offer(3);
        priorityQueue.offer(24);
        System.out.println(priorityQueue.peek());
        System.out.println(priorityQueue.poll());
        System.out.println(priorityQueue.peek());
    }
}

学习Java中的数据结构及API这一篇就够了_第11张图片

4-4. PriorityQueue的API

学习Java中的数据结构及API这一篇就够了_第12张图片

5. 树

树又分为:二叉树、二叉搜索树、平衡二叉树、红黑树、B树等。

5-1. 二叉树定义

public class TreeNode{
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x) {val = x;}
}

6. 图

6-1. 图定义

图有节点和边组成,实现的方式有:

Map<Integer, List<int[]>> graph = new HashMap();

你可能感兴趣的:(JavaSE,学习,java,数据结构)