使用Java SE 8新的DateTime API JSR 310…可以实现更清晰,可读且功能强大的编码。

Java SE 8,JSR 310

在上一篇文章“ 使用Streams API处理集合 ”中; 我已深入探讨和探索如何使用遍历集合,如何从集合和数组创建流以及最终汇总流值。在“ Java SE 8新功能导览”系列的这篇文章中,我们将深入探讨解释,并探索JSR 310规范的代码,包括如何使用新的DateTime API计算时间跨度,如何使用Instant和Duration来计算时间跨度,表示日期和时间值,格式化日期和时间值以及支持时区偏移量。

源代码托管在我的Github帐户上:从此处克隆它。

表中的内容:

  1. 使用“即时”和“持续时间”计算时间跨度。
  2. 代表日期和时间值。
  3. 格式化日期和时间值。
  4. 支持时区偏移。

1-用即时和持续时间计算时间跨度:

介绍:
Java SE 8包括一个用于管理日期和时间值的全新API。 在此新API中实际保存数据的类都是不可变的,并且是线程安全的 。 因此,这意味着您不必担心在多线程环境中传递对象。 而且,如果您在并行流中使用它们,那么一切都将始终正常运行。 这个新API中的所有类都是包java.time成员。 我将从命名为InstantDuration两个核心类开始。

怎么运行的:
我将从eg.com.tm.java8.features.datetime.InstDuration项目的Java8Features包中的示例开始。 在名为InstantAndDuration的类代码中。 然后将所有这些代码放入main方法中。 我将描述的第一堂课称为Instant 。 我将输入类的名称,然后按Ctrl + Space ,然后从java.time包中选择该类,并将其导入上方。 即时对象表示Java时间轴上的即时。 就像日期类是管理日期和时间的旧方法的一部分一样,实例代表了毫秒数。

从1970年1月1日Java时代开始。要声明一个即时对象,我将使用其类型对其进行声明,并将其命名为start。 然后,我将调用即时类的静态方法now() 。 这代表了当前机​​器上调用代码的时刻。 然后,我将使用标准系统输出将该值作为字符串输出。 运行代码,您将看到输出开始于以年,月,日期格式的日期,然后是字母T之后的时间。

结果:

2016-08-05T21:21:59.601Z

一旦有时间,您可以使用它来计算该时间与另一个时间之间的差异。 因此,我将创建另一个瞬间,称为结束。 我也会从now()方法中获得它的价值。 然后,我将使用系统输出,并输出该值。 请注意,两个值之间存在细微差别,这就是我的系统所花费的时间。 要处理这一行代码,即输出起始值。

结果:

2016-08-05T21:33:55.971Z
2016-08-05T21:33:56.048Z

如果我要将那行代码向下移动,那么在两次调用now方法之间没有进行任何其他处理,则这两个值将是相同的,或者可能相差千分之一秒。

结果:

2016-08-05T21:34:43.365Z
2016-08-05T21:34:43.365Z

现在,我将向您展示如何计算这两个值之间的差。 当您将两个瞬间相互比较时,您会得到一个称为持续时间的对象。 它由Duration类表示,该类也是Java.time的成员。 我将这个对象命名为过去。 我将调用持续时间类的静态方法, between(Temporal startInclusive, Temporal endExclusive)称为between(Temporal startInclusive, Temporal endExclusive) 。 注意,它正在寻找类型为Temporal对象。 Instant类是Temporal的子类。

结果:

Elapsed: PT0S

我将以两个时间值作为起点和终点。 然后我将输出差异。 我将传递过去的文字标签,然后传递变量。 该持续时间对象以字母p开头,然后以t开头。 这也是ISO格式的值。 然后它告诉我零秒。 好吧,让我们看看如果我们调用sleep方法会发生什么。 我将光标放在开始和结束调用之间。 我将使用Thread类。

我将按点号,然后按Ctrl + Space 。 然后,我将调用sleep()方法并传递一个1,000的值。 意思是睡一秒钟。 sleep方法可能会引发错误,因此我将使用快速修复方法,并在主方法签名中添加throws声明。 我将保存并运行代码,现在我的经过时间为1.001秒。 您永远无法真正指望确切的事情,这完全取决于正在处理的计算机上发生的事情。

结果:

Elapsed: PT1.001S

