Java常见基础数据结构

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日

相关文章

  • go语言数据结构之前缀树Trie

    前缀树Trie 前缀树Trie是一种树形数据结构,被用于快速查找内存中的字符串数据。它非常适合存储大量的字符串,并且能够非常快速的查找以一个指定的字符串前缀开头的全部字符串。 相关术语 在学习前缀树Trie之前,需要掌握一下相关术语: 根节点:Trie树的根节点,代表空字符串。 边:连接两个节点的线,代表一个字符。 节点:表示一个字符串,可能是某个字符串的结…

    数据结构 2023年5月17日
    00
  • Java数据结构之线性表

    Java数据结构之线性表完整攻略 什么是线性表 线性表是n个数据元素的有限序列,其中数据元素的类型相同。线性表中含有首元素和末元素。若表中只有一个数据元素,则该数据元素既是首元素又是末元素,这个数据元素成为线性表的唯一元素。 线性表的基本操作 初始化操作 initList(List L):建立一个空的线性表L 插入操作 insert(List L, int …

    数据结构 2023年5月17日
    00
  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    C语言数据结构顺序表中的增删改(头插头删)教程示例详解 什么是顺序表? 顺序表是一种用数组实现的线性表,所有元素存储在一块连续的存储区中。顺序表的操作包括插入、删除、查找等。 常用的顺序表操作 增加元素 删除元素 修改元素 查找元素 以下以头插和头删为例,讲解如何在C语言数据结构顺序表中实现这些操作。 头插操作 头插的实现首先需要考虑插入位置的下标,由于是头…

    数据结构 2023年5月17日
    00
  • Lua中使用table实现的其它5种数据结构

    Lua中使用table可以实现多种数据结构,除了Lua原生支持的数组、哈希表之外,我们还可以用table来实现其他五种数据结构,这些数据结构包括集合(Set)、队列(Queue)、双端队列(deque)、堆栈(stack)以及链表(List)。 Set 集合数据结构中的元素是无序的、不重复的。使用table来实现集合数据结构,可以将元素作为table的key…

    数据结构 2023年5月17日
    00
  • C语言 数据结构中栈的实现代码

    下面是关于C语言中栈的实现代码的详细攻略: 栈的概念 栈是一种只能在一端进行插入或删除操作的线性数据结构,它具有后进先出(Last In First Out, LIFO)的特点。通俗的说,就像大家在平时搭积木那样,搭积木的时候总是从最下面开始往上搭,拿积木的时候总是从最上面的积木开始拿起,栈就是这么一个先进后出的数据结构。 栈的实现方法 栈的实现方法比较多,…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之栈和队列

    Java数据结构学习之栈和队列 什么是栈 栈(stack)是一种线性数据结构,它只能在一端进行插入和删除操作,这一端被称作栈顶(top)。栈的特点是先进后出(FILO,First-In-Last-Out),即最后进入的元素最先被删除。 栈的实现方式 栈可以使用数组或链表来实现。使用数组实现的栈称作顺序栈,使用链表实现的栈称作链式栈。以下是顺序栈的 Java …

    数据结构 2023年5月17日
    00
  • Go语言数据结构之插入排序示例详解

    Go语言数据结构之插入排序示例详解 什么是插入排序? 插入排序是一种简单直观的排序方法,其基本思想是将一个待排序的序列分成已排序和未排序两部分,从未排序的部分中选择一个元素插入到已排序部分的合适位置,直到所有元素都被插入到已排序部分为止。 插入排序示例 示例1 我们来看一个数字序列的插入排序示例: package main import "fmt&…

    数据结构 2023年5月17日
    00
  • 数据结构Typescript之哈希表实现详解

    数据结构Typescript之哈希表实现详解 什么是哈希表 哈希表(Hash Table)又称为散列表,是一种根据关键字(Key)直接访问内存存储位置的数据结构。通俗的解释就是利用一个哈希函数(Hash Function)将关键字映射到哈希表中的一个位置(索引)来进行访问,从而快速、高效地查找、插入、删除元素。 哈希表的实现 本文将介绍使用Typescrip…

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