《Java 简易速速上手小册》第3章:Java 数据结构(2024 最新版)

news2024/11/29 20:46:32

在这里插入图片描述

文章目录

  • 3.1 数组和字符串 - 数据的基本营地
    • 3.1.1 基础知识
    • 3.1.2 重点案例:统计文本中的单词频率
    • 3.1.3 拓展案例 1:寻找数组中的最大元素
    • 3.1.4 拓展案例 2:反转字符串
  • 3.2 集合框架概述 - 数据小队的训练场
    • 3.2.1 基础知识
    • 3.2.2 重点案例:学生信息管理系统
    • 3.2.3 拓展案例 1:任务调度器
    • 3.2.4 拓展案例 2:产品库存管理
  • 3.3 泛型和迭代器 - 数据小队的特种兵
    • 3.3.1 基础知识
    • 3.3.2 重点案例:通用数据容器
    • 3.3.3 拓展案例 1:键值对存储
    • 3.3.4 拓展案例 2:类型安全的交换函数

3.1 数组和字符串 - 数据的基本营地

在 Java 的世界中,数组和字符串是处理数据的基础。它们像是你的数据小队的营地,为你的编程之旅提供了起点。让我们更深入地了解这些基础结构,并通过一些实用的案例来探索它们的力量。

3.1.1 基础知识

  • 数组:数组是相同类型数据的有序集合。在 Java 中,数组的大小在声明时确定,并且不能更改。你可以通过索引(从 0 开始)访问数组中的每个元素。
int[] numbers = new int[5]; // 声明一个整型数组,包含 5 个元素
numbers[0] = 1; // 给数组的第一个元素赋值
  • 字符串:字符串是字符的序列,Java 中的 String 类提供了丰富的方法来操作这些字符序列。字符串在 Java 中是不可变的,这意味着一旦创建,你就不能改变它们。
String greeting = "Hello, World!"; // 创建一个字符串

3.1.2 重点案例:统计文本中的单词频率

假设我们要分析一段文本,统计其中每个单词出现的频率。这个任务可以通过数组和字符串操作来完成。

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

public class WordFrequency {
    public static void main(String[] args) {
        String text = "Hello world. Hello Java. Hello Java World.";
        text = text.toLowerCase().replaceAll("[^a-z ]", ""); // 转小写并移除标点符号
        String[] words = text.split(" "); // 使用空格分割字符串成单词数组

        Map<String, Integer> frequencyMap = new HashMap<>();
        for (String word : words) {
            frequencyMap.put(word, frequencyMap.getOrDefault(word, 0) + 1);
        }

        frequencyMap.forEach((key, value) -> System.out.println(key + ": " + value));
    }
}

3.1.3 拓展案例 1:寻找数组中的最大元素

在一组数据中寻找最大元素是一个常见的任务,可以通过遍历数组来实现。

public class FindMax {
    public static void main(String[] args) {
        int[] numbers = {5, 3, 8, 2, 9, 1};
        int max = numbers[0]; // 假设第一个元素是最大的

        for (int number : numbers) {
            if (number > max) {
                max = number; // 找到更大的元素
            }
        }

        System.out.println("The maximum number is: " + max);
    }
}

3.1.4 拓展案例 2:反转字符串

字符串的反转是许多算法和面试题中的常见问题。在 Java 中,我们可以使用 StringBuilder 类来实现这个功能,因为 String 是不可变的。

public class ReverseString {
    public static void main(String[] args) {
        String original = "Hello, World!";
        String reversed = new StringBuilder(original).reverse().toString();

        System.out.println("Original: " + original);
        System.out.println("Reversed: " + reversed);
    }
}

通过这些案例,我们可以看到数组和字符串如何作为处理数据的基本工具,在 Java 编程中发挥着重要的作用。从统计单词频率到寻找最大元素,再到反转字符串,掌握这些基础技能将为你解决更复杂的问题打下坚实的基础。继续前进,实践这些案例,你将会发现更多有趣和实用的数据处理技巧!

在这里插入图片描述


3.2 集合框架概述 - 数据小队的训练场

Java 集合框架(JCF)是一套性能优异的类和接口,它提供了一种高效地存储和处理数据集合的方式。想象你正在指挥你的数据小队在训练场上进行训练,集合框架就是你的训练手册,告诉你如何组织和操作这些数据。