接下来,我将进行此打印线调用,并将其移回其原始位置。 因此,现在在获得起始值之后,我将执行打印线命令。 我要睡一秒钟。 我将运行代码。 现在我的经过时间为1.057秒。

结果:

2016-08-05T22:28:42.685Z
2016-08-05T22:28:43.769Z
Elapsed: PT1.084S

为了使它更具可读性,我将使用elapsed.to millis向duration对象的方法添加一个调用。 也就是说,获得毫秒数等效值。 我将以毫秒为单位追加代码,然后运行代码。

结果:

2016-08-05T22:32:52.657Z
2016-08-05T22:32:53.731Z
Elapsed: 1074 milliseconds

结论:
现在,我看到的可读值为1,054毫秒。 因此,这就是Instant类和Duration类。 Java SE 8中的两个核心类,新的日期时间API。

2-表示日期和时间值:

介绍:
之前,我描述了如何在新的日期时间API中使用Instant类来表示Java时间轴中的时刻。 这是另外三个有用的类,分别代表日期和时间的一部分。 它们称为本地日期本地时间本地日期时间 。 例如,假设您只想表示一个日期值。 并且您不在乎时间,秒或毫秒,而只关心当前日期。 创建一个名为LocalDate的类的实例。
运作方式 我正在使用eg.com.tm.java8.features.datetime.localdt项目的Java8Features包。 在名为LocalDateAndTime的类代码中。 主要方法 我将从类LocalDate的名称开始。 当我按Ctrl + Space时 ,我将从java.time包中选择类。 我将对象命名为currentDate并通过localDate.now获得其值。 请注意,在处理即时,日期,时间和日期时间之间,语法上存在一致性。

要在当前计算机上获取当前值,请始终使用now方法。 现在,我将以默认格式输出该日期。 我将保存并运行代码,并以年-月-日格式显示日期

结果:

2016-08-06

您还可以使用特定的年份,月份和日期值创建日期对象。 再一次,我将创建一个类型为LocalDate的对象。 我将其命名为一个specificDate 。 要获取此值,请调用LocalDate.of

并且有几个可用的版本。 我将使用带有三个整数值的那个。 它们没有在文档中命名,但是它们代表年,月和日。 我将修补2,000、1和1的值。现在,在较早版本的date time API中,使用date类。 当您处理几个月时,您总是必须将偏移量设置为0。 因此,对于一月,您将使用0,对于二月1,等等。

这并不是特别直观。 在新的日间时间API中,所有内容均基于1。 因此1表示一月 ,2表示二月 ,依此类推。 就像您通常期望的那样。

我将再次使用系统输出,这次,我将放置新的特定日期。 保存并运行后,我得到的价值是2000年1月1日输入的。

结果:

2016-01-01

如果您只想表示一个时间值,请使用LocalTime类,我将键入该类的名称并将其导入,将其命名为currentTime对象,然后从LocalTime.now获取其值。

同样,使用与localdate和Instant相同的语法。 然后,我将使用系统输出。 我将输出当前时间。 时间的默认值是24小时表示法,它显示小时,分钟,秒和毫秒。

结果:

01:18:11.779

我将使用LocalTime 。 我将其命名为specificTime 。 而且,同样与当地的日期类,我会打电话叫方法of 。 同样,有许多不同的版本采用不同数量的参数。

我将使用寻找三个整数值的版本,并输入14、0和45。然后,将该值输出到控制台。 结果就来了。 14、00和45秒。 请注意,由于我没有提供毫秒值,因此该时间的格式化版本在点后不显示值。

结果:

14:00:45

最后,我将展示如何使用LocalDateTime类。

我将输入类的名称并将其导入。 我将此对象命名为currentDT 。 我将从LocalDateTime.now获得它的值。 输出日期时间值时,将获得长格式的ISO日期时间。 从日期开始,到时间结束。 并且如果值中包含毫秒,则将显示它们。 最后,我将创建一个特定的日期和时间,并将其与特定的日期和时间结合起来。

该代码将类似于下一个代码。 我将创建一个LocalDateTime对象。 我将其命名为specificDT然后再次调用LocalDateTime.of 。 这次,我将使用该方法的第一个版本,该版本接受本地日期对象和本地时间对象。 您还可以根据年份,月份,日期和时间值的组合来构造日期时间值。 我将输入具体的日期和时间。 然后将其输出到控制台。 当我运行该代码时,我的特定日期时间是我的特定日期和时间的组合。

