My Blog

BaseAPI

记录一些基本的 Java API

学习笔记,仅供参考

参考B站Mirco_Frank - java 进阶 | JDK9 官方详细文档



目录


API (Application Programming Interface) 就是给用户、开发者看的、用的。

而 JavaAPI 就是给 Java 开发者看的用的,一般 API 还伴有 API 文档,它用来给开发者参考、学习。

🔊 Scanner

练习 Scanner 方法

一个文本扫描器,能解析基本的数据类型 (如:int、double、String等)。在解析字符串时,通过分隔符(delimiter) 来进行切割,默认分隔符为空格。

构造器

  • Scanner(System.in) : 扫描系统输入

  • Scanner("Hello world") : 扫描字符串

当然还能扫描 File、Path 等文本源,还能添加参数表示 Charset。

方法

  • close() : 关闭扫描器,再用就异常

  • delimiter() : 获取扫描器的分隔符

  • useDelimiter() : 设置扫描器的分隔符

  • findInLine() : 从文本中查找指定的内容,能找到返回内容,找不到返回空

  • findInLine(Pattern.compile("regexp")) : 用正则来查找

  • findWithinHorizon(String pattern,int horizon) : 根据所给的 pattern(正则) 来检索字符串,horizon 为满足正则的子串之间的最大距离,即在 horizon 之内必须要有满足正则的字串,否则就会进入死循环并返回 null

  • ★ hasNext() : 检查扫描器下一段中是否有 token,有返回 true,无则 false

  • hasNext(String pattern) : 检查扫描器下一段中是否有匹配 pattern 的token,有 true,无 false

  • ★ hasNextInt() : 检查扫描器中下一段中是否是整形值,是 true, 否 false 。其他类型同理

  • ioException() : 返回最近被 Scanner 的 readable 所抛出的异常

  • locale() : 返回扫描器的当前的语言环境,将它交给 Locale 对象,调用方法就可查看本地的信息

  • useLocale() : 设置扫描器的语言环境

  • match() : 返回一个最近匹配操作的匹配结果,实质是一个接口,使用它的方法可查看匹配字符在字符串中的位置信息等

  • ★ next() : 获取一段文本内容,默认是被空格切割的一段

  • next(pattern) : 获取一段满足 pattern(正则) 文本内容

  • ★ nextLine() : 获取回车前的所有内容

区别 : next() 相当于获取一个词,nextLine() 相当于获取一段话

  • ★ nextInt() : 获取下一个整形数值,其他类型同理

  • radix() : 返回是扫描器的使用的进制数

  • useRadix() : 设置扫描器的进制数

  • remove() : 调用该方法抛出 UnsupportedOperationException

  • reset() : 重置扫描器,丢弃之前扫描器所获取的内容,设置均被重置为默认值

  • skip(pattern) : 跳过开头的满足正则的内容,若开头与正则不匹配就会异常 NoSuchElementException


🎱 Number

它是个抽象类,继承自 Object,子类包含有 Integer、Double等基本类型的包装类,它本身没有太多东西,主要是它的这些子类(即包装类)

之所以让基本类型有它们的包装类,就是想让它们能像操作对象一样被操作。包装类都是 final 的,即它们不再被继承。

装箱与拆箱

装箱就是将基本类型的变量赋给包装类对象

拆箱就是将包装类对象赋给基本类型的变量,可以直接赋值或者调用方法赋值

/**
 *  拆箱又分为:自动拆箱和手动拆箱
 *  装箱又分为:自动装箱和手动装箱(X)
 */

 // 1. 自动装箱, 直接赋值
 int baseInt = 2;
 Integer integerA = baseInt;

 // 2. 手动装箱, 调用构造方法,但编译器会提示不必要,所以最后用自动装箱,更简便
 Integer integerB = new Integer(baseInt);  // 构造方法已弃用

 /******************delimiter*********************/

 // 1. 自动拆箱,直接赋值
 int anotherBaseInt1 = integerA;

 // 2. 手动拆箱,调用 intValue() 方法
 int anotherBaseInt2 = integerA.intValue();

 // 3. 拆箱为其他类型,调用 xxxValue() 方法
 double baseDouble = integerA.doubleValue();

下面以 Integer 为例列举一些字段和方法,其他保装类型参考文档。

Integer

字段

  • BYTES : 字节数(4 bytes)

  • MAX_VALUE : 最大值(2^8 - 1)

  • MIN_VALUE : 最小值(-2^8)

  • SIZE : 大小、位数(32 bit)

  • TYPE : 数据类型(int)