3.2.1 基础知识

  • List:List 接口允许我们存储一个有序的集合,可以包含重复的元素。它是一个动态数组,可以增长和缩小。ArrayList 和 LinkedList 是两个实现了 List 接口的常用类。

  • Set:Set 接口提供了存储唯一元素的方式,即不允许重复的元素。HashSet 和 TreeSet 是两个常用的实现了 Set 接口的类。

  • Map:Map 接口使用键值对的方式存储数据。每个键映射到一个值。键不能重复,但值可以。HashMap 和 TreeMap 是两个实现了 Map 接口的常用类。

3.2.2 重点案例:学生信息管理系统

在一个学生信息管理系统中,我们需要存储和管理每个学生的信息,包括姓名、学号和成绩。我们可以使用 Map 来实现这个系统,其中学号作为唯一的键,学生信息作为值。

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

class Student {
    String name;
    double grade;

    public Student(String name, double grade) {
        this.name = name;
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student{name='" + name + '\'' + ", grade=" + grade + '}';
    }
}

public class StudentManagement {
    public static void main(String[] args) {
        Map<String, Student> students = new HashMap<>();
        students.put("S001", new Student("Alice", 89.5));
        students.put("S002", new Student("Bob", 92.0));
        students.put("S003", new Student("Charlie", 85.5));

        students.forEach((id, student) -> System.out.println(id + ": " + student));
    }
}

3.2.3 拓展案例 1:任务调度器

在一个任务调度器中,我们需要管理和调度一系列的任务。我们可以使用 PriorityQueue 来实现这个系统,优先调度重要性高的任务。

import java.util.PriorityQueue;

class Task implements Comparable<Task> {
    String name;
    int priority;

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

    @Override
    public int compareTo(Task other) {
        return Integer.compare(other.priority, this.priority); // 高优先级先出队
    }

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

public class TaskScheduler {
    public static void main(String[] args) {
        PriorityQueue<Task> tasks = new PriorityQueue<>();
        tasks.offer(new Task("Fix bug", 5));
        tasks.offer(new Task("Write documentation", 1));
        tasks.offer(new Task("Implement feature", 10));

        while (!tasks.isEmpty()) {
            System.out.println("Processing " + tasks.poll());
        }
    }
}

3.2.4 拓展案例 2:产品库存管理

在一个电商平台的库存管理系统中,我们需要跟踪每个产品的库存数量。我们可以使用 Map 来存储产品 ID 和对应的库存数量。

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

public class InventoryManagement {
    public static void main(String[] args) {
        Map<String, Integer> inventory = new HashMap<>();
        inventory.put("P001", 100); // 产品 ID 为 P001 的产品有 100 件库存
        inventory.put("P002", 200);
        inventory.put("P003", 150);

        // 增加库存
        inventory.put("P001", inventory.get("P001") + 50);

        inventory.forEach((productId, quantity) ->

 System.out.println("Product ID: " + productId + ", Quantity: " + quantity));
    }
}

通过这些案例,我们可以看到 Java 集合框架在实际生产中的强大用途。从管理学生信息到任务调度,再到库存管理,JCF 提供了一套灵活且强大的工具,帮助你高效地组织和操作数据集合。掌握这些集合类和接口将大大提高你的 Java 编程效率。

在这里插入图片描述


3.3 泛型和迭代器 - 数据小队的特种兵

在 Java 的数据管理军团中,泛型和迭代器是那些特别训练过的特种兵,它们提供了额外的灵活性和力量,使得数据操作更加高效和安全。

3.3.1 基础知识

  • 泛型(Generics):泛型提供了代码的类型安全性,允许在编译时检查类型错误。它们使得你可以编写可以应用于多种类型的通用代码,而不是为每种需要操作的数据类型编写重复的代码。
List<String> strings = new ArrayList<>(); // 使用泛型创建字符串列表
strings.add("Java");
// strings.add(123); // 编译时错误,保证了类型安全
  • 迭代器(Iterator):迭代器提供了一种遍历集合中元素的标准方式,无需关心集合的内部结构。它支持 hasNext()next() 操作,用于检查集合中是否还有元素,以及访问下一个元素。
Iterator<String> iterator = strings.iterator();
while(iterator.hasNext()) {
    String str = iterator.next();
    System.out.println(str);
}

3.3.2 重点案例:通用数据容器

假设我们需要创建一个通用的数据容器,它可以存储任何类型的数据,并提供遍历这些数据的能力。我们可以使用泛型来定义这个容器,以及迭代器来遍历容器中的数据。

class DataContainer<T> implements Iterable<T> {
    private List<T> data = new ArrayList<>();