结果:

2016-08-06T01:30:46.625
2016-01-01T14:00:45

结论:
因此,可以使用这三个类来表示当前时区中本地计算机上的日期和时间值。 您还可以使用一些类来获取时区敏感值。 接下来我将描述这些。

3-格式化日期和时间值:

介绍:
前面已经描述了如何使用LocalDateLocalTimeLocalDateTime类表示时间值。 要将这些信息呈现给用户,您需要对其进行格式化。 为此,有一个名为DateTimeFormatter的新类。 我将向您展示如何使用一些简单的语法创建格式化程序。 然后如何使用称为Daytime Formatter Builder的类完成非常自定义的工作。

怎么运行的:
我正在使用eg.com.tm.java8.features.datetime.format项目的Java8Features 。 在名为DateTimeFormater的类代码中。 主要方法

首先,我将创建一个日期。 我给它一种LocalDate ,确保导入该类。 我将其命名为currentDate 。 我将从LocalDate.now获得它的价值。 接下来,我将创建一个格式化程序对象。 我将输入类的名称DateTimeFormatter ,然后从java.time.format包中选择它。 我将此对象命名为df 。 现在有多种创建格式化程序的方法。 最简单的方法之一是使用DateTmeFormatter类的常量。

我将再次输入DateTimeFormatter 。 然后输入句点后,我会看到所有可用常量的列表。 我将选择ISO Date 。 这将为此对象提供默认格式。 然后,我将使用系统输出。 我将调用格式化对象的format方法并传递date对象。 这就是结果。 我正在以年份月份日期格式输出值。 月份和日期分别填充为两个字符。 现在,您可以使用时间和日期时间来做同样的事情。

结果:

2016-08-06

我将使用上面的代码,并将其重复几次,然后进行一些更改。 在第二个版本中,我将类型从本地日期更改为本地时间。 当前时间的对象名称,以及我用来获取本地时间值的类的名称。 我将日期时间格式化程序的名称从DF更改为TF,以进行时间格式化程序。 然后将使用的常量更改为ISO Time 。 然后,我将更改要格式化的对象。 我将确保导入LocalTime类。

然后,我将对第三个版本进行类似的更改。 我这次要使用的类是LocalDateTime 。 我一定会导入它。 我将此对象命名为当前DT。 然后,我将更改从其调用now方法的类。 我将DateTimeFormatter的格式化程序更改为DTF。 然后将常数更改为ISO日期时间。 然后,我将格式化当前的DT对象。 我将确保在每个版本的代码中都使用正确的格式化程序。 我将保存更改,然后运行代码。

并且有三个格式化的值。 到目前为止,我还没有真正做到那么多,因为我使用了代表默认格式的常量。 但是,让我们看一下一些可用的自定义格式。

结果:

2016-08-09
20:37:11.535
2016-08-09T20:37:11.538

我下移到现有代码的下方。 然后我将创建另一个DateTimeFormatter ,将其命名为长日期格式的f_long ,然后通过调用DateTimeFormatter类的一种称为Localized Date的方法来获取其值。

请注意,存在用于日期,时间和日期时间的方法,并带有各种参数。 我将选择一个本地化日期,并传入一个名为FormatStyle的类的常量。 确保导入此类。 然后,键入句点后,您将看到有四个可用常数。 完整,长,中和短。 我将选择长版本,然后通过调用F _ long.format输出格式化的日期,然后传入当前的DT对象。

当我运行此代码时,会得到该日期的长版本。

结果:

August 9, 2016

我将通过复制这两行代码向您展示该版本的另一个版本,对于该版本,我将格式器名称更改为f_short,还将使用的常量也更改为short。 然后,我将更改正在调用的格式化程序的名称。 因此,长版本是阐明的月份名称。 日期后的逗号,然后是四位数字的年份,以及至少对于当前语言环境而言是短版的逗号,是月份和日期,不带填充,并使用斜杠分隔值和两个字符的年份。

结果:

8/9/16