方法

练习 Integer 方法

非 static 方法

  • ★ byteValue() : int 值转为 byte 值(-128 ~ 127),超出 byte 范围就会给一个范围内的随机数,其他的同理 xxxValue();

  • compareTo(Integer anotherInteger) : 比较两 Integer 值,大:1,等:0,小:-1

  • ★ toString() : 将 Integer 对象的值转为字符串

static 方法

  • compare(int x, int y) : 比较两整数大小,x 大 1,等 0,小 -1

  • decode(String nm) : 将字符串数字编码为 int 数

  • divideUnsigned(int a, int b) : 返回 a 除 b 的无符号商

  • hightestOneBit(int num) : 返回 num 的二进制数的最高位的数值(如:20(binary: 10100), 即返回 16 )

  • lowestOneBit(int num) : 返回 num 的二进制数的最低位的数值,因此奇数均是 1 ,偶数不定但绝非 1

  • max(int a, int b), min(int a, int b) : 比较两数大小,返回较大的。其实内部调用的是 Math.max() 方法

  • numberOfLeadingZeros​(int i) : 返回指定 int 值的二进制补码表示中最高位(“最左边”)一位之前的零位数。

  • numberOfTrailingZeros​​(int i) : 返回指定 int 值的二进制补码表示中最低位(“最右边”)一位之后的零位数。

例子如下(上面为 leading 的, 下面为 trailing 的):

例子

  • ★ parseInt​(String s) : 将字符串数字解析为十进制整数并返回,如:’20’, ‘+20’, ‘-20’

  • remainderUnsigned​(int dividend, int divisor) : 返回余数,等价于(dividend % divisor)

  • reverse(int num) : 反转一个整数的二进制补码,然后返回反转后的十进制数值

  • rotateLeft​(int i, int distance) : 对 i 左移 distance 位,等价于(i << distance)。rotateRight​(int i, int distance) 同理

  • signum​(int i) : 正负号函数,判断整数的正负零,(如:+20 -> 1;-20 -> -1; 0 -> 0)

  • sum​(int a, int b) : 求两数之和

  • ★ valueOf​(int i) : 将整数转为 Integer 对象,即装箱


💊 Math

类似 C 语言中的 <math.h> ,它的方法全是 static,像工具包一样,直接用类名调方法即可,不必再 new 一个对象使用。

它的方法用来作基本的数学算术运算的

练习 Math Class Methods

字段

Math.PI :   Π 值

Math.E :   自然底数 e 值

基本运算方法

// 1. return the max value
Math.max(int x, int y)

// 2. return the square root of x
Math.sqrt(x)

// 3. return the x^y
Math.pow(x, y)

// 4. return the log value
Math.log(x)

// 5. return the log value base 10
Math.log10(x)

// 6. log1p := log(x + 1) 即 ln(x + 1)
Math.log1p(x)

// 7. expm1 := exp(x) - 1
Math.expm1(x)

// 8. return the absolution value
Math.abs(x)

// 9. 四舍五入
Math.round(x)

// 10. 向上取整 i.e. ceil(29.01) == 30.00
Math.ceil(x)

// 11. 向下取整 i.e. ceil(29.99) == 29.00
Math.floor(x)

// 12. return the random between 0 and 1
Math.random()

// 13. return the closest integer, if have the same distance return the even integer.  i.e. 0.4 -> 0.0 | 0.6 -> 1.0 | 0.5 -> 0.0
Math.rint(x)

// 14. 勾股定理 return (x^2 + y^2)
Math.hypot(x, y)


/***************角度、弧度*********************/

// 15. radians to degrees
Math.toDegrees(Math.PI)

// 16. degrees to radians
Math.toRadians(180.0)


/***************三角函数*********************/

// 17. sin 注:参数必须是弧度型的
Math.sin(Math.PI)

// 18. cos 对于浮点数会有精度丢失,所以会给出一个极其接近 0 的数
Math.cos(Math.toRadians(90.0))

// 19. tan
Math.tan(Math.toRadians(45.0))

👒 Random

用来生成一串伪随机数,在多线程中可以用其子类 ThreadLocalRandom,要想保证数据安全可用其子类 SecureRandom

构造方法

Random(), Random(long seed)   // 可以给生成随机数算法的种子,不给则默认使用当前的 UNIX 时间戳

基本方法

