Java常见基础数据结构

yizhihongxing

Java常见基础数据结构攻略

Java是一种面向对象的编程语言,拥有丰富的数据结构,大多数基础数据结构都包含在Java API中。在本文中,我们将讨论Java中常见的基础数据结构,包括数组、链表、栈、队列、集合和映射。我们将探讨每种数据结构的定义、用法和基本操作,并提供两个示例说明。

数组

数组是Java中最基本的数据结构之一。它是一个有序的集合,可以包含任何类型的元素。在使用数组之前,必须先定义它的大小。以下是声明和初始化一个整数类型数组的语法:

int[] arr = new int[10];

下面以求和为例,介绍数组的基本操作。

访问数组元素

数组中的每个元素都有一个唯一的索引或位置,可以使用数组名称和元素的索引来访问。Java中的数组索引从0开始,因此第一个元素的索引为0。以下是一个例子:

int[] arr = {1, 2, 3, 4, 5};
int sum = arr[0] + arr[1] + arr[2] + arr[3] + arr[4];
System.out.println(sum); // 输出15

更改数组元素

可以使用数组名称和元素的索引来更改数组中的元素。以下是一个例子:

int[] arr = {1, 2, 3, 4, 5};
arr[2] = 6;
System.out.println(Arrays.toString(arr)); // 输出 [1, 2, 6, 4, 5]

数组长度

可以使用数组的length属性获取数组的长度。以下是一个例子:

int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr.length); // 输出 5

链表

链表是由一系列节点组成的。每个节点包含一个元素和一个指向下一个节点的引用。最后一个节点通常包含一个空引用。以下是一个定义节点的Java类:

class Node<T> {
    T data;
    Node<T> next;

    public Node(T data) {
        this.data = data;
    }
}

下面以遍历链表为例,介绍链表的基本操作。

遍历链表

遍历链表是指访问链表中的所有节点。可以使用循环遍历每个节点,直到到达链表的末尾。以下是一个例子:

Node<String> head = new Node<>("A");
head.next = new Node<>("B");
head.next.next = new Node<>("C");

Node<String> current = head;
while (current != null) {
    System.out.print(current.data + " ");
    current = current.next;
}
// 输出A B C

插入节点

可以在链表的任何位置插入一个新节点。插入节点之前,必须找到插入位置的前一个节点。以下是一个插入节点的例子:

Node<String> head = new Node<>("A");
head.next = new Node<>("B");
head.next.next = new Node<>("C");

Node<String> newNode = new Node<>("D");
newNode.next = head.next;
head.next = newNode;

Node<String> current = head;
while (current != null) {
    System.out.print(current.data + " ");
    current = current.next;
}
// 输出 A D B C

栈是一种后进先出(LIFO)的数据结构。栈有两个基本操作:推入元素和弹出元素。以下是一个定义栈的Java类:

class Stack<T> {
    private List<T> list = new ArrayList<>();

    public void push(T item) {
        list.add(item);
    }

    public T pop() {
        if (list.isEmpty()) {
            throw new RuntimeException("Stack is Empty!");
        }
        return list.remove(list.size() - 1);
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }

    public int size() {
        return list.size();
    }
}

下面以十进制转二进制为例,介绍栈的基本操作。

推入元素

可以使用push方法将元素推入栈中。以下是一个十进制转二进制的例子:

int decimal = 10;
Stack<Integer> stack = new Stack<>();

while (decimal > 0) {
    int remainder = decimal % 2;
    stack.push(remainder);
    decimal /= 2;
}

while (!stack.isEmpty()) {
    System.out.print(stack.pop());
}
// 输出 1010

弹出元素

可以使用pop方法将栈顶元素弹出栈。以下是一个计算基本表达式的例子:

String expression = "2 + 3 * 4";
Stack<Integer> stack = new Stack<>();