接下来,我将向您展示如何使用语言环境。 我将创建几个字符串。 第一个缩写为fr_ short(法语),采用短格式。 为了获得该值,我将调用f_short格式化程序,然后将使用withLocal()调用方法名称。 为了获得语言环境值,我将使用Local类,这是Java的早期版本中可用的现有类。 它是程序包Java.util的成员。

然后,我可以调用代表各种语言环境的众多常量之一。 我会用法语。 然后从那里,我将调用format方法,并传入当前日期时间。

我将复制该行代码,对于该版本,我将使用fr_long。 我将使用长格式程序,否则代码将相同。 然后,我将输出这两个值fr_shortfr_long

这就是结果。 注意,对于fr_short,月份和日期与美国版本相反。 那是因为在欧洲,日期是第一个陈述的,然后是月份,然后是年份。 当我使用长版本时,我得到的月份是法文拼写的。

结果:

09/08/16
9 août 2016

最后,我将向您展示如何使用称为日期时间格式化程序构建器的类来构建完全自定义格式化程序。 它使用构建器设计模式,您可以在其中调用多个方法,每个方法都返回当前构建器的一个实例。

我将输入类的名称,并确保已将其导入。 我将对象命名为b。 我将使用new关键字和构造方法将其实例化。

现在,在该代码的末尾,我将不会放入分号,因为我想立即调用一系列让我从头开始构建格式化程序的方法。 我将从名为Append Value的方法开始。 请注意,有附加即时,附加文字,附加本地化等许多其他功能。 我将调用一个名为appendValue()的方法,该方法接受一个名为TemporalField的类的实例,然后使用一个名为ChronoField的枚举ChronoField 。 这是从该TemporalField扩展的。

从那里开始,我将使用一年中月份的常量名称。 接下来,我将附加一个文字值。 这可以是任何字符或任何字符串。 为了使它变得完全独特,我将添加几个竖线字符。 现在,我将使用这两行代码并将其复制为第二个版本,而不是一年中的月份。 我会输入一个月中的某天。 请注意,还有星期几和一年中的某天。 然后,我将复制该行代码并将其向下移动。 然后用ChronoField.year完成表达式。

一旦创建了构建器对象,就可以获取格式化程序。 我将创建一个新对象,其类型为DateTimeFormatter 。 我将其命名为Formatter f 。 然后将其称为构建器对象,以格式化程序的方法,最后我将格式化当前日期时间值。 我将使用系统输出并调用f.format() ,并传入currentDT

现在,当我运行代码时,我得到了完全自定义的格式。

结果:

222||9||2016

结论:
您可以使用DateTimeFormatter构建器构建所需的任何格式。 并且由于它使用了构建器设计模式,因此易于创建和维护代码。

4-支持时区偏移量:

介绍:
新的日期时间API提供了许多类,可让您管理时区 。 创建从格林威治时间偏移,通过一定的小时数 ,或者通过特定位置白天对象,计算时区之间的差异

怎么运行的:
我正在使用eg.com.tm.java8.features.datetime.zone项目的Java8Features包。 在名为TimeZones的类代码中。 main方法

在其主要方法中,我创建了一个DateTimeFormatter和一个LocalDateTime对象。 LocalDateTime代表我的系统上当前时区中当前日期和时间 。 那就是埃及时间,因为我在中东。

然后,我将格式化的值输出到控制台。 我正在使用短格式输出值。 在埃及符号中,它是月,日和年。

结果:

8/9/16 10:22 PM

为了表示基于时区的日期时间值,请使用ZonedDateTime类。 就像LocalDateTime一样,它是不可变的并且是线程安全的。 我将输入类的名称,然后按Control + Space来添加import语句。 我将对象gmt命名为格林威治标准时间。

创建此对象有几种不同的方法。 我将向您展示如何创建计算格林威治标准时间的偏移量的对象。 我将再次使用ZonedDateTime类,并在键入句点后,将看到有许多可用的方法。 我可以再次调用now() ,以获取我所在区域的日期时间值。 我可以调用允许进行各种计算的of()方法。 我可以解析字符串,但是我将使用此版本的now方法。 我将传递ZoneId类的实例。

ZoneId表示从格林威治标准时间偏移一定小时数。 我将通过调用名为ZoneId.of()的方法来获得该值。 然后我将传递一个文字字符串“ GMT + 0” 。 这就是说,请向我显示格林威治标准时间的当前日期和时间值。

