跳至主要內容

常用api

javaseapijavase大约 25 分钟

一、api 是什么

(1)概述

API(Application Programming Interface)应用程序接口,是一些预先定义的接口。我们现在理解接口课程很狭隘,因为 jdk 中本身就有接口的概念。

其实我们类的方法,接口的方法在宏观上都能称之为接口。

(2)api 文档

我们现在可以狭义的去理解它,就是一个文档,描述了 jdk 内置类的说明。

文档地址:https://www.matools.com/api/java8

在学习这一章节的时候,千万不要陷入记忆的魔障,api 文档不是用来背的,是用来查的。我们要做到心中大概知道有一个类能实现某一类方法就好了,剩下的我们在使用的时候去查阅就好了。

(3)idea 打包 api doc

image-20210825103101043
image-20210825103101043
image-20210825103122401
image-20210825103122401

为了防止乱码

-encoding utf-8 -charset utf-8

二、时间相关 api

概述

学习时间类我们先要了解两个概念:

1、时间:需要解释的吗?就是 1991 年 4 月 8 日 12 点 12 分 40 秒,时间会因为时区的不同而不同。

2、时区:都学过,都知道东八区吧!

image-20210809160109166
image-20210809160109166

2、时间戳:时间戳是指格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒)起至现在的总毫秒数。时间戳在全世界都是固定的。

格林尼治标(英国伦敦郊区的皇家格林尼治天文台的标准时间)准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治时)的时间。因为本初子午线被定义在通过那里的经线。

System.currentTimeMillis();

我们思考,java 中一切皆对象,那时间也是对象,时区也是对象,但时间戳只是个毫秒数,就是个 Long 类型的数字。

1、Date

(1)初步使用

// 不能引入错误的包哈
import java.util.Date;
public class DateTest {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);
    }
}

结果:
Mon Aug 09 15:46:13 GMT+08:00 2021
// 这是美国表示时间的方法

GMT(Greenwich Mean Time)是格林尼治标准时间 ,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治时)的时间。

+08:00 就是北京时间,这是时间区域的标示,用以区别时间,以英国格林威治标准时间为基准,台湾,香港,中国为往东 8 个时区。

(2)构造方法

Date()

创建一个当时的时间对象,就是 new 的那一瞬间,精确到毫秒。

Date(long date)

创建一个时间对象,需要传入一个时间戳,代表时间戳表示的时间。

其实我们能看到,Date 中的很多的构造器已经被启用了,只留下几个常用的。但是我们不能否认 Date 是十分常用的一个类。我会给大家介绍时间 api 的演进。

image-20210809160955704
image-20210809160955704

(3)常用方法

boolean after(Date when)

测试此日期是否在指定日期之后

boolean before(Date when)

测试此日期是否在指定日期之前

getTime()

返回自 1970 年 1 月 1 日以来,由此 Date 对象表示的 00:00:00 GMT 的毫秒数

image-20210809161151339
image-20210809161151339

其实我们要学习的最重要的是看文档的能力。

小作业(案例):

仅仅使用 Date 类,计算七天后是哪一天:

Date date = new Date(System.currentTimeMillis() + 7*24*60*60*1000);
System.out.println(date);

2、Calendar

(1)简介

一个相对比较新的日期类,Calendar 是一个抽象类,它本身就是日历的意思

image-20210809161855620
image-20210809161855620

(2)初始化

  • Calendar 类是一个日历抽象类,提供了一组对“年月日时分秒星期”等日期信息的操作的函数,并针对不同国家和地区的日历提供了相应的子类,即本地化。比如公历 GregorianCalendar,佛历 BuddhistCalendar,日本帝国历 JapaneseImperialCalendar 等。
  • 从 JDK1.1 版本开始,在处理日期和时间时,系统推荐使用 Calendar 类进行实现(Date 的一些方法都过时了)。在设计上,Calendar 类的功能要比 Date 类强大很多,而且在实现方式上也比 Date 类要复杂一些,下面就介绍一下 Calendar 类的使用。

我们看一下源代码:

public static Calendar getInstance(TimeZone zone,
                                       Locale aLocale)
    {
        return createCalendar(zone, aLocale);
    }

    private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
 ......

        if (aLocale.hasExtensions()) {
            String caltype = aLocale.getUnicodeLocaleType("ca");
            if (caltype != null) {
                switch (caltype) {
                case "buddhist":
                        // BuddhistCalendar
                cal = new BuddhistCalendar(zone, aLocale);
                    break;
                case "japanese":
                        // 日本帝国历
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                    break;
                case "gregory":
                        // 公历
                    cal = new GregorianCalendar(zone, aLocale);
                    break;
                }
            }
        }
    .....
    }

由以上代码我们也能知道,我们可以通过子类直接构造:

Calendar calendar = new GregorianCalendar();
Calendar calendar = new BuddhistCalendar();

(3)常用的方法

记住看文档,其实我们不妨也多去思考一下,日历有什么功能啊:

获得年、月、日?设置年、月、日?比较两个日期,看看星期几?其实这个类的方法特别多。

calendar.get(int field)

用来获取实例化的 Calendar 对象储存的“年月日时分秒星期”等等信息。方法的参数通过 Calendar.XXXX 的形式填写,比如要想获取年份信息就用 Calendar.YEAR、月份 Calendar.MONTH、日期 Calendar.Date、时 Calendar.HOUR、分 Calendar.MINUTE、秒 Calendar.SECOND 等等。

其实参数就是一堆静态常量,1、2、3...

image-20210809173447284
image-20210809173447284

所以你使用calendar.get(1) 也是能够获取到年份的,我们这里就要体会了,静态常量能给我们带来什么好处,问你一下,这里把 final 去掉可以吗?

calendar.set((int field, int value));
calendar.set(int year, int month, int date)