for (String token : expression.split(" ")) {
    if (token.equals("+")) {
        int b = stack.pop();
        int a = stack.pop();
        stack.push(a + b);
    } else if (token.equals("*")) {
        int b = stack.pop();
        int a = stack.pop();
        stack.push(a * b);
    } else {
        stack.push(Integer.parseInt(token));
    }
}

System.out.println(stack.pop()); // 输出 14

队列

队列是一种先进先出(FIFO)的数据结构。队列有两个基本操作:入队和出队。以下是一个定义队列的Java类:

class Queue<T> {
    private List<T> list = new ArrayList<>();

    public void enqueue(T item) {
        list.add(item);
    }

    public T dequeue() {
        if (list.isEmpty()) {
            throw new RuntimeException("Queue is Empty!");
        }
        return list.remove(0);
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }

    public int size() {
        return list.size();
    }
}

下面以BFS为例,介绍队列的基本操作。

入队元素

可以使用enqueue方法将元素入队。以下是一个BFS(广度优先搜索)的例子:

class Node {
    List<Node> neighbors = new ArrayList<>();
    String label;

    public Node(String label) {
        this.label = label;
    }
}

Node graph = new Node("A");
graph.neighbors.add(new Node("B"));
graph.neighbors.add(new Node("C"));
graph.neighbors.get(0).neighbors.add(new Node("D"));
graph.neighbors.get(0).neighbors.add(new Node("E"));

Queue<Node> queue = new Queue<>();
Set<Node> visited = new HashSet<>();

queue.enqueue(graph);
visited.add(graph);

while (!queue.isEmpty()) {
    Node current = queue.dequeue();
    System.out.print(current.label + " ");

    for (Node neighbor : current.neighbors) {
        if (!visited.contains(neighbor)) {
            queue.enqueue(neighbor);
            visited.add(neighbor);
        }
    }
}
// 输出 A B C D E

出队元素

可以使用dequeue方法将队头元素出队。以下是一个打印队列中的所有元素的例子:

Queue<String> queue = new Queue<>();
queue.enqueue("A");
queue.enqueue("B");
queue.enqueue("C");

while (!queue.isEmpty()) {
    System.out.print(queue.dequeue() + " ");
}
// 输出 A B C

集合

集合是一种不包含重复元素的数据结构。Java API提供了Set接口,可以用来实现集合。以下是一个使用Set的例子:

Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
set.add("B"); // 重复元素

System.out.println(set); // 输出[A, B, C]

可以使用Stream API来操作集合。以下是一个过滤集合中的奇数元素并求和的例子:

Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
int sum = set.stream()
    .filter(n -> n % 2 == 0)
    .mapToInt(Integer::intValue)
    .sum();

System.out.println(sum); // 输出6

映射

映射是一种将键和值进行映射的数据结构。Java API提供了Map接口,可以用来实现映射。以下是一个使用Map的例子:

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

System.out.println(map.get("B")); // 输出 2

可以使用Stream API来操作键或值的集合。以下是一个过滤映射中的奇数值并求和的例子:

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

int sum = map.values().stream()
    .filter(n -> n % 2 == 0)
    .mapToInt(Integer::intValue)
    .sum();

System.out.println(sum); // 输出2

总结

在Java中,有很多种不同的数据结构可供选择。本文介绍了Java中的常见基础数据结构,包括数组、链表、栈、队列、集合和映射。掌握这些数据结构可以让我们在编写Java程序时更加高效和灵活。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java常见基础数据结构 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月17日