都是要实例生成对象才能使用

  • nextInt()   // 返回一个随机整数

  • nextInt(int bound)   // 返回一个 0 到所给的 bound 之间的整数

  • nextBoolean()   // 随机返回 true 或 false

  • nextDouble()   // 返回 0 - 1 之间的随机数,nextFloat() 同理,当然可以通过对随机数加减乘除来改变其范围,但还可以使用其子类 ThreadLocalRandom 的增强版的方法

  • nextGuassian()   // 返回一个标准正态分布随机数


🎯 ThreadLocalRandom

因为该类的构造器被 private 修饰,所以该类不能实例化。但可以用它的静态方法 current() 来获取一个实例,即这就是 OOP 中 static 的第二用法,单例模式。

所以官方给出它的使用形式:

ThreadLocalRandom.current().nextX(..)   // 这里的 X 指 Int, Long ect.

基本方法

练习使用方法

  • nextInt()   // 随机返回整数

  • nextInt(int bound)   // 随机返回 0 - bound 的整数

  • nextInt(int origin, int bound)   // 随机返回 origin - bound 的整数

nextLong(), nextDouble() 都与 Int 的类似。


🏏 Date

早期的 Date 类有两个功能:

  1. 解析日期,像年、月、日、小时、分钟、秒

  2. 格式化和解析日期字符串

但这些功能都不在能满足国际化的要求,就逐渐被 Calendar class and DateFormat class 取代,Date 中的方法已被弃用

注意 : 在西方国家月份是从 0 开始表示的,0 指一月,1 指二月,以此类推,11 指十二月;星期是从星期天开始,1 指周日,2 指周一,以此类推,7 指周六

UNIX 时间戳,从 1970 年 1 月 1 日开始计时,在 Java 中是以毫秒为单位的,所以在转换时要注意乘除 1000

构造器

练习 Date class

Date()   // 默认将系统当前的 UNIX 时间戳(毫秒)交给对象

Date(long date)   // 传一个 UNIX 时间戳(毫秒)给对象

方法

  • after(Date when)   // 测试所给日期是否在指定日期之后,before 同理

  • clone()   // 返回一个 Object 的复制实例

  • compareTo(Date anotherDate)   // 比较该日期与所给日期的大小,大 1,等 0, 小 -1

  • from(Instant instant)   // 从 Instant 对象中获取一个 Date 日期对象

  • getTime()   // 返回一个 long型 UNIX 时间戳(毫秒)

  • setTime(long time)   // 将当前日期的 UNIX 时间戳设为所给的 time


🔮 DateFormat 和 SimpleDateFormat

由于 DateFormat 是抽象类,所以要么用它的子类 SimpleDateFormat 或静态方法,子类一会再说,先看DateFormat

字段

  • SHORT   // 短样式

  • MIDEUM   // 中样式

  • LONG   // 长样式

  • FULL   // 全样式

下面为各样式效果图

各样式效果图

方法

  • getInstance()   // 返回一个 Date/Time 实例,其实这个实例为 SimpleDateFormat 的对象,并且 Date 和 Time 默认格式为 SHORT 类型,语言环境也是默认本地的

getInstance()返回的对象

扩展 :经过一番搜查才得知返回的是子类对象,也跟它的抽象类属性对上了。但查询中还了解了一些新的知识。

  1. 静态工厂方法 - 除了构造器外另一种获取实例对象的方法。

  2. 父类 对象 = new 子类,会先用父类构造器,再用子类构造器

  3. 抽象类只能实例它的子类对象, 抽象类也能有构造器

  4. 可以用 toString() 来判断某个对象为哪个类的实例

继续看静态方法

  • getIDateInstance()   // 返回 Date 实例

  • getITimeInstance()   // 返回 Time 实例

  • getIDateTimeInstance()   // 返回 DateTime 实例

  • parse(String str)   // 将字符串转为日期,输入的字符串日期格式必须要与本地语言环境一致,不然会抛出 Unparseable Exception


接下来看 SimpleDateFormat 它算是 DateFormat 增强版,在格式化日期或解析字符串日期上功能上,又增加了自定义日期样式和语言环境。它的对象更像是一个格式转化器

中国常见的日期格式:

‘yyyy-MM-dd HH:mm:ss’(如:2022-03-08 15:38:23), 其中月份和小时使要用大写

常用构造器

  • SimpleDateFormat(String pattern)   // 使用给定模式和默认 FORMAT 语言环境的默认日期格式符号

  • SimpleDateFormat​(String pattern, Locale locale)   // 使用给定模式和给定语言环境的日期格式符号

