Java中常见的数据结构及示例讲解

2024年 2月 19日 88.3k 0

Java中常见的数据结构包括以下几种:

1.数组(Array):是一种线性数据结构,用于存储相同类型的元素,通过索引访问和修改元素。

2.链表(Linked List):也是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的引用。

3.栈(Stack):是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。

4.队列(Queue):是一种先进先出(FIFO)的数据结构,可以在队尾插入元素,在队头删除元素。

5.哈希表(HashMap):是一种使用键-值对存储数据的数据结构,通过哈希函数将键映射到一个索引,可以快速访问和修改数据。

6.集合(Set):是一种不允许重复元素的数据结构,常见的实现类有HashSet和TreeSet。

7.列表(List):是一种有序的数据结构,允许重复元素,常见的实现类有ArrayList和LinkedList。

8.树(Tree):是一种非线性数据结构,由节点和边组成,每个节点可以有多个子节点,常见的实现有二叉树、AVL树等。

9.图(Graph):是一种由节点和边组成的非线性数据结构,节点之间可以有多个连接关系。

10.堆(Heap):是一种特殊的树形数据结构,用于高效地找到最大或最小值。

除了上述常见的数据结构,Java还提供了许多其他数据结构的实现,如优先队列、双向链表、散列表等,可以根据具体的需求选择适合的数据结构。

接下来,我门通过一些示例代码来介绍这些常见的数据结构。下面是一些简单的示例代码:

1.数组(Array):

int[] numbers = new int[5]; // 创建一个长度为5的整型数组
numbers[0] = 1; // 设置第一个元素的值为1
int element = numbers[2]; // 获取第三个元素的值
System.out.println(element); // 输出结果:0(默认值,因为没有赋值)

2.链表(Linked List):

// 创建链表节点
class ListNode {
    int value;
    ListNode next;
    ListNode(int value) {
        this.value = value;
        this.next = null;
    }
}




// 创建链表
ListNode head = new ListNode(1); // 头节点
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);




head.next = node2;
node2.next = node3;




// 遍历链表
ListNode current = head;
while (current != null) {
    System.out.println(current.value);
    current = current.next;
}

3.栈(Stack):

import java.util.Stack;
Stack stack = new Stack();
stack.push(1); // 添加元素到栈顶
stack.push(2);
stack.push(3);




int topElement = stack.peek(); // 获取栈顶元素(不移除)
System.out.println(topElement); // 输出结果:3




int poppedElement = stack.pop(); // 弹出栈顶元素
System.out.println(poppedElement); // 输出结果:3

4.队列(Queue):

import java.util.LinkedList;
import java.util.Queue;


Queue queue = new LinkedList();
queue.offer(1); // 添加元素到队尾
queue.offer(2);
queue.offer(3);


int frontElement = queue.peek(); // 获取队头元素(不移除)
System.out.println(frontElement); // 输出结果:1
int dequeuedElement = queue.poll(); // 出队队头元素
System.out.println(dequeuedElement); // 输出结果:1

当谈到哈希和集合这两个概念时,通常会涉及到哈希表和集合数据结构。

5.哈希表(Hash Table)示例:

import java.util.HashMap;


HashMap hashMap = new HashMap();
hashMap.put("apple", 1);   // 向哈希表中插入键值对
hashMap.put("banana", 2);
hashMap.put("orange", 3);


int value = hashMap.get("banana");  // 通过键获取对应的值
System.out.println(value);  // 输出结果:2


boolean containsKey = hashMap.containsKey("apple");  // 检查哈希表中是否包含某个键
System.out.println(containsKey);  // 输出结果:true


hashMap.remove("orange");  // 移除指定键的键值对


for (String key : hashMap.keySet()) {
    int val = hashMap.get(key);
    System.out.println(key + ": " + val);
}

在上面的例子中,我们使用HashMap类来实现哈希表。我们插入了几个键值对,然后通过键来获取对应的值,检查是否存在某个键,并移除指定键的键值对。还展示了如何遍历哈希表的键集合,并获取每个键对应的值。

6.集合(Set)示例:

import java.util.HashSet;


HashSet set = new HashSet();
set.add(1);   // 向集合中添加元素
set.add(2);
set.add(3);


boolean contains = set.contains(2);  // 检查集合中是否包含某个元素
System.out.println(contains);  // 输出结果:true


set.remove(3);  // 从集合中移除指定元素


for (Integer num : set) {
    System.out.println(num);
}