相关文章

  • 考研数据结构模板:顺序表、链表、栈、队列

    考研数据结构模板:顺序表、链表、栈、队列 前言 代码风格偏向于考研风格而非算法竞赛风格。 代码实现参考《2024数据结构王道复习指导》。 注释详细、保证看懂。 下面是已实现的数据结构模板: 顺序表SeqList 链表LinkList 双链表DLinkList 顺序栈SeqStack 循环顺序队列CircleQueue 链队列LinkQueue 顺序表SeqL…

    算法与数据结构 2023年4月17日
    00
  • Python实现的数据结构与算法之基本搜索详解

    Python实现的数据结构与算法之基本搜索详解 在计算机科学中,搜索指的是在一组数据中找到目标数据的过程。搜索算法是解决各种问题的关键,即使是拼图游戏和图像识别也要依赖搜索算法。本文将介绍基本的搜索算法,包括线性/顺序搜索、二分搜索和广度优先搜索。 线性/顺序搜索 顺序搜索又称为线性搜索,它遍历整个数据集以查找特定元素。顺序搜索可以用于查找未排序的列表。该算…

    数据结构 2023年5月17日
    00
  • 数据结构之AVL树详解

    数据结构之AVL树详解 什么是AVL树? AVL树是一种自平衡的二叉搜索树,它的名称来自它的发明者Adelson-Velsky和Landis。在AVL树中,每个节点的左右子树的高度差(平衡因子)最多为1,否则需要通过旋转操作来重新平衡树。AVL树基于二叉搜索树,所以它包含了二叉搜索树的所有特性,同时也保证了树的高度始终处于对数级别,因此它的查找、插入、删除都…

    数据结构 2023年5月16日
    00
  • C语言链表详解及代码分析

    C语言链表详解及代码分析 简介 链表是一种常见的数据结构,它主要用于存储线性数据结构,可以动态地进行添加和删除操作。在C语言中,链表可以通过链式存储结构来实现。本篇攻略将详细讲解C语言链表的实现,包括定义链表、节点、添加节点、删除节点等操作。 链表的定义 链表由一个个节点组成,每个节点包含两个信息:数据和指向下一个节点的指针。在C语言中,可以通过结构体实现每…

    数据结构 2023年5月17日
    00
  • Python数据结构之二叉排序树的定义、查找、插入、构造、删除

    Python数据结构之二叉排序树 一、定义 二叉排序树(Binary Search Tree,BST),也称为二叉查找树或二叉搜索树,是一种基于二叉树的数据结构,其中每个节点都包含一个键值,且满足: 左子树中所有节点的键值均小于当前节点; 右子树中所有节点的键值均大于当前节点; 这是一种自平衡的数据结构,可以快速地进行查找、插入、删除等操作。 二、查找 查找…

    数据结构 2023年5月17日
    00
  • Java数据结构之稀疏数组的实现与应用

    Java数据结构之稀疏数组的实现与应用 什么是稀疏数组 稀疏数组是一种刻画二维数组中许多元素值都为0的特殊数据结构。它可以提高存储空间的利用率,实现对数据的压缩和优化,减少不必要的处理,提升程序的运行效率。 在稀疏数组中,只有非零元素被存储,而这些元素的索引信息和具体数值的信息都会被记录下来。 稀疏数组的实现与应用 实现步骤 创建原始的二维数组,存入多个元素…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构常见面试问题整理

    JavaScript数据结构常见面试问题整理 介绍 JavaScript是一种广泛使用的脚本语言,用于在Web上创建动态效果,验证表单,增强用户体验等。它是一种高级语言,使用许多数据结构来存储和处理数据。在面试中,考官通常会问一些与JavaScript数据结构相关的问题,这篇文章将整理一些常见的面试问题和他们的解答,以便帮助你做好准备。 常见问题 1. 什么…

    数据结构 2023年5月17日
    00
  • Oracle 11g Release (11.1) 索引底层的数据结构

    我来为您详细讲解“Oracle 11g Release (11.1) 索引底层的数据结构”的完整攻略。 索引底层数据结构简介 在Oracle数据库中,索引底层数据结构是B树(B-Tree)。B树是一种常用的多路平衡查找树,它的特点是每个节点都有多个子节点,能够自动调整高度,保持所有叶子节点到根节点的距离相等。在B树中,每个节点都有一个关键字列表和一个指向子节…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部