现在,我将复制将值输出到控制台的代码。 我将其向下移动,并将此版本更改为输出gmt。 我将运行代码,并得到结果。

结果:

8/9/16 8:28 PM

我在中东埃及,现在,格林威治标准时间要提前两个小时。

这是获取ZonedDateTime另一种方法。 假设您想在纽约获得ZoneDateTime。 有许多内置的字符串或常量,它们可以让您命名特定的位置,并且您将获得该位置的正确ZoneId ,而您不必自己担心数学。 我将创建另一个ZonedDateTime对象,这次我将其命名为ny,代表纽约,并且我将通过调用ZonedDateTime.now()获得它的值,然后再次传递Z oneId.of() ,但这一次我要传递一串America / New_York

确保完全按照您在此处看到的字符串进行拼写 。 我将创建一行代码以输出该值。 我将保存更改,然后运行它。 纽约是美国东海岸时间,比太平洋时间早三小时。

结果:

8/9/16 4:36 PM

要找出所有可用的字符串,可以调用ZoneId类的方法,称为getAvailableZoneIds() 。 您将获得一套。 我将输入Set并按Control + Space ,然后从Java.util选择set。

然后将其中的项目的通用类型设置为String 。 我叫设置区。 然后,我将调用方法ZoneId.getAvailableZoneIds 。 然后,我将使用forEach()方法遍历字符串。 然后我将传递Lambda表达式。 因此,我可以依次处理每个项目。

结果:
运行该代码时,我会看到所有可用的字符串。

Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8
Africa/Nairobi
America/Marigot
Asia/Aqtau
Pacific/Kwajalein
America/El_Salvador
Asia/Pontianak
Africa/Cairo
Pacific/Pago_Pago
Africa/Mbabane
Asia/Kuching
Pacific/Honolulu
Pacific/Rarotonga
America/Guatemala
Australia/Hobart
Europe/London
America/Belize
America/Panama
Asia/Chungking
America/Managua
America/Indiana/Petersburg
Asia/Yerevan
Europe/Brussels
GMT
Europe/Warsaw
America/Chicago
Asia/Kashgar
Chile/Continental
Pacific/Yap
CET
Etc/GMT-1
Etc/GMT-0
Europe/Jersey
America/Tegucigalpa
Etc/GMT-5
Europe/Istanbul
America/Eirunepe
Etc/GMT-4
America/Miquelon
Etc/GMT-3
Europe/Luxembourg
Etc/GMT-2
Etc/GMT-9
America/Argentina/Catamarca
Etc/GMT-8
Etc/GMT-7
.................

现在,有太多东西可能很难找到想要的那个。 假设我想寻找伦敦

并在一年中的特定时间为该特定位置使用时区。 正如我在本文前面所展示的,我可以使用predicate来搜索字符串。 我将创建一个谓词对象。 然后将通用类型设置为String 。 我将命名对象条件。 然后,我将使用lambda表达式实现谓词。 我将传入str,然后使用条件实现该谓词。 str。包含,我将经过一系列伦敦。

然后,我将重构我的Lamba表达式。 我将用大括号将System.out.println()包装起来。 然后,我将扩展代码以使其更易于使用。 我将在打印行的末尾添加分号,然后创建一个if语句。 然后将条件设置为condition.test() ,并在z传递当前区域。 我将把p rintln()语句移到条件内,现在只打印与谓词测试匹配的字符串。

我将保存更改并运行代码,并得到结果。 我发现伦敦的正确字符串是:

结果:

Europe/London

结论:
因此,这与处理时区有关。 同样,使用ZonedDateTime类而不是LocalDateTime表示可以修改和计算的值。 ZoneId表示与格林威治标准时间的偏移量。 还有一个名为“区域偏移”的类,您可以用来计算彼此之间的不同时区。
资源:

  1. Java教程,线索:日期时间
  2. LocalDate API
  3. JSR 310:日期和时间API
  4. JSR 337:Java SE 8发行内容
  5. OpenJDK网站
  6. Java平台,标准版8,API规范

我希望您喜欢阅读它,就像我喜欢编写它一样,如果您喜欢它,请分享,传播信息。

翻译自: https://www.javacodegeeks.com/2016/08/java-se-8-new-features-tour-calculating-timespans-new-datetime-api.html