在上面的例子中,我们使用HashSet类来实现集合。我们添加了一些元素,检查集合是否包含某个元素,并移除指定的元素。还展示了如何迭代集合中的元素并进行输出。

哈希表和集合是常用的数据结构,它们提供了高效的存储和查找操作。通过使用哈希函数来计算键的散列值,它们能够快速地定位和访问元素。在实际编程中,你可以根据具体的需求选择使用适当的哈希表或集合实现类,并根据需要调用相应的方法

7.树(Tree)示例:

BinarySearchTree:
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;




    public TreeNode(int val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}




class BinarySearchTree {
    private TreeNode root;




    public void insert(int val) {
        root = insertNode(root, val);
    }




    private TreeNode insertNode(TreeNode node, int val) {
        if (node == null) {
            return new TreeNode(val);
        }




        if (val  node.val) {
            node.right = insertNode(node.right, val);
        }




        return node;
    }




    public boolean search(int val) {
        return searchNode(root, val);
    }




    private boolean searchNode(TreeNode node, int val) {
        if (node == null) {
            return false;
        }




        if (val == node.val) {
            return true;
        } else if (val < node.val) {
            return searchNode(node.left, val);
        } else {
            return searchNode(node.right, val);
        }
    }
}


BinarySearchTree bst = new BinarySearchTree();
bst.insert(5);
bst.insert(2);
bst.insert(8);
bst.insert(1);




System.out.println(bst.search(2)); // 输出结果:true,搜索值为2的节点
System.out.println(bst.search(10)); // 输出结果:false,搜索值为10的节点

8.图(Graph)示例:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;




class Graph {
    private int vertices; // 图中的顶点数
    private List adjacencyList; // 邻接表表示图




    public Graph(int vertices) {
        this.vertices = vertices;
        adjacencyList = new ArrayList(vertices);
        for (int i = 0; i < vertices; i++) {
            adjacencyList.add(new ArrayList());
        }
    }




    public void addEdge(int source, int destination) {
        adjacencyList.get(source).add(destination);
        adjacencyList.get(destination).add(source);
    }




    public void breadthFirstSearch(int startVertex) {
        boolean[] visited = new boolean[vertices];
        Queue queue = new LinkedList();




        visited[startVertex] = true;
        queue.offer(startVertex);




        while (!queue.isEmpty()) {
            int currentVertex = queue.poll();
            System.out.print(currentVertex + " ");




            List neighbors = adjacencyList.get(currentVertex);
            for (int neighbor : neighbors) {
                if (!visited[neighbor]) {
                    visited[neighbor] = true;
                    queue.offer(neighbor);
                }
            }
        }
    }
}




Graph graph = new Graph(6);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
graph.addEdge(3, 5);




graph.breadthFirstSearch(0); // 从顶点0开始进行广度优先搜索

在上面的例子中,我们创建了一个简单的图,并使用邻接表来表示图的结构。然后,我们实现了广度优先搜索算法来遍历图中的顶点。

9.堆(Heap)示例:

import java.util.PriorityQueue;


PriorityQueue minHeap = new PriorityQueue(); // 创建一个最小堆
minHeap.offer(5); // 向堆中添加元素
minHeap.offer(2);
minHeap.offer(8);
minHeap.offer(1);


int minElement = minHeap.peek(); // 获取堆顶元素(最小值)
System.out.println(minElement); // 输出结果:1


while (!minHeap.isEmpty()) {
    int currentElement = minHeap.poll(); // 弹出并移除堆顶元素
    System.out.println(currentElement);
}

10. 列表示例:

import java.util.ArrayList;


ArrayList myList = new ArrayList();
myList.add(1);   // 在列表末尾添加元素
myList.add(2);
myList.add(3);


System.out.println(myList);   // 输出结果:[1, 2, 3]


myList.remove(1);   // 移除指定索引位置的元素
System.out.println(myList);   // 输出结果:[1, 3]


int element = myList.get(0);   // 获取指定索引位置的元素
System.out.println(element);   // 输出结果:1


for (int i = 0; i < myList.size(); i++) {   // 遍历列表中的元素
    System.out.println(myList.get(i));
}

在上面的例子中,我们使用优先队列实现了一个最小堆。我们向堆中添加一些元素,然后通过peek()方法获取最小的元素。最后,我们使用poll()方法逐个弹出并移除堆中的元素。

这些示例代码展示了如何使一些常见数据结构的基本用法。你可以根据实际需求对代码进行修改和扩展。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论