set 方法有很多重载的方法,从 api 文档中我们也能看明白。

具体的参数 field 就是上边的 Calendar.YEAR、Calendar.MONTH....

当然 Calendar 有非常多的方法:

我们可以预览一下:

add(int field, int amount)
根据日历的规则,将指定的时间量添加或减去给定的日历字段。

after(Object when)
返回 Calendar是否 Calendar指定时间之后的时间 Object

before(Object when)
返回此 Calendar是否 Calendar指定的时间之前指定的时间 Object

Date getTime()
返回一个 Date表示此物体 Calendar的时间值(毫秒从偏移 Epoch “)。

long getTimeInMillis()
以毫秒为单位返回此日历的时间值。

TimeZone getTimeZone()
获取时区。

int getWeeksInWeekYear()
返回由这个 Calendar表示的星期内的星期 Calendar

int getWeekYear()
返回这个 Calendar

void setTime(Date date)
使用给定的 Date设置此日历的时间。

void setTimeInMillis(long millis)
从给定的长值设置此日历的当前时间。

void setTimeZone(TimeZone value)
以给定的时区值设置时区。

Instant toInstant()
将此对象转换为Instant

小例子,显示 1949 年 10 月 1 号的时间戳!

Calendar calendar = Calendar.getInstance();
calendar.set(2019,10,1);
long timeInMillis = calendar.getTimeInMillis();
System.out.println(timeInMillis);

结果:1572599846380

3、时区 TimeZone

时区也是通过静态方法获取

System.out.println(TimeZone.getDefault());

打印结果:

sun.util.calendar.ZoneInfo[id="GMT+08:00",offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
static String[]getAvailableIDs()获取支持的所有可用 ID。
static String[]getAvailableIDs(int rawOffset)根据给定的时区偏移(以毫秒为单位)获取可用 ID。
static TimeZonegetDefault()获取 Java 虚拟机的默认值 TimeZone
static TimeZonegetTimeZone(String ID)获取给定 ID 的 TimeZone
static TimeZonegetTimeZone(ZoneId zoneId)获取 TimeZone对于给定 zoneId
static voidsetDefault(TimeZone zone)设置 TimeZone由返回 getDefault方法。

比如现在想获取美国的时间:

注:美国本土横跨西五区至西八区,共四个时区,每个时区对应一个标准时间。以华盛顿的西五区为例,西五区的 id 就是(GMT-05:00);

public static void main(String[] args) {
    System.out.println(new Date());
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeZone(TimeZone.getTimeZone("GMT-08:00"));
    System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
}

结果:

Mon Aug 09 18:20:12 GMT+08:00 2021
5
美国华盛顿的时间是5点,我们的是18点

4、ZoneId

ZoneId 是指区域 ID,可以这样表示 Europe/London Asia/Shanghai America/New_York Japan

也可以这样 GMT+8:00 也行

就是地区的表示方法

Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("America/New_York"));
calendar.setTimeZone(TimeZone.getTimeZone(ZoneId.of("America/New_York")));
System.out.println(calendar);

5、simpleDateFormat

我们有这种需求,将时间显示成 1999 年 10 月 1 号。

java 给我们提供了时间的格式化器。

(2)构造方法

SimpleDateFormat();

用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat

SimpleDateFormat(String pattern);

用给定的模式和日期符号构造 SimpleDateFormat

以下示例显示了如何在美国语言环境中解释日期和时间模式。给定的日期和时间为美国太平洋时区的本地时间 2001-07-04 12:08:56。

image-20210810184847979
image-20210810184847979

时间模式其实就是一种时间显示的格式:

从这张图中我们了解:

  • yyyy 代表年 yy 只显示后两位
  • MM 代表月
  • dd 代表日
  • HH 代表小时 24 小时制 hh 12 小时
  • mm 代表分钟
  • ss 代表秒

yyyy 年 MM 月 dd 日 HH 小时 mm 分 ss 秒 就是一种日期时间模式。

public static void main(String[] args) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日  HH小时mm分ss秒");
    String format = simpleDateFormat.format(new Date());
    System.out.println(format);
}
结果:2021081018小时5154

(3)主要方法

applyPattern(String pattern)

给定的模式字符串应用于此日期格式。

String format(Date date)

将日期格式化成日期/时间字符串。–进行了重写

Date parse(String source)

从给定字符串的开始解析文本以生成日期。–进行了重写

小案例,写一个工具类,能够将时间和字符优雅转化:

三、jdk8 的时间类

在 JDK8 之前,处理日期时间,我们用的都是上边几个类,所谓百足之虫死而不僵,即使上边几个类的方法大面积过时,同时还存在一些问题,比如SimpleDateFormat 不是线程安全的,比如 DateCalendar 获取到的月份是 0 到 11,而不是现实生活中的 1 到 12,我们还是能在绝大部分代码中看到它的影子。

阿里巴巴规约中这样说,如果是 jdk8 的应用,可以使用Instant代替dateLocalDateTime代替CanlendarDateTimeFormatter代替SimpleDateFormat

我们今天就从以下几个类讲讲新的时间类,主要是下面几个:

  1. Instant
  2. LocalDate
  3. LocalTime
  4. LocalDateTime
  5. DateTimeFormatter

1、Instant

在时间线上的瞬间点。

image-20210811142937519
image-20210811142937519

我们会发现,这货又将构造器私有化了。

(1)构造一个 Instant

事实上它给我们提供了很多静态方法,方便我们使用:

image-20210811143150372
image-20210811143150372

既然Instant可以代替Date类,那它肯定可以获取当前时间:

Instant instant = Instant.now();
System.out.println(instant);

2021-08-11T06:24:42.051Z

细心的你会发现,这个时间比北京时间少了 8 个小时,如果要输出北京时间,可以加上默认时区:

System.out.println(instant.atZone(ZoneId.systemDefault()));

2021-08-11T14:24:15.025+08:00[GMT+08:00]

(2)获取时间戳

Instant instant = Instant.now();

// 当前时间戳:单位为秒
System.out.println(instant.getEpochSecond());
// 当前时间戳:单位为毫秒
System.out.println(instant.toEpochMilli());

当然,也可以通过System.currentTimeMillis()获取当前毫秒数。

(3)将时间戳转换为 Instant

根据秒数时间戳转换:

Instant instant = Instant.now();
System.out.println(instant);

long epochSecond = instant.getEpochSecond();
System.out.println(Instant.ofEpochSecond(epochSecond));
System.out.println(Instant.ofEpochSecond(epochSecond, instant.getNano()));

根据毫秒数时间戳转换:

Instant instant = Instant.now();
System.out.println(instant);

long epochMilli = instant.toEpochMilli();
System.out.println(Instant.ofEpochMilli(epochMilli));

(4)将表达式转换为 Instant

String text = "2020-06-10T08:46:55.967Z";
Instant parseInstant = Instant.parse(text);
System.out.println("秒时间戳:" + parseInstant.getEpochSecond());
System.out.println("毫秒时间戳:" + parseInstant.toEpochMilli());
System.out.println("纳秒:" + parseInstant.getNano());

Instant 给我们提供了非常多的实用的方法,我们要独自尝试。

2、Duration

Duration(持续时间)是 TemporalAmount(时间量)的子类。

主要用在,instant 的日期计算

Instant instant = Instant.now();
// 当前的时间加五天
Instant plus = instant.plus(Duration.ofDays(5));
System.out.println(LocalDateTime.ofInstant(plus,ZoneId.systemDefault()));

我们可以轻易的通过 of 方法获取一段持续的时间,用来做计算。

Duration.ofDays(3);
Duration.ofHours(3);
Duration.ofMinutes(3);
Duration.ofSeconds(3);
Duration.ofMillis(3);

// 次方法时通用的,第一个参数是数字,第二个是单位,ChronoUnit是一个枚举类,就是枚举了一堆的时间单位:年月日时分秒。
Duration.of(3, ChronoUnit.YEARS);

3、LocalDate

(1)获取当前日期

使用LocalDate获取当前日期非常简单,如下所示:

System.out.println("LocalDate.now() = " + LocalDate.now());

LocalDate.now() = 2021-08-11

不用任何格式化,输出结果就非常友好,如果使用Date,输出这样的格式,还得配合SimpleDateFormat指定yyyy-MM-dd进行格式化。

(2)获取年月日

LocalDate today = LocalDate.now();
System.out.println("today.getYear() = " + today.getYear());
System.out.println("today.getDayOfWeek() = " + today.getDayOfWeek());
System.out.println("today.getMonth() = " + today.getMonth());


today.getYear() = 2021
today.getDayOfWeek() = WEDNESDAY
today.getMonth() = AUGUST
Month month = today.getMonth();
System.out.println(month.getValue());

我们发现 Month 是一个枚举类,而且 LocalDate 的月份居然是从 1 开始的,从此月份的困扰就解决了。

image-20210811144447836
image-20210811144447836

(3)指定日期

LocalDate birthday = LocalDate.of(1991,7, 16);
System.out.println("birthday: " + birthday);

如果确定月份,推荐使用另一个重载方法,使用枚举指定月份:

LocalDate specifiedDate = LocalDate.of(1991, Month.JULY, 16);

(4)比较日期是否相等

LocalDate localDate1 = LocalDate.now();
LocalDate localDate2 = LocalDate.of(1991,7,16);
if (localDate1.equals(localDate2)) {
    System.out.println("localDate1 equals localDate2");
}

(5)获取日期是本周/本月/本年的第几天

LocalDate today = LocalDate.now();

System.out.println("Today:" + today);
System.out.println("Today is:" + today.getDayOfWeek());
System.out.println("今天是本周的第" + today.getDayOfWeek().getValue() + "天");
System.out.println("今天是本月的第" + today.getDayOfMonth() + "天");
System.out.println("今天是本年的第" + today.getDayOfYear() + "天");

(6)判断是否为闰年

LocalDate today = LocalDate.now();
System.out.println(today.getYear() + " is leap year:" + today.isLeapYear());

4、LocalTime

见名知意,上一个是本地日期,而这里是本地时间。

5、LocalDateTime

见名知意,自学吧,都一样。

6、DateTimeFormatter

JDK8 中推出了java.time.format.DateTimeFormatter来处理日期格式化问题,《阿里巴巴 Java 开发手册》中也是建议使用DateTimeFormatter代替SimpleDateFormat,因为 SimpleDateFormate 不是线程安全的。

LocalDate today = LocalDate.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");

String format = today.format(dateTimeFormatter);
System.out.println(format);

20210811

LocalTime 和 LocalDateTime 自行脑补,DateTimeFormatter 同时给我们提供了很多国际时间格式化的规则,自己看看就行了。

LocalDateTime today = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_DATE_TIME;

String format = today.format(dateTimeFormatter);
System.out.println(format);

2021-08-11T14:55:08.259

7. 类型相互转换

(1)Instant 和 Date

JDK8 中,Date新增了from()方法,将Instant转换为Date,代码如下所示:

Date date = Date.from(instant);
Instant dateToInstant = date.toInstant();

(2)Instance 和 LocalDateTime

LocalDateTime localDateTime = LocalDateTime.ofInstant(instant)
Instant instant1 = LocalDateTime.now().toInstant(ZoneOffset.UTC);

(3)Date 和 LocalDateTime

