Java 数据结构和集合框架

数据结构

数据结构是计算机科学中用于组织、管理数据的一种特殊方式,它能够有效地存储和检索数据。在Java中,数据结构通常通过集合框架(Collection Framework)来实现,它提供了一系列接口和类来帮助我们高效地处理数据。

数组(Arrays)

数组(Arrays)是一种基本的数据结构,可以存储固定大小的相同类型的元素。

int[] array = new int[5];
  • 特点: 固定大小,存储相同类型的元素。
  • 优点: 随机访问元素效率高。
  • 缺点: 大小固定,插入和删除元素相对较慢。

列表(Lists)

Java 提供了多种列表实现,如 ArrayList 和 LinkedList。

List<String> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();

ArrayList:

  • 特点: 动态数组,可变大小。
  • 优点: 高效的随机访问和快速尾部插入。
  • 缺点: 中间插入和删除相对较慢。

LinkedList:

  • 特点: 双向链表,元素之间通过指针连接。
  • 优点: 插入和删除元素高效,迭代器性能好。
  • 缺点: 随机访问相对较慢。

集合(Sets)

集合(Sets)用于存储不重复的元素,常见的实现有 HashSet 和 TreeSet。

Set<String> hashSet = new HashSet<>();
Set<Integer> treeSet = new TreeSet<>();

HashSet:

  • 特点: 无序集合,基于HashMap实现。
  • 优点: 高效的查找和插入操作。
  • 缺点: 不保证顺序。

TreeSet:

  • 特点:TreeSet 是有序集合,底层基于红黑树实现,不允许重复元素。
  • 优点: 提供自动排序功能,适用于需要按顺序存储元素的场景。
  • 缺点: 性能相对较差,不允许插入 null 元素。

映射(Maps)

映射(Maps)用于存储键值对,常见的实现有 HashMap 和 TreeMap。

Map<String, Integer> hashMap = new HashMap<>();
Map<String, Integer> treeMap = new TreeMap<>();

HashMap:

  • 特点: 基于哈希表实现的键值对存储结构。
  • 优点: 高效的查找、插入和删除操作。
  • 缺点: 无序,不保证顺序。

TreeMap:

  • 特点: 基于红黑树实现的有序键值对存储结构。
  • 优点: 有序,支持按照键的顺序遍历。
  • 缺点: 插入和删除相对较慢。

栈(Stack)

栈(Stack)是一种线性数据结构,它按照后进先出(Last In, First Out,LIFO)的原则管理元素。在栈中,新元素被添加到栈的顶部,而只能从栈的顶部移除元素。这就意味着最后添加的元素是第一个被移除的。

Stack<Integer> stack = new Stack<>();

Stack 类:

  • 特点: 代表一个栈,通常按照后进先出(LIFO)的顺序操作元素。

队列(Queue)

队列(Queue)遵循先进先出(FIFO)原则,常见的实现有 LinkedList 和 PriorityQueue。

Queue<String> queue = new LinkedList<>();

Queue 接口:

  • 特点: 代表一个队列,通常按照先进先出(FIFO)的顺序操作元素。
  • 实现类: LinkedList, PriorityQueue, ArrayDeque。

堆(Heap)

堆(Heap)优先队列的基础,可以实现最大堆和最小堆。

PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

树(Trees)

Java 提供了 TreeNode 类型,可以用于构建二叉树等数据结构。

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

图(Graphs)

图的表示通常需要自定义数据结构或使用图库,Java 没有内建的图类。

以上介绍的只是 Java 中一些常见的数据结构,实际上还有很多其他的数据结构和算法可以根据具体问题选择使用。

  • 选择合适的结构:了解每种数据结构的特点有助于选择最适合需求的那一种。
  • 性能考虑:不同的数据结构在插入、删除和查找操作上的性能差异很大。
  • 线程安全性:如果您的程序涉及多线程,考虑使用线程安全的集合。

集合框架

Java集合框架提供了各种各样的数据结构,包括列表(List)、集(Set)、映射(Map)等。这些数据结构遵循特定的接口定义,而具体的实现类则提供了不同的行为特性。

接口与实现
  • 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象

  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。

  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序,这些算法实现了多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

  1. Collection

    • Collection 是所有集合类的父接口。
    • Collection 下有两个主要的子接口:List 和 Set
  2. List

    • List 是一个有序的集合,允许重复元素。
    • 实现类包括:
      • ArrayList:基于动态数组实现,提供了随机访问元素的能力。
      • LinkedList:基于双向链表实现,适合频繁插入和删除操作。
      • Vector:线程安全的 ArrayList
      • Stack:继承自 Vector,提供了一个后进先出(LIFO)的栈结构。
  3. Set

    • Set 是一个不包含重复元素的集合。
    • 实现类包括:
      • HashSet:基于哈希表实现,插入和查找元素非常快。
      • LinkedHashSet:维护元素的插入顺序。
      • TreeSet:基于红黑树实现,自动排序。
  4. Queue

    • Queue 是一个先进先出(FIFO)的集合,主要用于处理队列操作。
    • 实现类包括:
      • ArrayDeque:基于数组的双端队列。
      • LinkedList:也可作为队列使用。
  5. Deque

    • Deque 是一个双端队列,可以从两端添加或移除元素。
    • 实现类包括:
      • ArrayDeque:高性能的双端队列实现。
      • LinkedList:也可以作为双端队列使用。
  6. Map

    • Map 是一个键值对集合,不允许重复的键。
    • 实现类包括:
      • HashMap:基于哈希表实现,提供了快速的查找。
      • LinkedHashMap:维护了元素的插入顺序。
      • TreeMap:基于红黑树实现,可以自动排序键。
      • Hashtable:线程安全的 HashMap
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class DataStructureDemo {
    public static void main(String[] args) {
        // 使用 ArrayList 存储并打印元素
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        for (String name : names) {
            System.out.println(name);
        }

        // 使用 HashSet 存储唯一的元素
        Set<String> uniqueNames = new HashSet<>();
        uniqueNames.add("Alice");
        uniqueNames.add("Bob");
        uniqueNames.add("Alice"); // 不会被添加,因为已经存在
        System.out.println(uniqueNames);

        // 使用 HashMap 存储键值对
        Map<String, Integer> ages = new HashMap<>();
        ages.put("Alice", 30);
        ages.put("Bob", 25);
        System.out.println(ages.get("Alice")); // 输出 Alice 的年龄
    }
}

集合是一个对象,可容纳其他对象的引用。集合接口声明对每一种类型的集合可以执行的操作。

集合框架的类和接口均在java.util包中。

任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值