常用方法

  • applyPattern(String pattern)   // 后期添加日期样式

  • format(Date date)   // 根据所给的样式将日期转为字符串,返回字符串

  • format(Date date)   // 根据所给的样式将字符串转为日期,返回 Date ,若格式不对则抛出异常

  • toPattern​()   // 获取对象所使用的日期样式


📆 Calendar

它是个抽象类,继承自 Object,所以同 DateFormat 一样,通过静态方法 getInstance() 获取子类的实例

常用字段

  • DATE   // 一个月的第几天

  • MONTH   // 月份

  • YEAR   // 年份

  • DAY_OF_MONTH   // 一个月的第几天

  • DAY_OF_WEEK   // 一周的第几天(Sunday 开始算)

  • WEEK_OF_YEAR   // 一年的第几周

常用方法

练习 Calendar class

  • add(int field, int amount)   // 给所给字段的当前日期加上 amount 的值,amount 可正可负

  • get(int field)   // 返回所给字段的当前值

  • ★ getTime()   // 返回一个当前日期时间的 Date 对象

  • getTimeInMillis(long millis)   // 返回当前时间的 UNIX 时间戳

  • ★ set(int year, int month, int date)   // 设置 Calendar 字段的值

  • ★ setTime(Date date)   // 将当前时间设置为指定的 date

  • setTimeInMillis(long millis)   // 将当前日期设置为指定的 UNIX时间戳

  • roll(int field, boolean up)   // 是否上滚所给的字段,up : true(field + 1), false(filed - 1);roll(int field, int amount) 与 add() 相同

  • after(Object when) | before(Object when)   // 判断该日期是否在指定日期之后,before 同理

  • clear(int filed)   // 将指定日期字段变为 UNIX 时间戳对应的字段

  • isSet(int filed)   // 判断某日期字段是否被 clear 过,是 true,否 false

  • compareTo(Calendar anotherCalendar)   // 与另一个 Calendar 对象比大小,即比较 UNIX 时间戳大小,大 1;等 0;小 -1


💻 System

System 这个类其实早就接触过,开始 Java 时就用到它的 System.out.println(); 来打印,在 Scanner 中又用到它的 System.in 来接受键盘的输入。下面就正真地来了解 System class

首先它不能被实例化,因为它的构造器为 private ,System 类还提供了标准输入、标准输出和错误输出流功能

字段

  • err   // 标准错误输出流

  • in   // 标准输入流

  • out   // 标准输出流

方法

练习 System 方法

  • arraycopy(Object src, int srcPos, Object dest, int destPos, int length)   // 将所给的源数组,从下标为 srcPos 的元素开始,复制 length 个元素到指定的目标数组,从下标为 destPos 开始,由于返回为空,即复制后的数组就是目标数组

arraycopy

注意 : 对于源数组所取得元素不要超出数组大小,对于目标函数拼接后也不要超出数组大小,否则会抛出数组下标越界异常

  • currentTimeMillis()   // 返回当前时间的 UNIX 时间戳

  • nanoTime()   // 获取以纳秒为单位的高精度时间信息(但准确度未必是 1 纳秒),与 currentTimeMillis() 相比要付出更大的性能代价

  • lineSeparator()   // 返回回车换行的字符串形式,UNIX: “\n”, Win: “\r\n”

  • exit(int status)   // 终止当前运行的 JVM ,status 有三种:exit(0) -> 成功终止,exit(-1) -> 有异常未成功终止,exit(1) -> 未成功终止

  • identityHashCode​(Object x)   // 返回所给对象的 HashCode

identityHashCode 和 hashCode 区别

identityHashCode​() 是根据对象的 物理地址 做运算得出的 hash 值,而被重写的 hashCode() 是根据对象的 内容 得出的 hash 值,未被重写的 hashCode() 则直接调用的 System.identityHashCode​(this)

  • getProperty(String key)   // 返回指定的系统属性字符串

查看具体的系统属性

  • setProperty(String key, String value)   // 设置指定的系统属性,设置值为 value

  • clearProperty(String key)   // 清空指定的系统属性,将其变为 null


以上 API 只是 Java 中的基础 API,后面还会有更多的要学习。从基本的 API 学习中认识到,要以 Java API 文档为本,然后通过网络上列举的例子来学习它们的各种方法特性,所以要善于搜索,勤于练习,渐渐地就熟悉了,没准在这过程中还有意外的收获