Date date = new Date();
Instant instant = date.toInstant();
LocalDateTime localDateTimeOfInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
LocalDateTime localDateTime = LocalDateTime.now();
Instant toInstant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
Date dateFromInstant = Date.from(toInstant);

四、数学类

1、Math

System.out.println(Math.E); // 比任何其他值都更接近 e(即自然对数的底数)的 doubl
System.out.println(Math.PI); // 比任何其他值都更接近 pi(即圆的周长与直径之比)的 d
System.out.println(Math.max(1, 2)); // 输出2
System.out.println(Math.min(1.9, -0.2)); // 输出-0.2
System.out.println((int) (Math.random() * 100)); // 输出[0,100
// ceil(a) 返回大于a的第一个整数所对应的浮点数(值是整的,类型是浮点型)
// 可以通过强制转换将类型换成整型
System.out.println(Math.ceil(1.3443)); // 输出2.0
System.out.println((int) Math.ceil(1.3443)); // 输出2
// floor(a) 返回小于a的第一个整数所对应的浮点数(值是整的,类型是浮点型)
System.out.println(Math.floor(1.3443)); // 输出1.0
// rint(a) 返回最接近a的整数的double值
System.out.println(Math.rint(1.2)); // 输出1.0
System.out.println(Math.rint(1.8)); // 输出2.0
System.out.println(Math.sqrt(4.0)); // 输出2.0
System.out.println(Math.cbrt(8.0)); // 输出2.0
System.out.println(Math.abs(-10)); // 输出10

这个类其实超级简单但是不用背诵啊,只要我们能想到的和数学有关系的代码,我们都可以在 Math 中找一找,说不定就会有收获啊。

提示

小知识--静态导入

在 Java 中,我们可以使用静态导入(static import)来导入类中的静态成员(方法和变量),这样就可以直接使用这些静态成员而不需要类名作为前缀。

例如,我们可以使用以下语句导入 Math 类中的所有静态成员:

import static java.lang.Math.*;

public class MathExample {
    public static void main(String[] args) {
        System.out.println("最大值: " + max(5, 10)); // 使用静态导入的 max 方法
        System.out.println("最小值: " + min(5, 10)); // 使用静态导入的 min 方法
        System.out.println("平方根: " + sqrt(25)); // 使用静态导入的 sqrt 方法
        System.out.println("圆周率: " + PI); // 使用静态导入的 PI 常量
    }
}

可以单独导入某个具体的静态成员:

import static java.lang.Math.PI;
import static System.out; // 导入 System.out

public class MathExample {
    public static void main(String[] args) {
        out.println("圆周率: " + PI); // 使用静态导入的 PI 常量
    }
}

2、BigDecimal

(1)为什么不能用 double 表示钱

因为浮点数不能准确代表我们用于货币的基数 10 的倍数。这个问题不仅仅针对 Java,而且还针对任何使用 base 2 浮点类型的编程语言。适用于几乎所有语言的解决方案是改用整数,然后计算分。例如,1025 为$ 10.25。

  • 举一个例子:钱,我们有一百块 五十块 十块 五块 一块 一毛 五毛 一分 ,不知道你见过两分没?
  • 大于零的无所谓,但是一毛钱也就是 0.1 元,二进制是无法表示的,两毛也是,五毛倒是可以,一分又不行了。 至于为什么,我们之前讲浮点数的时候讲过。

在商业计算中要用 java.math.BigDecimal。BigDecimal 所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是 BigDecimal 的对象。

十进制整数在转化成二进制数时不会有精度问题,那么把十进制小数扩大 N 倍让它在整数的维度上进行计算,并保留相应的精度信息。所以本质是记录一个精度信息,使用正数进行计算,然后再转化为二进制数。

(2)构造器

BigDecimal 有很多重载的构造器,我们几乎可以将任何数字相关的类型转化为一个 BigDecimal 对象。

构造器
BigDecimal(int)创建一个具有参数所指定整数值的对象。
BigDecimal(double)创建一个具有参数所指定双精度值的对象。
BigDecimal(long)创建一个具有参数所指定长整数值的对象。
BigDecimal(String)创建一个具有参数所指定以字符串表示的数值的对象。

(3)常用方法

BigDecimal 提供了大量的计算方法,我们举几个例子

BigDecimaladd(BigDecimal)BigDecimal 对象中的值相加,然后返回这个对象。
BigDecimalsubtract(BigDecimal)BigDecimal 对象中的值相减,然后返回这个对象。
BigDecimalmultiply(BigDecimal)BigDecimal 对象中的值相乘,然后返回这个对象。
BigDecimaldivide(BigDecimal)BigDecimal 对象中的值相除,然后返回这个对象。
BigDecimalmax(BigDecimal val)
BigDecimalmin(BigDecimal val)

我们可以从 BigDecimal 中获取对应的值:

返回值方法描述
doubledoubleValue()将 BigDecimal 对象中的值以双精度数返回
floatfloatValue()将 BigDecimal 对象中的值以单精度数返回
longlongValue()将 BigDecimal 对象中的值以长整数返回
intintValue()将 BigDecimal 对象中的值以整数返回

3、Random 类

Random 类位于 java.util.Random 包下,是产生随机数的类。

当然 Math 类的 Random 方法可以生成随机数

https://blog.csdn.net/weixin_37730482/article/details/80664928

(1)构造方法

  1. Random():创建一个新的随机数生成器。

  2. Random(long seed):使用单个 long 种子创建一个新的随机数生成器。

我们可以在构造 Random 对象的时候指定种子。如:Random r1 = new Random(20);

也可以默认当前系统时间的毫秒数作为种子数:Random r1 = new Random();

(2)常用方法

  1. protected int next(int bits):生成下一个伪随机数。

  2. boolean nextBoolean():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。

  3. void nextBytes(byte[] bytes):生成随机字节并将其置于用户提供的 byte 数组中。

  4. double nextDouble():返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 double 值。

  5. float nextFloat():返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布 float 值。

  6. double nextGaussian():返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的 double 值,其平均值是 0.0 标准差是 1.0。

  7. int nextInt():返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。

  8. int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的 int 值。

  9. long nextLong():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。

(3)种子的作用

  • 随机数是种子经过计算生成的。
  • 不含參的构造函数每次都是【当前时间戳】作为种子,随机性更强。
  • 而含参的构造函数其实是伪随机,更有预见性。
public class SeedTest {
    public static void main(String[] args) {
        System.out.println("Random 不含参的构造方法:");
        for (int i = 0; i < 5; i++) {
            Random random = new Random();
            for (int j = 0; j < 8; j++) {
                System.out.print(" " + random.nextInt(100) + ",");
            }
            System.out.println();
        }

        System.out.println("--------------------------------");

        System.out.println("Random 含参的构造方法:");
        for (int i = 0; i < 5; i++) {
            Random random = new Random(50);
            for (int j = 0; j < 8; j++) {
                System.out.print(" " + random.nextInt(100) + ",");
            }
            System.out.println();
        }
    }
}

结论: 我们想多次随机,产生一样的随机数就定义一个种子。

五、工具类

1、Arrays

该类包含用于操作数组的各种方法(如排序和搜索)。 该类还包含一个静态工厂,可以将数组视为列表。

包含了大量的关于数组的工具方法,比如数组拷贝,排序,二分查找等。其实,这里边的每一个方法,我们都能自己实现。

(1)更友好的显示数组

toString(int[] a)
System.out.println(Arrays.toString(nums));
[1, 2, 3, 5, 6, 9]
否则就是:I@1b6d3586

(2)排序

这里的排序算法要远远的胜过我们写的

parallelSort(int[] a);
sort(int[] a);
int[] nums = {1,3,9,2,5,6};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));

[1, 2, 3, 5, 6, 9]

(3)二分查找

binarySearch(int[] a, int key)
int[] nums = {1, 2, 3, 5, 6, 9};
int i = Arrays.binarySearch(nums, 5);
System.out.println(i);

结果:3   这是下标

(4)数组拷贝

copyOf(int[] original, int newLength)
int[] nums = {1, 2, 3, 5, 6, 9};
nums = Arrays.copyOf(nums,10);
System.out.println(Arrays.toString(nums));

结果:[1, 2, 3, 5, 6, 9, 0, 0, 0, 0]
copyOfRange(int[] original, int from, int to)
int[] nums = {1, 2, 3, 5, 6, 9};
nums = Arrays.copyOfRange(nums,0,2);
System.out.println(Arrays.toString(nums));

结果:[1, 2]

(5)两个数组的比较

equals(int[] a, int[] a2)
int[] nums = {1, 2, 3, 5, 6, 9};
int[] nums2 = {1, 2, 3, 5, 6, 9};
System.out.println(Arrays.equals(nums,nums2));

结果:true

其余的方法,可以自行研究。

2、System 类

  //用于垃圾回收
  public static void gc()

  //终止正在运行的java虚拟机。参数用作状态码,根据惯例,非0表示异常终止
  public static void exit(int status)

  //System.out.println(System.currentTimeMillis());
  //返回从1970年1月1日到现在时间的毫秒数(协调时间)
  public static native long currentTimeMillis();
public static native long nanoTime();

  public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
  //src - 源数组。
  //srcPos - 源数组中的起始位置。
  //dest - 目标数组。
  //destPos - 目的地数据中的起始位置。
  //length - 要复制的数组元素的数量。
    public static String getProperty(String key) {
      // 查看系统信息
        checkKey(key);
        @SuppressWarnings("removal")
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertyAccess(key);
        }
        return props.getProperty(key);
    }
System.out.println(System.getProperty("java.version"));
System.out.println(System.getProperty("java.home"));
System.out.println(System.getProperty("os.name"));
System.out.println(System.getProperty("os.version"));
System.out.println(System.getProperty("file.separator"));
System.out.println(System.getProperty("user.name"));

3、Objects

这个咱们看一看,一起读文档学习一下。

