Java 集合在实际业务系统中的建模应用:如何选择合适的集合类?

测试智商的网站 5小时前 阅读数 459 #在线测试

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

Java 集合在实际业务系统中的建模应用:如何选择合适的集合类?

前言

在实际的业务系统中,数据结构的选择往往会直接影响到系统的性能和可维护性。Java 提供了丰富的集合类,它们为不同的数据组织和操作提供了多种选择。例如,列表、集合、映射、队列和堆栈等数据结构都可以用来满足不同的业务需求。在设计和开发业务系统时,理解如何根据业务场景选择合适的集合类,对于提升系统的性能和可扩展性至关重要。

Java 集合在实际业务系统中的建模应用:如何选择合适的集合类?

本文将通过一些常见的业务场景,介绍 Java 集合类的建模应用,并为每种场景选择合适的集合类。

1. 订单管理系统:使用 HashMap 存储订单信息

在订单管理系统中,订单通常是通过唯一的订单 ID 来访问和修改的。为此,我们可以选择使用 HashMap 来存储订单信息,其中订单 ID 是键,订单对象是值。

示例:

import java.util.HashMap;
import java.util.Map;

public class OrderManagementSystem {
    private Map<String, Order> orders;

    public OrderManagementSystem() {
        orders = new HashMap<>();
    }

    // 添加订单
    public void addOrder(String orderId, Order order) {
        orders.put(orderId, order);
    }

    // 根据订单ID获取订单
    public Order getOrder(String orderId) {
        return orders.get(orderId);
    }

    // 根据订单ID删除订单
    public void removeOrder(String orderId) {
        orders.remove(orderId);
    }

    // 获取所有订单数量
    public int getOrderCount() {
        return orders.size();
    }

    public static void main(String[] args) {
        OrderManagementSystem oms = new OrderManagementSystem();
        oms.addOrder("O1001", new Order("O1001", "Product1", 2));
        oms.addOrder("O1002", new Order("O1002", "Product2", 1));
        
        System.out.println("Order O1001: " + oms.getOrder("O1001"));
        System.out.println("Total orders: " + oms.getOrderCount());
    }
}

class Order {
    String orderId;
    String product;
    int quantity;

    public Order(String orderId, String product, int quantity) {
        this.orderId = orderId;
        this.product = product;
        this.quantity = quantity;
    }

    @Override
    public String toString() {
        return "Order{" + "orderId='" + orderId + '\'' + ", product='" + product + '\'' + ", quantity=" + quantity + '}';
    }
}

设计分析:

  • HashMap 是基于哈希表实现的,它提供了 O(1) 的时间复杂度用于查找、插入和删除元素,这使得通过订单 ID 进行快速访问成为可能。
  • 在这个场景中,我们使用订单 ID 作为 key,这样就能实现高效的订单查找和管理。

适用场景:

  • 需要通过唯一键(例如订单 ID)进行快速查找、更新和删除的场景。

2. 用户角色权限管理:使用 HashSet 存储权限集合

在权限管理系统中,每个用户会有一组权限,这些权限通常是唯一且无序的。因此,使用 HashSet 来存储用户的权限集合是一个合适的选择。

示例:

import java.util.HashSet;
import java.util.Set;

public class UserRoleManagement {
    private Set<String> permissions;

    public UserRoleManagement() {
        permissions = new HashSet<>();
    }

    // 添加权限
    public void addPermission(String permission) {
        permissions.add(permission);
    }

    // 移除权限
    public void removePermission(String permission) {
        permissions.remove(permission);
    }

    // 检查是否有权限
    public boolean hasPermission(String permission) {
        return permissions.contains(permission);
    }

    public static void main(String[] args) {
        UserRoleManagement urm = new UserRoleManagement();
        urm.addPermission("READ");
        urm.addPermission("WRITE");
        urm.addPermission("DELETE");
        
        System.out.println("Has WRITE permission: " + urm.hasPermission("WRITE"));
        urm.removePermission("WRITE");
        System.out.println("Has WRITE permission: " + urm.hasPermission("WRITE"));
    }
}

设计分析:

  • HashSet 是一个无序且不允许重复元素的集合。在这个场景中,我们使用 HashSet 来存储权限集合,能够有效避免重复的权限,并提供高效的查找操作。
  • 由于权限是无序的,HashSet 的特性正符合我们的需求。

