2

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

 7 months ago
source link: https://www.51cto.com/article/781491.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

作者:微技术 2024-02-19 16:23:11
一起来了解一下Java中常见的数据结构及示例讲解都有哪些。

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

05fdddb98dc1ef24f546664461ecab4df500bf.jpg

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<Integer> 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<Integer> 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<String, Integer> 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<Integer> 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.left = insertNode(node.left, val);
        } else 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<List<Integer>> 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<Integer> queue = new LinkedList<>();




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




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




            List<Integer> 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<Integer> 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<Integer> 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()方法逐个弹出并移除堆中的元素。

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

责任编辑:华轩 来源: 微技术之家

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK