今天看啥  ›  专栏  ›  AT阿宝哥

《阿宝哥的JavaSE笔记》之19:常用API

AT阿宝哥  · 简书  ·  · 2019-12-26 15:58

通过前面章节的学习,我们已经学习了Java基本语法已经面向对象思想。其中包括类结构、词法结构、修饰符、数据类型、运算符,流程控制、类关系,继承、抽象、接口、Object类、多态、异常处理等。如果掌握了这些知识,在后续章节中,我们就可以通过查询Java API去使用已有的类和接口进行编程。当然,也有一些相对复杂的API,如IO、多线程、网络、泛型和反射等,它们在目前很多市面流行书籍中被称之为“高级编程”,我们将在后续章节逐一学习。

判断一门编程语言是否强大,有一个非常重要的衡量指标,那就是看它提供的可用函数库或类库是否丰富。JavaSE提供了丰富的类库,但是,要深刻理解并在实际项目开发中运用好它们,就一定要养成查阅Oracle官方API帮助文档的良好习惯。这些常用API所在的包为:

java.lang
提供利用 Java 编程语言进行程序设计的基础类。

java.util
包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。

java.io
通过数据流、序列化和文件系统提供系统输入和输出。

java.sql
提供使用Java编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。

java.text
提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。

java.math
提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。

1、基本数学运算

package java.lang;

public final class Math 
    extends Object{
    
}

java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数,而且这些方法都是static方法,可以直接使用Math.方法名()来调用。

另外,Math类还有两个静态属性:E和PI,可以直接使用Math.静态属性名来使用。其中,E代表比任何其他值都更接近 e(即自然对数的底数)的 double 值2.7182818284590452354,而PI代表比任何其他值都更接近 圆周率pi(即圆的周长与直径之比)的 double 值3.14159265358979323846。

Math类常用静态方法

Math.abs 求绝对值
Math.sin 正弦函数 Math.asin 反正弦函数
Math.cos 余弦函数 Math.acos 反余弦函数
Math.tan 正切函数 Math.atan 反正切函数
Math.toDegrees 弧度转化为角度
Math.toRadians 角度转化为弧度
Math.ceil 得到不小于某数的最大整数
Math.floor 得到不大于某数的最大整数
Math.max 求两数中最大
Math.min 求两数中最小
Math.sqrt 求开方
Math.pow 求某数的任意次方, 抛出ArithmeticException处理溢出异常
Math.exp 求e的任意次方
Math.log10 以10为底的对数
Math.log 自然对数
Math.rint 求距离某数最近的整数(可能比某数大,也可能比它小)
Math.round 同上,返回int型或者long型(上一个函数返回double型)
Math.random 返回0,1之间的一个随机数

2、时间、日期和日历

在实际工作过程中,时间、日期是非常常见的类型。

2.1、Date类

package java.util;

public class Date
    implements java.io.Serializable, Cloneable, Comparable<Date>{

}

类 Date 表示特定的瞬间,精确到毫秒。

2.2、DateFormat类

package java.text;

public abstract class DateFormat 
    extends Format {

}

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年 1 月 1 日 00:00:00 这一刻开始的毫秒数。

2.3、SimpleDateFormat类

package java.text;

public class SimpleDateFormat 
    extends DateFormat {

}

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

2.4、Calendar类

package java.util;

public abstract class Calendar 
    implements Serializable, Cloneable, Comparable<Calendar> {

}

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

2.5、Java中日期的常见处理

创建日期
日期格式化显示
日期的转换(主要是和字符串之间的相互转换)
日期中年、月、日、时、分、秒、星期、月份等获取。
日期的大小比较、日期的加减。

3、任意精度整数算法和小数算法

如果我们需要保存的数据非常大,超出了基本数据类型的范围,可以考虑大整数对象。

BigInteger类使用的原因
8种基本数据类型中,long类型所能表示的整数范围是最大的,但还是有限的。
为了解决这些问题,Java中专门提供了用来进行不限制大小的整数计算的类——java.math.BigInteger。
该类可以对任意大小的整数进行操作,不过在进行计算的时候是通过方法调用进行的,而不是使用算术运算符

BigInteger类--构造方法
BigInteger(byte[] val):使用一个byte数组表示来构造一个大整数,
BigInteger(int signum, byte[] magnitude):用一个byte数组magnitude来构造大整数,用signum的-1,0,1来表示负,零,正。
BigInteger(int bitLength, int certainty, Random rnd):构造一个随机产生的,正的,指定长度的,可能是素数的大整数,参数certainty指明要进行多少次素数测试.
BigInteger(int numBits, Random rnd):构造一个随机产生的大整数,范围在0到2^numBits – 1之间.

BigInteger类--构造方法
BigInteger(String val):转换十进制的字符串表达方式为BigInteger这个字符串由一系列的10进制数字和可选择的负号组成符转数字的映射由Character.digit实现这个字符串不能包含任意无关字符(例如:空格)
BigInteger(String val, int radix):转换字符串的表达式为指定(radix)进制的大整数这个字符串由一系列的指定进制(radix)的数字组成,任意跟上负号字符转数字的映射由Character.digit实现同样,这个字符串不能包含任意无关字符(例如:空格)

BigInteger的方法--四则运算实现
add(BigInteger val) 返回其值为 (this + val) 的 BigInteger。
subtract(BigInteger val) 返回其值为 (this - val) 的 BigInteger。
multiply(BigInteger val) 返回其值为 (this * val) 的 BigInteger。
divide(BigInteger val) 返回其值为 (this / val) 的 BigInteger。
remainder(BigInteger val) 返回其值为 (this % val) 的 BigInteger
mod(BigInteger m) 返回其值为 (this mod m) 的 BigInteger。

add方法和subtract方法实际上进行的是数组对位相加和相减,这个过程用私有的函数来完成,返回的是为此重新分配空间的结果数组索引值(数组首地址)。然后再用结果数组来构造一个BigInteger作为最后的返回值。
multiply方法使用的是数组相乘,用数组来模拟数字相乘,同样使用一个私有的函数来完成这个过程,为相乘结果数组分配新的空间,最后用结果数组来构造一个BigInteger 作为返回值。

BigInteger(byte[] val)
使用一个byte数组表示来构造一个大整数,
例:
byte[] val = new byte[2];
for(int i= 0;i<2;i++)
val[i]=2;
BigInteger firsttest= new BigInteger(vval);
System.out.println("firsttest:"+firsttest);
打印的结果是514,514的二进制表示是10,00000010
②BigInteger(int signum, byte[] magnitude) �用一个byte数组magnitude来构造大整数,用signum的-1,0,1来表示负,零,正。
例:
byte[] magnitude = new byte[2];
for(int i= 0;i<2;i++)
magnitude [i]=1;
BigInteger secondtest= new BigInteger(-1,magnitude);
System.out.println("secondtest:"+secondtest);
打印的结果是-257.
257的二进制是1,00000001
③BigInteger(int bitLength, int certainty, Random rnd)
构造一个随机产生的,正的,指定长度的,可能是素数的大整数,参数certainty指明要进行多少次素数测试.(使用的素数产生方法probablePrime()下文叙述)
例:
Random rr= new Random();
BigInteger thirdtest= new BigInteger(100,10,rr);
System.out.println("thirdtest:"+thirdtest);
bitLength指的是位长,即是转换为2进制有多少位。
④BigInteger(int numBits, Random rnd)
构造一个随机产生的大整数,范围在0到2^numBits – 1之间.
例:
Random rr = new Random();
BigInteger fourthtest = new BigInteger(100,rr);
System.out.println("fourthtest:"+fourthtest)
numBit指的也是位长。
注意:这个构造函数总是用来产生非负的BigInteger。
⑤BigInteger(String val)
转换十进制的字符串表达方式为BigInteger
这个字符串由一系列的10进制数字和可选择的负号组成
字符转数字的映射由Character.digit实现
这个字符串不能包含任意无关字符(例如:空格)
例:
BigInteger fifthtest = new BigInteger(“12345678901”);
System.out.println(“fifthtest”+fifthtest);
这是最常用的构造函数.
⑥BigInteger(String val, int radix)
转换字符串的表达式为指定(radix)进制的大整数
这个字符串由一系列的指定进制(radix)的数字组成,任意跟上负号
字符转数字的映射由Character.digit实现
同样,这个字符串不能包含任意无关字符(例如:空格)
例:
BigInteger sixthtest = new BigInteger(“FF”,16);
System.out.println(“sixthtest”+sixthtest);
打印结果是255,
当用构造函数构造了BigInteger,就可以非常方便的调用BigInteger的各种方法对BigInteger进行操作,也可以用IO流的print()和println方法直接输出BigInteger.

4、随机处理

在设计算法时,我们常常可能需要使用一些随机数。比如扫雷游戏中,地雷的位置。
本节学习Java语言中对随机处理的支持

Random类
Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。
相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。这点在生成多个随机数字时需要特别注意。

Random类—构造方法
public Random():该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
public Random(long seed):该构造方法可以通过制定一个种子数进行创建。

Random类—方法
public boolean nextBoolean():该方法的作用是生成一个随机的boolean值,生成true和false的值几率相等,也就是都是50%的几率。
public double nextDouble():该方法的作用是生成一个随机的double值,数值介于[0,1.0)之间。
例如:生成[0,1.0)区间的小数
double d1 = r.nextDouble();
直接使用nextDouble方法获得。

Random类—方法
public int nextInt():该方法的作用是生成一个随机的int值,该值介于int的区间,也就是-231到231-1之间。如果需要生成指定区间的int值,则需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。
例如:生成任意整数
int n1 = r.nextInt();
直接使用nextInt方法即可。
public int nextInt(int n):该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。如果想生成指定区间的int值,也需要进行一定的数学变换,具体可以参看下面的使用示例中的代码。

Random类—方法
public void setSeed(long seed)该方法的作用是重新设置Random对象中的种子数。设置完种子数以后的Random对象和相同种子数使用new关键字创建出的Random对象相同。

示例
相同种子数的Random对象,相同次数生成的随机数字是完全相同的,下面是测试的代码:
Random r1 = new Random(10);
Random r2 = new Random(10);
for(int i = 0;i < 2;i++){
System.out.println(r1.nextInt());
System.out.println(r2.nextInt());
}
在该代码中,对象r1和r2使用的种子数都是10,则这两个对象相同次数生成的随机数是完全相同的。

与Math类中的random方法比较
在Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。
Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。
random方法的调用比较简单,所以很多程序员都习惯使用Math类的random方法来生成随机数字。

5、国际化支持

国际化支持是多语言版本应用都要考虑的问题,本节学习Java语言对国际化的支持,实际我们常常做的是JavaEE的企业应用,往往一些框架都有内置的国际化支持方案,不过了解Java语言的支持,有助于理解框架国际化支持。
Java程序的国际化主要通过如下两个类完成
java.util.Locale:用于封装一个特定的国家/区域,语言环境
java.util.ResourceBundle:用于加载一个国家,语言资源包

在src下准备两个语言版本的properties文件
info_zh_CN.properties以及info_en_US.properties
其中zh,en为语言简称,CN,US为国家简称
info为国际化资源文件的名字
其中中文版本的文件中,中文需要转换成ascii编码
创建不同语言环境的Locale对象
调用ResourceBundle.getBundle方法,获得不同版本的属性文件
调用ResourceBundle类的getXXX方法,获得属性文件中的属性值




原文地址:访问原文地址
快照地址: 访问文章快照