BaseAPI
记录一些基本的 Java API
学习笔记,仅供参考
目录
API (Application Programming Interface) 就是给用户、开发者看的、用的。
而 JavaAPI 就是给 Java 开发者看的用的,一般 API 还伴有 API 文档,它用来给开发者参考、学习。
🔊 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,无则 falsehasNext(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()
: 调用该方法抛出 UnsupportedOperationExceptionreset()
: 重置扫描器,丢弃之前扫描器所获取的内容,设置均被重置为默认值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)
方法:
非 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,小 -1decode(String nm)
: 将字符串数字编码为 int 数divideUnsigned(int a, int b)
: 返回 a 除 b 的无符号商hightestOneBit(int num)
: 返回 num 的二进制数的最高位的数值(如:20(binary: 10100), 即返回 16 )lowestOneBit(int num)
: 返回 num 的二进制数的最低位的数值,因此奇数均是 1 ,偶数不定但绝非 1max(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.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 或 falsenextDouble()
// 返回 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 类有两个功能:
解析日期,像年、月、日、小时、分钟、秒
格式化和解析日期字符串
但这些功能都不在能满足国际化的要求,就逐渐被 Calendar
class and DateFormat
class 取代,Date 中的方法已被弃用
注意 : 在西方国家月份是从 0 开始表示的,0 指一月,1 指二月,以此类推,11 指十二月;星期是从星期天开始,1 指周日,2 指周一,以此类推,7 指周六
UNIX 时间戳,从 1970 年 1 月 1 日开始计时,在 Java 中是以毫秒为单位的,所以在转换时要注意乘除 1000
构造器
Date()
// 默认将系统当前的 UNIX 时间戳(毫秒)交给对象
Date(long date)
// 传一个 UNIX 时间戳(毫秒)给对象
方法
after(Date when)
// 测试所给日期是否在指定日期之后,before 同理clone()
// 返回一个 Object 的复制实例compareTo(Date anotherDate)
// 比较该日期与所给日期的大小,大 1,等 0, 小 -1from(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
类型,语言环境也是默认本地的
扩展 :经过一番搜查才得知返回的是子类对象,也跟它的抽象类属性对上了。但查询中还了解了一些新的知识。
静态工厂方法
- 除了构造器外另一种获取实例对象的方法。父类 对象 = new 子类,会先用父类构造器,再用子类构造器
抽象类只能实例它的子类对象, 抽象类也能有构造器
可以用 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
// 一年的第几周
常用方法
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)
// 将当前时间设置为指定的 datesetTimeInMillis(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,否 falsecompareTo(Calendar anotherCalendar)
// 与另一个 Calendar 对象比大小,即比较 UNIX 时间戳大小,大 1;等 0;小 -1
💻 System
System 这个类其实早就接触过,开始 Java 时就用到它的 System.out.println();
来打印,在 Scanner 中又用到它的 System.in
来接受键盘的输入。下面就正真地来了解 System class
首先它不能被实例化,因为它的构造器为 private
,System 类还提供了标准输入、标准输出和错误输出流功能
字段
err
// 标准错误输出流in
// 标准输入流out
// 标准输出流
方法
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
// 将所给的源数组,从下标为 srcPos 的元素开始,复制 length 个元素到指定的目标数组,从下标为 destPos 开始,由于返回为空,即复制后的数组就是目标数组
注意 : 对于源数组所取得元素不要超出数组大小,对于目标函数拼接后也不要超出数组大小,否则会抛出数组下标越界异常
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)
// 设置指定的系统属性,设置值为 valueclearProperty(String key)
// 清空指定的系统属性,将其变为 null
以上 API 只是 Java 中的基础 API,后面还会有更多的要学习。从基本的 API 学习中认识到,要以 Java API 文档为本,然后通过网络上列举的例子来学习它们的各种方法特性,所以要善于搜索,勤于练习,渐渐地就熟悉了,没准在这过程中还有意外的收获