    public void add(T element) {
        data.add(element);
    }

    @Override
    public Iterator<T> iterator() {
        return data.iterator();
    }
}

public class GenericDemo {
    public static void main(String[] args) {
        DataContainer<String> stringContainer = new DataContainer<>();
        stringContainer.add("Hello");
        stringContainer.add("World");

        for (String str : stringContainer) {
            System.out.println(str);
        }
    }
}

3.3.3 拓展案例 1:键值对存储

在许多应用中,我们需要存储键值对数据。我们可以创建一个通用的键值对类,并使用泛型来定义键和值的类型。

class KeyValuePair<K, V> {
    private K key;
    private V value;

    public KeyValuePair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() {
        return key;
    }

    public V getValue() {
        return value;
    }
}

public class KeyValuePairDemo {
    public static void main(String[] args) {
        KeyValuePair<String, Integer> ageOfPerson = new KeyValuePair<>("Alice", 30);
        System.out.println(ageOfPerson.getKey() + ": " + ageOfPerson.getValue());
    }
}

3.3.4 拓展案例 2:类型安全的交换函数

在进行数据处理时,我们经常需要交换两个元素的位置。我们可以编写一个使用泛型的交换函数,以确保我们可以安全地交换同一类型的两个元素。

public class SwapDemo {
    public static <T> void swap(T[] array, int pos1, int pos2) {
        T temp = array[pos1];
        array[pos1] = array[pos2];
        array[pos2] = temp;
    }