适用场景:

  • 存储无序且唯一的元素集合,避免重复数据,常用于权限、标签等管理系统。

3. 任务调度系统:使用 PriorityQueue 执行优先级任务

在任务调度系统中,任务通常有不同的优先级。我们可以使用 PriorityQueue 来实现基于优先级的任务调度。PriorityQueue 是一个基于堆的数据结构,提供了优先级队列功能。

示例:

import java.util.PriorityQueue;

public class TaskScheduler {

    static class Task implements Comparable<Task> {
        String taskName;
        int priority; // 1: High, 2: Medium, 3: Low

        public Task(String taskName, int priority) {
            this.taskName = taskName;
            this.priority = priority;
        }

        @Override
        public int compareTo(Task other) {
            return Integer.compare(this.priority, other.priority);
        }

        @Override
        public String toString() {
            return "Task{" + "taskName='" + taskName + '\'' + ", priority=" + priority + '}';
        }
    }

    public static void main(String[] args) {
        PriorityQueue<Task> taskQueue = new PriorityQueue<>();

        taskQueue.add(new Task("Task1", 3)); // Low priority
        taskQueue.add(new Task("Task2", 1)); // High priority
        taskQueue.add(new Task("Task3", 2)); // Medium priority
        
        // 执行任务,按优先级顺序
        while (!taskQueue.isEmpty()) {
            System.out.println("Executing: " + taskQueue.poll());
        }
    }
}

设计分析:

  • PriorityQueue 根据元素的优先级自动排序。在这个例子中,Task 类实现了 Comparable 接口,通过 compareTo 方法定义任务的优先级。
  • 任务队列会根据任务的优先级进行排序,poll() 方法会返回并移除队列中优先级最高的任务。

适用场景:

  • 任务调度、消息队列等需要按照优先级顺序处理的场景。

4. 社交网络:使用 HashMapHashSet 存储好友关系

在社交网络中,用户和他们的好友之间有一种映射关系,我们可以使用 HashMap 来存储每个用户与其好友的集合。每个用户的 key 是用户 ID,value 是该用户的好友集合。

示例:

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class SocialNetwork {
    private Map<String, Set<String>> userFriends;

    public SocialNetwork() {
        userFriends = new HashMap<>();
    }

    // 添加好友
    public void addFriend(String user, String friend) {
        userFriends.computeIfAbsent(user, k -> new HashSet<>()).add(friend);
        userFriends.computeIfAbsent(friend, k -> new HashSet<>()).add(user);
    }

    // 查看好友
    public Set<String> getFriends(String user) {
        return userFriends.getOrDefault(user, new HashSet<>());
    }

    public static void main(String[] args) {
        SocialNetwork sn = new SocialNetwork();
        sn.addFriend("Alice", "Bob");
        sn.addFriend("Bob", "Charlie");

        System.out.println("Alice's friends: " + sn.getFriends("Alice"));
        System.out.println("Bob's friends: " + sn.getFriends("Bob"));
    }
}

设计分析:

  • HashMap<String, Set<String>>HashMap 用于存储每个用户与其好友的关系,用户 ID 作为键,好友集合作为值。
  • HashSet 用于存储每个用户的好友,确保每个好友是唯一的。

适用场景:

  • 存储用户关系、社交网络、推荐系统等需要管理多对多关系的场景。

总结

Java 提供的集合类(如 HashMapHashSetPriorityQueue 等)可以帮助我们高效地实现各种业务系统中的数据管理需求。在实际开发中,选择合适的集合类是确保系统性能和可维护性的关键。通过本文的案例,我们可以总结出几个常见的使用场景:

  • HashMap:适用于存储需要根据唯一键快速查找的数据(例如订单管理、用户权限管理)。
  • HashSet:适用于存储不允许重复的元素集合(例如权限、标签管理)。
  • PriorityQueue:适用于根据优先级排序执行任务的场景(例如任务调度系统)。
  • HashMapHashSet 组合:适用于存储多对多关系(例如社交网络、推荐系统)。

通过合理使用这些集合类,你能够根据具体的业务需求设计高效且易于维护的数据结构。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

  • 随机文章
  • 热门文章
  • 热评文章
热门