Java SE 8新功能介绍:使用新的DateTime API计算时间跨度相关推荐

  1. java lambda函数_Java SE 8新功能介绍:使用Lambda Expression进行函数式编程

    java lambda函数 " Java SE 8新功能浏览 "系列的这篇文章将深入了解Lambda表达式 . 我将向您展示Lambda表达式的几种不同用法. 它们都具有功能接口的 ...

  2. Java SE 8新功能介绍:使用Streams API处理集合

    使用Java SE 8 Streams的代码更干净,易读且功能强大..... 在" Java SE 8新功能介绍"系列的这篇文章中,我们将深入解释和探索代码,以了解如何使用流遍历集 ...

  3. Java SE 8新功能介绍:Lambda的遍历,过滤,处理集合和方法增强

    在" Java SE 8新功能导览"系列的这篇文章中,我们将深入解释并探索代码,以了解如何使用lambda表达式和方法引用 遍历集合 ,并使用谓词接口过滤它们,实现默认方法在接口中 ...

  4. Java 17 新功能介绍(LTS)

    点赞再看,动力无限.Hello world : ) 微信搜「 程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Ja ...

  5. Java 14 新功能介绍!

    Java 14 新功能介绍! Java 14预定于3月17日发布.那么,14版究竟有什么新功能,对于整天写代码.维护代码的Java开发者来说,哪些功能最有用呢? 作者 | Raoul-Gabriel ...

  6. Java 版本任你发,我用Java8.(Java 15 新功能介绍 )

    Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的. Java 15 官方下载:Archived OpenJDK GA R ...

  7. CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系...

    CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...

  8. grep 模糊匹配_vim 的模糊查找插件 LeaderF 新功能介绍(二)

    前言 本文介绍自<vim 的模糊查找插件 LeaderF 新功能介绍>以后,LeaderF增加的一些新的功能. 异步grep Leaderf rg 此功能已经在<vim的grep插件 ...

  9. TypeScript 3.0 新功能介绍(二)

    2019独角兽企业重金招聘Python工程师标准>>> 转载 TypeScript 3.0 新功能介绍(二) TypeScript 3.0 新功能介绍(二) New unknown ...

最新文章

  1. shell编程基础(2)---与||
  2. linux终端程序如何编写,[LINUX]利用Ncursesw编写支持中文的终端程序
  3. HDOJ 6069 素数筛
  4. uvalive5796(图论、桥、并查集)
  5. Z.ExtensionMethods 一个强大的开源扩展库
  6. C++ 读取windows服务列表 与操作注册表
  7. matlab dwt 多层分解,利用matlab对图片进行多层小波分解 会的加QQ511607771 加过作图之后积分加倍送...
  8. ES6个人小手册,走过路过不要错过。。。。。
  9. 《设计模式详解》创建型模式 - 单例模式
  10. 在线下单系统php源码,PIMS在线订单管理系统v4.2.9
  11. 阮一峰ES6入门读书笔记(十):Proxy
  12. 【SpringMVC注解篇】SpringMVC 注解驱动开发(二)JSON数据交互相关注解
  13. C语言中 整数除法 向上取整的数学证明
  14. 柠檬文案:水果柠檬宣传文案
  15. cocos Creator i18n 多语言
  16. IT项目管理 第六章 驾驭项目成本
  17. Lead项目中简单分析卡号的编码规则
  18. 使压缩文件隐藏在图片格式中的方法(c语言版)--图片合成器
  19. Vue中使用 Aplayer 和 Metingjs 添加音乐插件
  20. 选择并遮住工具(边缘调整工具)+剪切蒙版法,扣除头发丝

热门文章

  1. Oracle入门(五)之基本命令操作
  2. [初级]Java中的switch对整型、字符型、字符串的具体实现细节
  3. JavaScript ECMA
  4. 2019蓝桥杯省赛---java---B---7(外卖店优先级)
  5. 获取笔记本的SHA1的值。
  6. python菱形画法解释_用Python画棱形
  7. 转-聚合查询变慢-详解Elasticsearch的Global Ordinals与High Cardinality
  8. 代理模式(多线程实现状态监控)
  9. how to build a paper's architecture?
  10. feign rest_与Feign客户轻松进行REST通信