    public static void main(String[] args) {
        Integer[] numbers = {1, 2, 3, 4, 5};
        swap(numbers, 1, 3); // 交换位置 1 和位置 3 的元素
        System.out.println(Arrays.toString(numbers));
    }
}

通过这些案例,我们可以看到泛型和迭代器如何增强 Java 程序的灵活性和类型安全性。泛型让我们可以编写可重用且类型安全的代码,而迭代器则提供了一种标准的方法来遍历集合中的数据。掌握这些特种兵的技能将使你在处理复杂数据时更加得心应手。继续前进,勇敢地使用这些工具来解决你面临的编程挑战吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1447827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目计划制定攻略:从构思到执行的完整指南

在任何项目中&#xff0c;制定一个全面、详细的项目计划是至关重要的。项目计划是项目成功的基石&#xff0c;它提供了项目的路线图和指导&#xff0c;帮助团队成员了解项目的目标、里程碑和时间表。本文将详细介绍如何制定一个高质量的项目计划&#xff0c;确保项目顺利实施。…

红队笔记Day3-->隧道上线不出网机器

昨天讲了通过代理的形式&#xff08;端口转发&#xff09;实现了上线不出网的机器&#xff0c;那么今天就来讲一下如何通过隧道上线不出网机器 目录 1.网络拓扑 2.开始做隧道&#xff1f;No&#xff01;&#xff01;&#xff01; 3.icmp隧道 4.HTTP隧道 5.SSH隧道 1.什么…

第十三课 PCB保姆级规则设置(二)

1.Routing&#xff1a;信号的线宽规则&#xff0c;包含了过孔的规则 1&#xff09;线宽设置 线宽和安全距离一致&#xff08;主控芯片决定&#xff09; 电源和GND线宽不同设置 2&#xff09;网络类&#xff1a;Net Class的设置 快捷键&#xff1a;DC 点击<All Nets>&a…

Leetcode 606.根据二叉树创建字符串

给你二叉树的根节点root&#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对"root"表示&#xff0c;转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射…

【C++】static静态关键字

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java并发基础:ConcurrentLinkedDeque全面解析!

内容概要 ConcurrentLinkedDeque类提供了线程安全的双端队列操作&#xff0c;支持高效的并发访问&#xff0c;因此在多线程环境下&#xff0c;可以放心地在队列的两端添加或移除元素&#xff0c;而不用担心数据的一致性问题。同时&#xff0c;它的内部实现采用了无锁算法&…

Web安全研究(六)

文章目录 HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs文章结构Introjs obfuscationmethodologyExample HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs CCS 2019 CISPA 恶意软件领域&#xff0c;基于学习的系统已经非常流行&am…

嵌入式Qt 计算器界面设计代码重构

一.计算器界面设计代码重构 计算器界面设计&#xff1a;嵌入式Qt 计算器界面设计-CSDN博客 重构的概念&#xff1a; 代码实现与代码重构的不同&#xff1a; 软件开发过程&#xff1a; 什么样的代码需要重构&#xff1a; 计算器界面代码重构的框架设计&#xff1a; 实验&#…

实现JNDI

实现JNDI 问题陈述 Smart Software Developer Ltd.想要开发一款Web应用程序,它使用servlt基于雇员ID显示雇员信息,雇员ID由用户通过HTML用户界面传递。雇员详细信息存储在Employee_Master表中。另外,Web应用程序应显示网站被访问的次数。 解决方案 要解决上述问题,需要执…

福布斯2023年推荐:十佳项目管理软件榜单揭晓

项目管理软件可以轻松规划项目、分配任务并保持团队井井有条&#xff0c;以便满足截止日期和目标。然而当今市场上有如此多的项目管理系统&#xff0c;选择适合您需求的正确选项可能很困难。为了提供帮助&#xff0c;福布斯小型企业顾问团队分析了数十家领先的提供商&#xff0…

【医学知识图谱 自动补全 关系抽取】生成模型 + 医学知识图谱 = 发现三元组隐藏的关系实体对

生成模型 医学知识图谱 发现三元组新关系实体对 提出背景问题&#xff1a;如何自动发现并生成医疗领域中未被标注的实体关系三元组&#xff1f;CRVAE模型 提出背景 论文&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3219819.3220010 以条件关系变分自编码器&#xff08;…

【通讯录案例-归档解档 Objective-C语言】

一、接下来,我们来说这个“归档”、“解档”、 1.归档、解档、这一块儿呢 首先呢,我们这个目标啊,还是跟“代理”差不多,要会用, 一会儿给大家画一幅图,让大家去了解“归档”、“解档”、每一句话,到底都干了什么, 好,我们先新建一个项目, 新建一个项目 新建一个…

Python实现EMV指标计算:股票技术分析的利器系列(2)

Python实现EMV指标计算&#xff1a;股票技术分析的利器系列&#xff08;2&#xff09; 介绍算法解释&#xff1a; 核心代码&#xff1a;rolling函数介绍 完整代码&#xff1a;一定要看 介绍 先看看官方介绍&#xff1a; EMV(简易波动指标&#xff09; 用法 1.EMV 由下往上穿越…

“操作符大揭秘:一篇文章让你秒懂所有!”

目录 1. ⼆进制介绍 2. 原码、反码、补码 3. 移位操作符 4. 位操作符&#xff1a;&、|、^ 5. 逗号表达式 6. 下标访问[]、函数调⽤() 7. 操作符的属性&#xff1a;优先级、结合性 8. 整型提升 9. 算术转换 10. 表达式求值 正文开始&#xff1a; 1. ⼆进制 其实我…

Leetcode 1035 不相交的线

题意理解&#xff1a; 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff…

MATLAB|【免费】高比例可再生能源电力系统的调峰成本量化与分摊模型

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序复现文献《高比例可再生能源电力系统的调峰成本量化与分摊模型》&#xff0c;从净负荷波动的角度出发&#xff0c;建立了调峰成本的量化与分摊模型&#xff0c;构造了无调峰需求的替代场景&#xff0c;将…

阿里云游戏服务器一年费用多少?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

【JavaEE进阶】 图书管理系统开发日记——陆

文章目录 &#x1f38b;前言&#x1f343;删除图书&#x1f6a9;约定前后端交互接口&#x1f6a9;完善前端代码&#x1f6a9;接口测试 &#x1f38d;批量删除&#x1f6a9;约定前后端交互接口&#x1f6a9;实现后端服务器代码&#x1f388;控制层&#x1f388;业务层&#x1f3…

Uipath 调用Python 脚本程序详解

Python 活动概述 UiPath.Python.Activities 是一个新的活动包&#xff0c;创建它是为了支持直接从工作流运行 Python 脚本和方法。 其包含以下活动&#xff1a; Python 作用域(Python Scope) - 为 Python 活动提供作用域的容器。 加载 Python 脚本(Load Python Script) - 将 P…

Servlet JSP-Eclipse安装配置Maven插件

Maven 是一款比较常用的 Java 开发拓展包&#xff0c;它相当于一个全自动 jar 包管理器&#xff0c;会导入用户开发时需要使用的相应 jar 包。使用 Maven 开发 Java 程序&#xff0c;可以极大提升开发者的开发效率。下面我就跟大家介绍一下如何在 Eclipse 里安装和配置 Maven 插…