Java 中文官方教程 2022 版(二十七)(1)

简介: Java 中文官方教程 2022 版(二十七)

对象排序

原文:docs.oracle.com/javase/tutorial/collections/interfaces/order.html

一个List l可以按以下方式排序。

Collections.sort(l);

如果List包含String元素,则将按字母顺序对其进行排序。如果包含Date元素,则将按时间顺序对其进行排序。这是如何发生的呢?StringDate都实现了Comparable接口。Comparable实现为一个类提供了*自然排序*,允许该类的对象自动排序。下表总结了一些更重要的实现Comparable`接口的 Java 平台类。

实现 Comparable 接口的类

自然排序
Byte 有符号数值
Character 无符号数值
Long 有符号数值
Integer 有符号数值
Short 有符号数值
Double 有符号数值
Float 有符号数值
BigInteger 有符号数值
BigDecimal 有符号数值
Boolean Boolean.FALSE < Boolean.TRUE
File 基于路径名的系统相关字典序
String 字典序
Date 时间顺序
CollationKey 区域特定字典序

如果你尝试对一个不实现Comparable接口的列表进行排序,Collections.sort(list)将抛出一个ClassCastException。同样,如果你尝试使用comparator对无法相互比较的列表进行排序,Collections.sort(list, comparator)将抛出ClassCastException。可以相互比较的元素被称为可相互比较的。尽管不同类型的元素可能是可相互比较的,但这里列出的类中没有一个允许跨类比较。

如果你只想对可比较元素的列表进行排序或创建排序的集合,那么关于Comparable接口,这就是你真正需要知道的全部内容。如果你想要实现自己的Comparable类型,那么下一节将对你感兴趣。

编写自己的可比较类型

Comparable接口包含以下方法。

public interface Comparable<T> {
    public int compareTo(T o);
}

compareTo方法比较接收对象与指定对象,并根据接收对象是小于、等于还是大于指定对象返回负整数、0 或正整数。如果指定对象无法与接收对象比较,则该方法会抛出ClassCastException

下面的类代表一个人的名字,实现了Comparableexamples/Name.java

import java.util.*;
public class Name implements Comparable<Name> {
    private final String firstName, lastName;
    public Name(String firstName, String lastName) {
        if (firstName == null || lastName == null)
            throw new NullPointerException();
        this.firstName = firstName;
        this.lastName = lastName;
    }
    public String firstName() { return firstName; }
    public String lastName()  { return lastName;  }
    public boolean equals(Object o) {
        if (!(o instanceof Name))
            return false;
        Name n = (Name) o;
        return n.firstName.equals(firstName) && n.lastName.equals(lastName);
    }
    public int hashCode() {
        return 31*firstName.hashCode() + lastName.hashCode();
    }
    public String toString() {
  return firstName + " " + lastName;
    }
    public int compareTo(Name n) {
        int lastCmp = lastName.compareTo(n.lastName);
        return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
    }
}

为了保持前面的示例简洁,该类有一定的限制:它不支持中间名,要求同时有名和姓,而且在任何方面都没有国际化。尽管如此,它阐明了以下重要点:

  • Name 对象是不可变的。其他条件相同的情况下,不可变类型是最好的选择,特别是对于将用作 Set 中的元素或 Map 中的键的对象。如果在集合中修改它们的元素或键,这些集合将会中断。
  • 构造函数检查其参数是否为 null。这确保所有的 Name 对象都是格式良好的,以便其他方法永远不会抛出 NullPointerException
  • hashCode 方法被重新定义。这对于重新定义 equals 方法的任何类都是必不可少的。(相等的对象必须具有相等的哈希码。)
  • equals 方法在指定对象为 null 或不合适类型时返回 falsecompareTo 方法在这些情况下会抛出运行时异常。这两种行为都是各自方法的一般契约所要求的。
  • toString 方法已被重新定义,以便以人类可读的形式打印 Name。这总是一个好主意,特别是对于将要放入集合中的对象。各种集合类型的 toString 方法依赖于它们的元素、键和值的 toString 方法。

由于本节是关于元素排序的,让我们再谈一下 NamecompareTo 方法。它实现了标准的名称排序算法,其中姓氏优先于名字。这正是你在自然排序中想要的。如果自然排序是不自然的,那将会非常令人困惑!

看一下 compareTo 的实现方式,因为它是相当典型的。首先,你比较对象的最重要部分(在这种情况下是姓)。通常情况下,你可以直接使用部分类型的自然排序。在这种情况下,部分是一个 String,自然(词典)排序正是所需的。如果比较结果不是零,表示相等,你就完成了:只需返回结果。如果最重要的部分相等,你继续比较下一个最重要的部分。在这种情况下,只有两个部分——名和姓。如果有更多的部分,你会按照明显的方式继续,比较部分直到找到两个不相等的部分或者你正在比较最不重要的部分,此时你会返回比较的结果。

为了展示它是如何工作的,这里是一个构建名称列表并对其进行排序的程序。

import java.util.*;
public class NameSort {
    public static void main(String[] args) {
        Name nameArray[] = {
            new Name("John", "Smith"),
            new Name("Karl", "Ng"),
            new Name("Jeff", "Smith"),
            new Name("Tom", "Rich")
        };
        List<Name> names = Arrays.asList(nameArray);
        Collections.sort(names);
        System.out.println(names);
    }
}

如果你运行这个程序,这是它打印的内容。

[Karl Ng, Tom Rich, Jeff Smith, John Smith]

compareTo方法的行为有四个限制,我们现在不会详细讨论,因为它们相当技术性和乏味,并且最好留在 API 文档中。所有实现Comparable的类都必须遵守这些限制,因此如果您正在编写实现它的类,请阅读Comparable的文档。尝试对违反这些限制的对象列表进行排序会导致未定义的行为。从技术上讲,这些限制确保自然排序是实现它的类的对象上的全序;这是确保排序是明确定义的必要条件。

比较器

如果您想按照除自然排序之外的顺序对一些对象进行排序怎么办?或者如果您想对一些不实现Comparable接口的对象进行排序怎么办?要做到这两点,您需要提供一个Comparator — 一个封装排序的对象。与Comparable接口一样,Comparator接口由一个方法组成。

public interface Comparator<T> {
    int compare(T o1, T o2);
}

compare方法比较其两个参数,根据第一个参数是否小于、等于或大于第二个参数返回负整数、0 或正整数。如果任一参数的类型对于Comparator不合适,则compare方法会抛出ClassCastException

大部分关于Comparable的内容也适用于Comparator。编写compare方法几乎与编写compareTo方法相同,只是前者将两个对象作为参数传递。compare方法必须遵守与ComparablecompareTo方法相同的四个技术限制,原因是Comparator必须对其比较的对象引入一个全序。

假设您有一个名为Employee的类,如下所示。

public class Employee implements Comparable<Employee> {
    public Name name()     { ... }
    public int number()    { ... }
    public Date hireDate() { ... }
       ...
}

假设Employee实例的自然排序是根据员工姓名(如前面的示例中定义的)的Name排序。不幸的是,老板要求按资历顺序列出员工名单。这意味着我们需要做一些工作,但不多。以下程序将生成所需的列表。

import java.util.*;
public class EmpSort {
    static final Comparator<Employee> SENIORITY_ORDER = 
                                        new Comparator<Employee>() {
            public int compare(Employee e1, Employee e2) {
                return e2.hireDate().compareTo(e1.hireDate());
            }
    };
    // Employee database
    static final Collection<Employee> employees = ... ;
    public static void main(String[] args) {
        List<Employee> e = new ArrayList<Employee>(employees);
        Collections.sort(e, SENIORITY_ORDER);
        System.out.println(e);
    }
}

程序中的Comparator相当简单。它依赖于应用于hireDate访问器方法返回的值的Date的自然排序。请注意,Comparator将其第二个参数的入职日期传递给其第一个参数,而不是反过来。原因是最近入职的员工资历最低;按照入职日期排序会将列表按照逆资历顺序排列。有时人们用来实现这种效果的另一种技术是保持参数顺序,但对比较结果取反。

// Don't do this!!
return -r1.hireDate().compareTo(r2.hireDate());

你应该始终使用前一种技术而不是后一种,因为后一种不能保证有效。原因是compareTo方法如果其参数小于调用它的对象,则可以返回任何负的int。有一个负的int在取反后仍然是负的,尽管这看起来很奇怪。

-Integer.MIN_VALUE == Integer.MIN_VALUE

前面程序中的Comparator用于对List进行排序很好,但它有一个缺陷:它不能用于对已排序的集合(如TreeSet)进行排序,因为它生成的排序与equals不兼容。这意味着这个Comparator将把equals方法不认为相等的对象等同起来。特别是,任何在同一天入职的两名员工将被视为相等。当你对List进行排序时,这并不重要;但当你使用Comparator对已排序的集合进行排序时,这是致命的。如果你使用这个Comparator将多名在同一天入职的员工插入TreeSet,只有第一个会被添加到集合中;第二个将被视为重复元素并被忽略。

要解决这个问题,只需微调Comparator,使其生成一个与equals兼容的排序。换句话说,调整它使得当使用compare进行比较时,只有那些在使用equals进行比较时也被视为相等的元素才被视为相等。做法是执行一个两部分比较(如对Name),其中第一部分是我们感兴趣的部分——在这种情况下是入职日期——第二部分是一个唯一标识对象的属性。在这里,员工编号是显而易见的属性。这是产生的Comparator

static final Comparator<Employee> SENIORITY_ORDER = 
                                        new Comparator<Employee>() {
    public int compare(Employee e1, Employee e2) {
        int dateCmp = e2.hireDate().compareTo(e1.hireDate());
        if (dateCmp != 0)
            return dateCmp;
        return (e1.number() < e2.number() ? -1 :
               (e1.number() == e2.number() ? 0 : 1));
    }
};

最后一点:你可能会想要用更简单的方式替换Comparator中的最后一个return语句:

return e1.number() - e2.number();

不要这样做,除非你绝对确定没有人会有负的员工编号!这个技巧通常不起作用,因为有符号整数类型不足以表示任意两个有符号整数的差值。如果i是一个很大的正整数,而j是一个很大的负整数,i - j会溢出并返回一个负整数。所得到的comparator违反了我们一直谈论的四个技术限制之一(传递性),并产生可怕的、微妙的错误。这不仅仅是理论上的担忧;人们会因此受到伤害。

SortedSet 接口

原文:docs.oracle.com/javase/tutorial/collections/interfaces/sorted-set.html

SortedSet 是一个按升序维护其元素的集合,根据元素的自然顺序或在 SortedSet 创建时提供的 Comparator 进行排序。除了正常的 Set 操作外,SortedSet 接口还提供以下操作:

  • Range view — 允许对排序集合进行任意范围操作
  • Endpoints — 返回排序集合中的第一个或最后一个元素
  • Comparator access — 返回用于对集合进行排序的 Comparator(如果有的话)

SortedSet 接口的代码如下。

public interface SortedSet<E> extends Set<E> {
    // Range-view
    SortedSet<E> subSet(E fromElement, E toElement);
    SortedSet<E> headSet(E toElement);
    SortedSet<E> tailSet(E fromElement);
    // Endpoints
    E first();
    E last();
    // Comparator access
    Comparator<? super E> comparator();
}

集合操作

SortedSetSet 继承的操作在排序集合和普通集合上的行为完全相同,但有两个例外:

  • iterator 操作返回的 Iterator 按顺序遍历排序集合。
  • toArray 返回的数组按顺序包含了排序后的集合元素。

尽管接口不保证,但 Java 平台SortedSet 实现的 toString 方法返回一个包含排序集合所有元素的字符串,按顺序排列。

标准构造函数

按照惯例,所有通用的 Collection 实现都提供一个标准的转换构造函数,接受一个 CollectionSortedSet 实现也不例外。在 TreeSet 中,这个构造函数创建一个根据元素的自然顺序排序的实例。这可能是一个错误。最好动态检查指定的集合是否是 SortedSet 实例,如果是,则根据相同的标准(比较器或自然顺序)对新的 TreeSet 进行排序。因为 TreeSet 采取了它的方法,它还提供一个接受 SortedSet 的构造函数,并返回一个包含相同元素并根据相同标准排序的新 TreeSet。请注意,参数的编译时类型,而不是运行时类型,决定调用这两个构造函数中的哪一个(以及是否保留排序标准)。

SortedSet 实现通常还提供一个构造函数,接受一个 Comparator 并返回一个根据指定 Comparator 排序的空集合。如果传递 null 给这个构造函数,它将返回一个根据元素的自然顺序排序的集合。

范围视图操作

range-view操作在某种程度上类似于List接口提供的操作,但有一个重大区别。排序集的范围视图即使在直接修改支持的排序集的情况下仍然有效。这是因为排序集的范围视图的端点是元素空间中的绝对点,而不是备份集合中的特定元素,这对于列表是成立的。排序集的range-view实际上只是窗口,显示在元素空间的指定部分中集合的任何部分。对排序集的range-view的更改会写回到支持的排序集中,反之亦然。因此,长时间使用排序集上的range-view是可以的,不像列表上的range-view那样。

排序集提供三种range-view操作。第一种是subSet,类似于subList,需要两个端点。端点不是索引,而是对象,并且必须与排序集中的元素可比,使用SetComparator或其元素的自然排序,取决于Set用于对自身排序的方式。与subList类似,范围是半开的,包括其低端点但不包括高端点。

因此,下面这行代码告诉你在名为dictionary的字符串SortedSet中包含多少个介于"doorbell""pickle"之间的单词,包括"doorbell"但不包括"pickle"

int count = dictionary.subSet("doorbell", "pickle").size();

以类似的方式,以下一行代码可以删除所有以字母f开头的元素。

dictionary.subSet("f", "g").clear();

类似的技巧可以用来打印一个表格,告诉你每个字母开头的单词有多少个。

for (char ch = 'a'; ch <= 'z'; ) {
    String from = String.valueOf(ch++);
    String to = String.valueOf(ch);
    System.out.println(from + ": " + dictionary.subSet(from, to).size());
}

假设你想查看一个闭区间,其中包含两个端点,而不是一个开区间。如果元素类型允许计算元素空间中给定值的后继,只需请求从lowEndpointsuccessor(highEndpoint)subSet。虽然这并不是完全明显的,但在String的自然排序中,字符串s的后继是s + "\0",也就是在s后附加一个null字符。

因此,以下一行代码告诉你在字典中包含多少个介于"doorbell""pickle"之间的单词,包括doorbell pickle

count = dictionary.subSet("doorbell", "pickle\0").size();

类似的技巧可以用来查看一个开区间,其中不包含任何端点。从lowEndpointhighEndpoint的开区间视图是从successor(lowEndpoint)highEndpoint的半开区间。使用以下代码计算介于"doorbell""pickle"之间的单词数量,不包括两者。

count = dictionary.subSet("doorbell\0", "pickle").size();

SortedSet 接口包含两个更多的 range-view 操作 — headSettailSet,两者都接受一个 Object 参数。前者返回一个视图,显示了支持 SortedSet 的初始部分,直到但不包括指定的对象。后者返回一个视图,显示了支持 SortedSet 的最终部分,从指定的对象开始,一直到支持 SortedSet 的末尾。因此,以下代码允许您将字典视为两个不相交的 a-mn-z)。

SortedSet<String> volume1 = dictionary.headSet("n");
SortedSet<String> volume2 = dictionary.tailSet("n");

端点操作

SortedSet 接口包含返回排序集合中第一个和最后一个元素的操作,分别称为 firstlast。除了它们的明显用途外,last 还允许解决 SortedSet 接口中的一个缺陷。您希望对 SortedSet 进行的一件事是进入 Set 的内部并向前或向后迭代。从内部向前迭代很容易:只需获取一个 tailSet 并对其进行迭代。不幸的是,向后迭代没有简单的方法。

以下习语获取了元素空间中小于指定对象 o 的第一个元素。

Object predecessor = ss.headSet(o).last();

这是从排序集合内部的某一点向后移动一个元素的好方法。可以重复应用它来向后迭代,但这非常低效,每返回一个元素都需要查找。

比较器访问器

SortedSet 接口包含一个名为 comparator 的访问器方法,返回用于对集合进行排序的 Comparator,如果集合根据其元素的 自然顺序 进行排序,则返回 null。提供此方法是为了可以将排序集合复制到具有相同顺序的新排序集合中。它被描述为 SortedSet 构造函数使用的 先前。

排序地图接口

原文:docs.oracle.com/javase/tutorial/collections/interfaces/sorted-map.html

一个SortedMap是一个维护其条目按升序排列的Map,根据键的自然顺序排序,或者根据在创建SortedMap时提供的Comparator排序。自然排序和Comparator在对象排序部分讨论。SortedMap接口提供了常规Map操作以及以下操作:

  • Range view — 在排序地图上执行任意范围操作
  • Endpoints — 返回排序地图中的第一个或最后一个键
  • Comparator access — 返回用于对地图进行排序的Comparator(如果有的话)。

以下接口是SortedSetMap模拟。

public interface SortedMap<K, V> extends Map<K, V>{
    Comparator<? super K> comparator();
    SortedMap<K, V> subMap(K fromKey, K toKey);
    SortedMap<K, V> headMap(K toKey);
    SortedMap<K, V> tailMap(K fromKey);
    K firstKey();
    K lastKey();
}

地图操作

SortedMapMap继承的操作在排序地图和普通地图上的行为相同,有两个例外:

  • 任何排序地图的Collection视图上的iterator操作返回的Iterator按顺序遍历集合。
  • Collection视图的toArray操作返回的数组按顺序包含键、值或条目。

虽然接口不能保证,但 Java 平台所有SortedMap实现中Collection视图的toString方法返回一个字符串,其中包含视图中的所有元素,按顺序排列。

标准构造函数

按照惯例,所有通用Map实现都提供一个标准转换构造函数,接受一个MapSortedMap实现也不例外。在TreeMap中,这个构造函数创建一个根据其键的自然顺序排序其条目的实例。这可能是一个错误。最好动态检查指定的Map实例是否是SortedMap,如果是,则根据相同的标准(比较器或自然顺序)对新地图进行排序。因为TreeMap采取了它的方法,它还提供了一个接受SortedMap的构造函数,并返回一个包含与给定SortedMap相同映射的新TreeMap,根据相同标准排序。请注意,参数的编译时类型,而不是运行时类型,决定了是否优先调用SortedMap构造函数而不是普通的map构造函数。

按照惯例,SortedMap实现还提供一个接受Comparator的构造函数,并返回根据指定Comparator排序的空地图。如果将null传递给此构造函数,则返回一个根据其键的自然顺序对其映射进行排序的Map

与 SortedSet 的比较

因为这个接口是SortedSet的精确Map模拟,所以在 SortedSet 接口部分中的所有习语和代码示例都适用于SortedMap,只需进行微不足道的修改。

接口总结

原文:docs.oracle.com/javase/tutorial/collections/interfaces/summary.html

核心集合接口是 Java 集合框架的基础。

Java 集合框架层次结构由两个不同的接口树组成:

  • 第一个树以Collection接口开始,该接口提供了所有集合使用的基本功能,如addremove方法。它的子接口——SetListQueue——提供了更专门化的集合。
  • Set接口不允许重复元素。这对于存储诸如一副牌或学生记录之类的集合非常有用。Set接口有一个子接口,SortedSet,用于对集合中的元素进行排序。
  • List接口提供了一个有序的集合,用于需要精确控制每个元素插入位置的情况。您可以通过它们的确切位置从List中检索元素。
  • Queue接口允许额外的插入、提取和检查操作。Queue中的元素通常按照 FIFO 顺序排序。
  • Deque接口允许在两端进行插入、删除和检查操作。Deque中的元素可以同时用于 LIFO 和 FIFO。
  • 第二个树以Map接口开始,类似于Hashtable将键和值进行映射。
  • Map的子接口SortedMap将其键值对按升序或按Comparator指定的顺序维护。

这些接口允许集合在不考虑其表示细节的情况下进行操作。

问题和练习:接口

原文:docs.oracle.com/javase/tutorial/collections/interfaces/QandE/questions.html

问题

  1. 在本课程的开始,您了解到核心集合接口被组织成两个不同的继承树。特别是一个接口被认为不是真正的Collection,因此位于自己的树的顶部。这个接口的名称是什么?
  2. 集合框架中的每个接口都使用语法声明,告诉您它是泛型的。当您声明一个Collection实例时,指定它将包含的对象类型有什么优势?
  3. 什么接口代表不允许重复元素的集合?
  4. 什么接口形成了集合层次结构的根?
  5. 什么接口代表可能包含重复元素的有序集合?
  6. 什么接口代表在处理之前保存元素的集合?
  7. 什么接口代表将键映射到值的类型?
  8. 什么接口代表双端队列?
  9. 列出遍历List元素的三种不同方法。
  10. 真或假:聚合操作是修改基础集合的变异操作。

练习

  1. 编写一个以随机顺序打印其参数的程序。不要复制参数数组。演示如何使用流和传统的增强 for 语句打印元素。
  2. FindDups示例,并修改它以使用SortedSet而不是Set。指定一个Comparator,以便在排序和识别集合元素时忽略大小写。
  3. 编写一个方法,接受一个List并对每个元素应用String.trim
  4. 考虑四个核心接口,SetListQueueMap。对于以下四个任务中的每一个,指定哪个核心接口最适合,并解释如何使用它来实现任务。
  1. Whimsical Toys Inc(WTI)需要记录所有员工的姓名。每个月,将从这些记录中随机选择一个员工以获得免费玩具。
  2. WTI 已决定每个新产品都将以员工的名字命名,但只使用名字的第一个字母,并且每个名字只能使用一次。准备一个独特的名字列表。
  3. WTI 决定只想使用最受欢迎的名字来命名其玩具。统计每个名字的员工数量。
  4. WTI 为当地的长曲棍球队购买季票,将由员工共享。为这项受欢迎的运动创建一个等待名单。

检查你的答案。

课程:聚合操作

原文:docs.oracle.com/javase/tutorial/collections/streams/index.html

注意:要更好地理解本节中的概念,请查看 Lambda 表达式和方法引用部分。

您使用集合做什么?您不仅仅将对象存储在集合中并将其留在那里。在大多数情况下,您使用集合来检索其中存储的项目。

再次考虑 Lambda 表达式部分中描述的场景。假设您正在创建一个社交网络应用。您希望创建一个功能,使管理员能够对满足某些条件的社交网络应用成员执行任何操作,例如发送消息。

与之前一样,假设这个社交网络应用的成员由以下Person类表示:

public class Person {
    public enum Sex {
        MALE, FEMALE
    }
    String name;
    LocalDate birthday;
    Sex gender;
    String emailAddress;
    // ...
    public int getAge() {
        // ...
    }
    public String getName() {
        // ...
    }
}


Java 中文官方教程 2022 版(二十七)(2)https://developer.aliyun.com/article/1486849

相关文章
|
7月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
363 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
3月前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
306 2
|
8月前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
9月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
8463 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
8月前
|
Java 数据库连接 数据处理
探究Java异常处理【保姆级教程】
Java 异常处理是确保程序稳健运行的关键机制。它通过捕获和处理运行时错误,避免程序崩溃。Java 的异常体系以 `Throwable` 为基础,分为 `Error` 和 `Exception`。前者表示严重错误,后者可细分为受检和非受检异常。常见的异常处理方式包括 `try-catch-finally`、`throws` 和 `throw` 关键字。此外,还可以自定义异常类以满足特定需求。最佳实践包括捕获具体异常、合理使用 `finally` 块和谨慎抛出异常。掌握这些技巧能显著提升程序的健壮性和可靠性。
133 4
|
8月前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
145 1
|
9月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
557 26
|
8月前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
416 0
|
9月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
9月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)

热门文章

最新文章