private static Properties props;
    private static native Properties initProperties(Properties props);

    /**
     * Determines the current system properties.
     * <p>
     * First, if there is a security manager, its
     * <code>checkPropertiesAccess</code> method is called with no
     * arguments. This may result in a security exception.
     * <p>
     * The current set of system properties for use by the
     * {@link #getProperty(String)} method is returned as a
     * <code>Properties</code> object. If there is no current set of
     * system properties, a set of system properties is first created and
     * initialized. This set of system properties always includes values
     * for the following keys:
     * <table summary="Shows property keys and associated values">
     * <tr><th>Key</th>
     *     <th>Description of Associated Value</th></tr>
     * <tr><td><code>java.version</code></td>
     *     <td>Java Runtime Environment version</td></tr>
     * <tr><td><code>java.vendor</code></td>
     *     <td>Java Runtime Environment vendor</td></tr>
     * <tr><td><code>java.vendor.url</code></td>
     *     <td>Java vendor URL</td></tr>
     * <tr><td><code>java.home</code></td>
     *     <td>Java installation directory</td></tr>
     * <tr><td><code>java.vm.specification.version</code></td>
     *     <td>Java Virtual Machine specification version</td></tr>
     * <tr><td><code>java.vm.specification.vendor</code></td>
     *     <td>Java Virtual Machine specification vendor</td></tr>
     * <tr><td><code>java.vm.specification.name</code></td>
     *     <td>Java Virtual Machine specification name</td></tr>
     * <tr><td><code>java.vm.version</code></td>
     *     <td>Java Virtual Machine implementation version</td></tr>
     * <tr><td><code>java.vm.vendor</code></td>
     *     <td>Java Virtual Machine implementation vendor</td></tr>
     * <tr><td><code>java.vm.name</code></td>
     *     <td>Java Virtual Machine implementation name</td></tr>
     * <tr><td><code>java.specification.version</code></td>
     *     <td>Java Runtime Environment specification  version</td></tr>
     * <tr><td><code>java.specification.vendor</code></td>
     *     <td>Java Runtime Environment specification  vendor</td></tr>
     * <tr><td><code>java.specification.name</code></td>
     *     <td>Java Runtime Environment specification  name</td></tr>
     * <tr><td><code>java.class.version</code></td>
     *     <td>Java class format version number</td></tr>
     * <tr><td><code>java.class.path</code></td>
     *     <td>Java class path</td></tr>
     * <tr><td><code>java.library.path</code></td>
     *     <td>List of paths to search when loading libraries</td></tr>
     * <tr><td><code>java.io.tmpdir</code></td>
     *     <td>Default temp file path</td></tr>
     * <tr><td><code>java.compiler</code></td>
     *     <td>Name of JIT compiler to use</td></tr>
     * <tr><td><code>java.ext.dirs</code></td>
     *     <td>Path of extension directory or directories
     *         <b>Deprecated.</b> <i>This property, and the mechanism
     *            which implements it, may be removed in a future
     *            release.</i> </td></tr>
     * <tr><td><code>os.name</code></td>
     *     <td>Operating system name</td></tr>
     * <tr><td><code>os.arch</code></td>
     *     <td>Operating system architecture</td></tr>
     * <tr><td><code>os.version</code></td>
     *     <td>Operating system version</td></tr>
     * <tr><td><code>file.separator</code></td>
     *     <td>File separator ("/" on UNIX)</td></tr>
     * <tr><td><code>path.separator</code></td>
     *     <td>Path separator (":" on UNIX)</td></tr>
     * <tr><td><code>line.separator</code></td>
     *     <td>Line separator ("\n" on UNIX)</td></tr>
     * <tr><td><code>user.name</code></td>
     *     <td>User's account name</td></tr>
     * <tr><td><code>user.home</code></td>
     *     <td>User's home directory</td></tr>
     * <tr><td><code>user.dir</code></td>
     *     <td>User's current working directory</td></tr>
     * </table>
     * <p>
     * Multiple paths in a system property value are separated by the path
     * separator character of the platform.
     * <p>
     * Note that even if the security manager does not permit the
     * <code>getProperties</code> operation, it may choose to permit the
     * {@link #getProperty(String)} operation.
     *
     * @return     the system properties
     * @exception  SecurityException  if a security manager exists and its
     *             <code>checkPropertiesAccess</code> method doesn't allow access
     *              to the system properties.
     * @see        #setProperties
     * @see        java.lang.SecurityException
     * @see        java.lang.SecurityManager#checkPropertiesAccess()
     * @see        java.util.Properties
     */
    public static Properties getProperties() {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertiesAccess();
        }

        return props;
    }

六、其他

1、StringBuffer 和 StringBuilder

可变的字符序列,这个 String 是有本质的区别的

构造器说明
StringBuilder()构造一个没有字符的字符串构建器,初始容量为 16 个字符。
StringBuilder(CharSequence seq)构造一个包含与指定的相同字符的字符串构建器 CharSequence
StringBuilder(int capacity)构造一个没有字符的字符串构建器,由 capacity参数指 定的初始容量
StringBuilder(String str)构造一个初始化为指定字符串内容的字符串构建器。

首先这两个类有大量的重载方法,一个是 append

image-20210811152631410
image-20210811152631410

还有 insert

image-20210811152653212
image-20210811152653212

和 String 一样,它还有一些好用的方法:

返回值方法描述
Stringsubstring(int start)截取指定位置开始到最后的字符串
Stringsubstring(int start, int end)截取字符串
StringBuilderreverse() 。字符序列反转
intlastIndexOf(String str)返回指定子字符串最右边出现的字符串内的索引
StringBuilderdelete(int start, int end)删除此序列的子字符串中的字符。
StringBuilderdeleteCharAt(int index)删除 char 在这个序列中的指定位置。
StringtoString()转为 String

七、附表

可用的 ZoneId

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
Etc/GMT-6
Europe/Zaporozhye
Canada/Yukon
Canada/Atlantic
Atlantic/St_Helena
Australia/Tasmania
Libya
Europe/Guernsey
America/Grand_Turk
US/Pacific-New
Asia/Samarkand
America/Argentina/Cordoba
Asia/Phnom_Penh
Africa/Kigali
Asia/Almaty
US/Alaska
Asia/Dubai
Europe/Isle_of_Man
America/Araguaina
Cuba
Asia/Novosibirsk
America/Argentina/Salta
Etc/GMT+3
Africa/Tunis
Etc/GMT+2
Etc/GMT+1
Pacific/Fakaofo
Africa/Tripoli
Etc/GMT+0
Israel
Africa/Banjul
Etc/GMT+7
Indian/Comoro
Etc/GMT+6
Etc/GMT+5
Etc/GMT+4
Pacific/Port_Moresby
US/Arizona
Antarctica/Syowa
Indian/Reunion
Pacific/Palau
Europe/Kaliningrad
America/Montevideo
Africa/Windhoek
Asia/Karachi
Africa/Mogadishu
Australia/Perth
Brazil/East
Etc/GMT
Asia/Chita
Pacific/Easter
Antarctica/Davis
Antarctica/McMurdo
Asia/Macao
America/Manaus
Africa/Freetown
Europe/Bucharest
Asia/Tomsk
America/Argentina/Mendoza
Asia/Macau
Europe/Malta
Mexico/BajaSur
Pacific/Tahiti
Africa/Asmera
Europe/Busingen
America/Argentina/Rio_Gallegos
Africa/Malabo
Europe/Skopje
America/Catamarca
America/Godthab
Europe/Sarajevo
Australia/ACT
GB-Eire
Africa/Lagos
America/Cordoba
Europe/Rome
Asia/Dacca
Indian/Mauritius
Pacific/Samoa
America/Regina
America/Fort_Wayne
America/Dawson_Creek
Africa/Algiers
Europe/Mariehamn
America/St_Johns
America/St_Thomas
Europe/Zurich
America/Anguilla
Asia/Dili
America/Denver
Africa/Bamako
Europe/Saratov
GB
Mexico/General
Pacific/Wallis
Europe/Gibraltar
Africa/Conakry
Africa/Lubumbashi
Asia/Istanbul
America/Havana
NZ-CHAT
Asia/Choibalsan
America/Porto_Acre
Asia/Omsk
Europe/Vaduz
US/Michigan
Asia/Dhaka
America/Barbados
Europe/Tiraspol
Atlantic/Cape_Verde
Asia/Yekaterinburg
America/Louisville
Pacific/Johnston
Pacific/Chatham
Europe/Ljubljana
America/Sao_Paulo
Asia/Jayapura
America/Curacao
Asia/Dushanbe
America/Guyana
America/Guayaquil
America/Martinique
Portugal
Europe/Berlin
Europe/Moscow
Europe/Chisinau
America/Puerto_Rico
America/Rankin_Inlet
Pacific/Ponape
Europe/Stockholm
Europe/Budapest
America/Argentina/Jujuy
Australia/Eucla
Asia/Shanghai
Universal
Europe/Zagreb
America/Port_of_Spain
Europe/Helsinki
Asia/Beirut
Asia/Tel_Aviv
Pacific/Bougainville
US/Central
Africa/Sao_Tome
Indian/Chagos
America/Cayenne
Asia/Yakutsk
Pacific/Galapagos
Australia/North
Europe/Paris
Africa/Ndjamena
Pacific/Fiji
America/Rainy_River
Indian/Maldives
Australia/Yancowinna
SystemV/AST4
Asia/Oral
America/Yellowknife
Pacific/Enderbury
America/Juneau
Australia/Victoria
America/Indiana/Vevay
Asia/Tashkent
Asia/Jakarta
Africa/Ceuta
Asia/Barnaul
America/Recife
America/Buenos_Aires
America/Noronha
America/Swift_Current
Australia/Adelaide
America/Metlakatla
Africa/Djibouti
America/Paramaribo
Europe/Simferopol
Europe/Sofia
Africa/Nouakchott
Europe/Prague
America/Indiana/Vincennes
Antarctica/Mawson
America/Kralendijk
Antarctica/Troll
Europe/Samara
Indian/Christmas
America/Antigua
Pacific/Gambier
America/Indianapolis
America/Inuvik
America/Iqaluit
Pacific/Funafuti
UTC
Antarctica/Macquarie
Canada/Pacific
America/Moncton
Africa/Gaborone
Pacific/Chuuk
Asia/Pyongyang
America/St_Vincent
Asia/Gaza
Etc/Universal
PST8PDT
Atlantic/Faeroe
Asia/Qyzylorda
Canada/Newfoundland
America/Kentucky/Louisville
America/Yakutat
Asia/Ho_Chi_Minh
Antarctica/Casey
Europe/Copenhagen
Africa/Asmara
Atlantic/Azores
Europe/Vienna
ROK
Pacific/Pitcairn
America/Mazatlan
Australia/Queensland
Pacific/Nauru
Europe/Tirane
Asia/Kolkata
SystemV/MST7
Australia/Canberra
MET
Australia/Broken_Hill
Europe/Riga
America/Dominica
Africa/Abidjan
America/Mendoza
America/Santarem
Kwajalein
America/Asuncion
Asia/Ulan_Bator
NZ
America/Boise
Australia/Currie
EST5EDT
Pacific/Guam
Pacific/Wake
Atlantic/Bermuda
America/Costa_Rica
America/Dawson
Asia/Chongqing
Eire
Europe/Amsterdam
America/Indiana/Knox
America/North_Dakota/Beulah
Africa/Accra
Atlantic/Faroe
Mexico/BajaNorte
America/Maceio
Etc/UCT
Pacific/Apia
GMT0
America/Atka
Pacific/Niue
Australia/Lord_Howe
Europe/Dublin
Pacific/Truk
MST7MDT
America/Monterrey
America/Nassau
America/Jamaica
Asia/Bishkek
America/Atikokan
Atlantic/Stanley
Australia/NSW
US/Hawaii
SystemV/CST6
Indian/Mahe
Asia/Aqtobe
America/Sitka
Asia/Vladivostok
Africa/Libreville
Africa/Maputo
Zulu
America/Kentucky/Monticello
Africa/El_Aaiun
Africa/Ouagadougou
America/Coral_Harbour
Pacific/Marquesas
Brazil/West
America/Aruba
America/North_Dakota/Center
America/Cayman
Asia/Ulaanbaatar
Asia/Baghdad
Europe/San_Marino
America/Indiana/Tell_City
America/Tijuana
Pacific/Saipan
SystemV/YST9
Africa/Douala
America/Chihuahua
America/Ojinaga
Asia/Hovd
America/Anchorage
Chile/EasterIsland
America/Halifax
Antarctica/Rothera
America/Indiana/Indianapolis
US/Mountain
Asia/Damascus
America/Argentina/San_Luis
America/Santiago
Asia/Baku
America/Argentina/Ushuaia
Atlantic/Reykjavik
Africa/Brazzaville
Africa/Porto-Novo
America/La_Paz
Antarctica/DumontDUrville
Asia/Taipei
Antarctica/South_Pole
Asia/Manila
Asia/Bangkok
Africa/Dar_es_Salaam
Poland
Atlantic/Madeira
Antarctica/Palmer
America/Thunder_Bay
Africa/Addis_Ababa
Asia/Yangon
Europe/Uzhgorod
Brazil/DeNoronha
Asia/Ashkhabad
Etc/Zulu
America/Indiana/Marengo
America/Creston
America/Punta_Arenas
America/Mexico_City
Antarctica/Vostok
Asia/Jerusalem
Europe/Andorra
US/Samoa
PRC
Asia/Vientiane
Pacific/Kiritimati
America/Matamoros
America/Blanc-Sablon
Asia/Riyadh
Iceland
Pacific/Pohnpei
Asia/Ujung_Pandang
Atlantic/South_Georgia
Europe/Lisbon
Asia/Harbin
Europe/Oslo
Asia/Novokuznetsk
CST6CDT
Atlantic/Canary
America/Knox_IN
Asia/Kuwait
SystemV/HST10
Pacific/Efate
Africa/Lome
America/Bogota
America/Menominee
America/Adak
Pacific/Norfolk
Europe/Kirov
America/Resolute
Pacific/Tarawa
Africa/Kampala
Asia/Krasnoyarsk
Greenwich
SystemV/EST5
America/Edmonton
Europe/Podgorica
Australia/South
Canada/Central
Africa/Bujumbura
America/Santo_Domingo
US/Eastern
Europe/Minsk
Pacific/Auckland
Africa/Casablanca
America/Glace_Bay
Canada/Eastern
Asia/Qatar
Europe/Kiev
Singapore
Asia/Magadan
SystemV/PST8
America/Port-au-Prince
Europe/Belfast
America/St_Barthelemy
Asia/Ashgabat
Africa/Luanda
America/Nipigon
Atlantic/Jan_Mayen
Brazil/Acre
Asia/Muscat
Asia/Bahrain
Europe/Vilnius
America/Fortaleza
Etc/GMT0
US/East-Indiana
America/Hermosillo
America/Cancun
Africa/Maseru
Pacific/Kosrae
Africa/Kinshasa
Asia/Kathmandu
Asia/Seoul
Australia/Sydney
America/Lima
Australia/LHI
America/St_Lucia
Europe/Madrid
America/Bahia_Banderas
America/Montserrat
Asia/Brunei
America/Santa_Isabel
Canada/Mountain
America/Cambridge_Bay
Asia/Colombo
Australia/West
Indian/Antananarivo
Australia/Brisbane
Indian/Mayotte
US/Indiana-Starke
Asia/Urumqi
US/Aleutian
Europe/Volgograd
America/Lower_Princes
America/Vancouver
Africa/Blantyre
America/Rio_Branco
America/Danmarkshavn
America/Detroit
America/Thule
Africa/Lusaka
Asia/Hong_Kong
Iran
America/Argentina/La_Rioja
Africa/Dakar
SystemV/CST6CDT
America/Tortola
America/Porto_Velho
Asia/Sakhalin
Etc/GMT+10
America/Scoresbysund
Asia/Kamchatka
Asia/Thimbu
Africa/Harare
Etc/GMT+12
Etc/GMT+11
Navajo
America/Nome
Europe/Tallinn
Turkey
Africa/Khartoum
Africa/Johannesburg
Africa/Bangui
Europe/Belgrade
Jamaica
Africa/Bissau
Asia/Tehran
WET
Europe/Astrakhan
Africa/Juba
America/Campo_Grande
America/Belem
Etc/Greenwich
Asia/Saigon
America/Ensenada
Pacific/Midway
America/Jujuy
Africa/Timbuktu
America/Bahia
America/Goose_Bay
America/Virgin
America/Pangnirtung
Asia/Katmandu
America/Phoenix
Africa/Niamey
America/Whitehorse
Pacific/Noumea
Asia/Tbilisi
America/Montreal
Asia/Makassar
America/Argentina/San_Juan
Hongkong
UCT
Asia/Nicosia
America/Indiana/Winamac
SystemV/MST7MDT
America/Argentina/ComodRivadavia
America/Boa_Vista
America/Grenada
Asia/Atyrau
Australia/Darwin
Asia/Khandyga
Asia/Kuala_Lumpur
Asia/Famagusta
Asia/Thimphu
Asia/Rangoon
Europe/Bratislava
Asia/Calcutta
America/Argentina/Tucuman
Asia/Kabul
Indian/Cocos
Japan
Pacific/Tongatapu
America/New_York
Etc/GMT-12
Etc/GMT-11
Etc/GMT-10
SystemV/YST9YDT
Europe/Ulyanovsk
Etc/GMT-14
Etc/GMT-13
W-SU
America/Merida
EET
America/Rosario
Canada/Saskatchewan
America/St_Kitts
Arctic/Longyearbyen
America/Fort_Nelson
America/Caracas
America/Guadeloupe
Asia/Hebron
Indian/Kerguelen
SystemV/PST8PDT
Africa/Monrovia
Asia/Ust-Nera
Egypt
Asia/Srednekolymsk
America/North_Dakota/New_Salem
Asia/Anadyr
Australia/Melbourne
Asia/Irkutsk
America/Shiprock
America/Winnipeg
Europe/Vatican
Asia/Amman
Etc/UTC
SystemV/AST4ADT
Asia/Tokyo
America/Toronto
Asia/Singapore
Australia/Lindeman
America/Los_Angeles
SystemV/EST5EDT
Pacific/Majuro
America/Argentina/Buenos_Aires
Europe/Nicosia
Pacific/Guadalcanal
Europe/Athens
US/Pacific
Europe/Monaco