Java常用API(一)
第九章 常用API
本章學(xué)習(xí)目標
- 掌握JUnit框架@Test的使用
- 掌握包裝類與基本數(shù)據(jù)類型的自動裝箱與拆箱
- 了解哪些包裝類有緩存對象
- 掌握數(shù)學(xué)工具類Math類的常用方法
- 掌握使用BigInteger和BigDecimal表示整數(shù)和小數(shù)的方式
- 掌握使用Random類的方法產(chǎn)生隨機數(shù)
- 了解第1、2代日期時間類的基本使用及其問題
- 掌握第3代日期時間類的常用方法
- 掌握數(shù)組工具類Arrays的常用方法
- 掌握系統(tǒng)類System類的常用方法
- 掌握兩種比較器接口的使用
- 掌握字符串String類的常用方法
- 掌握可變字符串StringBuffer和StringBuilder的常用方法
- 知道String,StringBuffer和StringBuilder的區(qū)別
- 理解String類及其對象的特點
- 了解文本塊的語法格式
9.1 JUnit單元測試工具
JUnit是由Erich Gamma和Kent Beck編寫的一個回歸測試框架(regression testing framework),供Java開發(fā)人員編寫單元測試之用。多數(shù)Java的開發(fā)環(huán)境都已經(jīng)集成了JUnit作為單元測試的工具。JUnit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能。
要使用JUnit,必須在項目的編譯路徑中必須引入JUnit的庫,即相關(guān)的.class文件組成的jar包。
9.1.1 在線下載JUnit庫
如果沒有單獨安裝和設(shè)置過maven倉庫(Maven后面階段學(xué)習(xí)),則IDEA會使用默認的maven倉庫路徑,它在C盤的用戶目錄下:

當我們使用JUnit時,IDEA會提示我們自動下載jar到C盤。


9.2.2 允許JUnit的測試方法中鍵盤輸入
因為把ja-netfilter.jar破解工具把idea使用的vmoption文件重定向到它自己的文vmoption文件了。找到j(luò)a-netfilter.jar破解工具的解壓目錄的vmoptions文件夾,找到idea.vmoptions文件。


打開idea.vmoptions配置文件,在最后獨立一行加入如下配置參數(shù)
-Deditable.java.test.console=true
9.3.3 示例代碼
package com.atguigu.junit;
import org.junit.Test;
import java.util.Scanner;
public class TestJUnit {
@Test
public void test1() throws Exception {
System.out.println("hello");
}
@Test
public void test2() throws Exception {
System.out.println("world");
}
@Test
public void test3() throws Exception {
Scanner input = new Scanner(System.in);
System.out.print("請輸入一句話:");
String word = input.next();
System.out.println("word = " + word);
input.close();
}
}
9.2 包裝類
9.2.1 包裝類
Java提供了兩個類型系統(tǒng),基本類型與引用類型,使用基本類型在于效率,然而當要使用只針對對象設(shè)計的API或新特性(例如泛型),那么基本數(shù)據(jù)類型的數(shù)據(jù)就需要用包裝類來包裝。
| 序號 | 基本數(shù)據(jù)類型 | 包裝類(java.lang包) |
|---|---|---|
| 1 | byte | Byte |
| 2 | short | Short |
| 3 | int | Integer |
| 4 | long | Long |
| 5 | float | Float |
| 6 | double | Double |
| 7 | char | Character |
| 8 | boolean | Boolean |
| 9 | void | Void |
9.2.2 裝箱與拆箱
裝箱:把基本數(shù)據(jù)類型轉(zhuǎn)為包裝類對象。
轉(zhuǎn)為包裝類的對象,是為了使用專門為對象設(shè)計的API和特性
拆箱:把包裝類對象拆為基本數(shù)據(jù)類型。
轉(zhuǎn)為基本數(shù)據(jù)類型,一般是因為需要運算,Java中的大多數(shù)運算符是為基本數(shù)據(jù)類型設(shè)計的。比較、算術(shù)等
基本數(shù)值---->包裝對象
Integer obj1 = Integer.valueOf(4);//使用構(gòu)造函數(shù)函數(shù)
Integer obj2 = Integer.valueOf(4);//使用包裝類中的valueOf方法包裝對象---->基本數(shù)值
Integer obj = Integer.valueOf(4);
int num1 = obj.intValue();
JDK1.5之后,可以自動裝箱與拆箱。
注意:只能與自己對應(yīng)的類型之間才能實現(xiàn)自動裝箱與拆箱。
Integer i = 4;//自動裝箱。相當于Integer i = Integer.valueOf(4);
i = i + 5;//等號右邊:將i對象轉(zhuǎn)成基本數(shù)值(自動拆箱) i.intValue() + 5;
//加法運算完成后,再次裝箱,把基本數(shù)值轉(zhuǎn)成對象。
Integer i = 1;
Double d = 1;//錯誤的,1是int類型
7.10.3 包裝類的一些API
1、基本數(shù)據(jù)類型和字符串之間的轉(zhuǎn)換
(1)把基本數(shù)據(jù)類型轉(zhuǎn)為字符串
int a = 10;
//String str = a;//錯誤的
//方式一:
String str = a + "";
//方式二:
String str = String.valueOf(a);
(2)把字符串轉(zhuǎn)為基本數(shù)據(jù)類型
String轉(zhuǎn)換成對應(yīng)的基本類型 ,除了Character類之外,其他所有包裝類都具有parseXxx靜態(tài)方法可以將字符串參數(shù)轉(zhuǎn)換為對應(yīng)的基本類型,例如:
public static int parseInt(String s):將字符串參數(shù)轉(zhuǎn)換為對應(yīng)的int基本類型。public static long parseLong(String s):將字符串參數(shù)轉(zhuǎn)換為對應(yīng)的long基本類型。public static double parseDouble(String s):將字符串參數(shù)轉(zhuǎn)換為對應(yīng)的double基本類型。
或把字符串轉(zhuǎn)為包裝類,然后可以自動拆箱為基本數(shù)據(jù)類型
public static Integer valueOf(String s):將字符串參數(shù)轉(zhuǎn)換為對應(yīng)的Integer包裝類,然后可以自動拆箱為int基本類型public static Long valueOf(String s):將字符串參數(shù)轉(zhuǎn)換為對應(yīng)的Long包裝類,然后可以自動拆箱為long基本類型public static Double valueOf(String s):將字符串參數(shù)轉(zhuǎn)換為對應(yīng)的Double包裝類,然后可以自動拆箱為double基本類型
注意:如果字符串參數(shù)的內(nèi)容無法正確轉(zhuǎn)換為對應(yīng)的基本類型,則會拋出java.lang.NumberFormatException異常。
int a = Integer.parseInt("整數(shù)的字符串");
double d = Double.parseDouble("小數(shù)的字符串");
boolean b = Boolean.parseBoolean("true或false");
int a = Integer.valueOf("整數(shù)的字符串");
double d = Double.valueOf("小數(shù)的字符串");
boolean b = Boolean.valueOf("true或false");
2、數(shù)據(jù)類型的最大最小值
Integer.MAX_VALUE和Integer.MIN_VALUE
Long.MAX_VALUE和Long.MIN_VALUE
Double.MAX_VALUE和Double.MIN_VALUE
3、字符轉(zhuǎn)大小寫
Character.toUpperCase('x');
Character.toLowerCase('X');
9.2.4 包裝類對象的特點
1、包裝類對象不可變
public class TestExam {
public static void main(String[] args) {
int i = 1;
Integer j = Integer.valueOf(2);
Circle c = new Circle();
change(i, j, c);
System.out.println("i = " + i);//1
System.out.println("j = " + j);//2
System.out.println("c.radius = " + c.radius);//10.0
}
/*
* 方法的參數(shù)傳遞機制:
* (1)基本數(shù)據(jù)類型:形參的修改完全不影響實參
* (2)引用數(shù)據(jù)類型:通過形參修改對象的屬性值,會影響實參的屬性值
* 這類Integer等包裝類對象是“不可變”對象,即一旦修改,就是新對象,和實參就無關(guān)了
*/
public static void change(int a, Integer b, Circle c) {
a += 10;
// b += 10;//等價于 b = Integer.valueOf(b+10);//指向另一個Integer對象
c.radius += 10;
/*c = new Circle();
c.radius+=10;*/
}
}
class Circle {
double radius;
}
2、包裝類緩存對象
| 包裝類 | 緩存對象 |
|---|---|
| Byte | -128~127 |
| Short | -128~127 |
| Integer | -128~127 |
| Long | -128~127 |
| Float | 沒有 |
| Double | 沒有 |
| Character | 0~127 |
| Boolean | true和false |
Integer a = 1;
Integer b = 1;
System.out.println(a == b);//true
Integer i = 128;
Integer j = 128;
System.out.println(i == j);//false
Integer x = Integer.valueOf(1);
Integer y = Integer.valueOf(1);
System.out.println(x == y);//true
Double d1 = 1.0;
Double d2 = 1.0;
System.out.println(d1 == d2);//false 比較地址,沒有緩存對象,每一個都是新new的
3、包裝類對象計算問題
- 兩個包裝類對象之間進行“==”和“!=”運算,比較的是對象的地址值,要求兩個包裝類對象必須是同一種類型。
- 兩個包裝類對象之間進行其他運算(>,<,+,-等等),先自動拆箱為基本數(shù)據(jù)類型之后再運算,不要求兩個包裝類對象是同一種類型(Boolean不參與)。
- 包裝類對象和基本數(shù)據(jù)類型的混合運算都是自動拆箱為基本數(shù)據(jù)類型之后再運算。
Integer i = 1;
Integer j = 1;
System.out.println(i == j);//true 比較地址值,緩存對象
Integer i = 128;Integer j = 128;
System.out.println(i==j);//false 比較地址值Integer i = 1000;
double j = 1000;
System.out.println(i == j);//true 會先將i自動拆箱為int,然后根據(jù)基本數(shù)據(jù)類型“自動類型轉(zhuǎn)換”規(guī)則,轉(zhuǎn)為double比較
Integer i = 1000;
int j = 1000;
System.out.println(i == j);//true 會自動拆箱,按照基本數(shù)據(jù)類型進行比較
Integer i = 1;
Double d = 1.0
System.out.println(i == d);//編譯報錯
Integer i = 2;
Double d = 1.0
System.out.println(i > d);//true,自動拆箱后比較
9.3 和數(shù)學(xué)相關(guān)的類
9.3.1 java.lang.Math
java.lang.Math 類包含用于執(zhí)行基本數(shù)學(xué)運算的方法,如初等指數(shù)、對數(shù)、平方根和三角函數(shù)。類似這樣的工具類,其所有方法均為靜態(tài)方法,并且不會創(chuàng)建對象,調(diào)用起來非常簡單。
public static double abs(double a):返回 double 值的絕對值。public static double ceil(double a):返回大于等于參數(shù)的最小的整數(shù)。public static double floor(double a):返回小于等于參數(shù)最大的整數(shù)。public static long round(double a):返回最接近參數(shù)的 long。(相當于四舍五入方法)public static double pow(double a,double b):返回a的b冪次方法public static double sqrt(double a):返回a的平方根public static double random():返回[0,1)的隨機值public static final double PI:返回圓周率public static double max(double x, double y):返回x,y中的最大值public static double min(double x, double y):返回x,y中的最小值
9.3.2 java.math包
1、BigInteger
不可變的任意精度的整數(shù)。
BigInteger(String val)BigInteger add(BigInteger val)BigInteger subtract(BigInteger val)BigInteger multiply(BigInteger val)BigInteger divide(BigInteger val)BigInteger remainder(BigInteger val)- ....
@Test
public void test01(){
// long bigNum = 123456789123456789123456789L;
BigInteger b1 = new BigInteger("123456789123456789123456789");
BigInteger b2 = new BigInteger("78923456789123456789123456789");
// System.out.println("和:" + (b1+b2));//錯誤的,無法直接使用+進行求和
System.out.println("和:" + b1.add(b2));
System.out.println("減:" + b1.subtract(b2));
System.out.println("乘:" + b1.multiply(b2));
System.out.println("除:" + b2.divide(b1));
System.out.println("余:" + b2.remainder(b1));
}
2、BigDecimal
不可變的、任意精度的有符號十進制數(shù)。
BigDecimal(String val)BigDecimal add(BigDecimal val)BigDecimal subtract(BigDecimal val)BigDecimal multiply(BigDecimal val)BigDecimal divide(BigDecimal val)BigDecimal divide(BigDecimal divisor, int roundingMode)BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)BigDecimal remainder(BigDecimal val)- ....
RoundingMode枚舉類的部分常量對象:
- CEILING :向正無限大方向舍入的舍入模式。
- DOWN :向零方向舍入的舍入模式。
- FLOOR:向負無限大方向舍入的舍入模式。
- HALF_DOWN :向最接近數(shù)字方向舍入的舍入模式,如果與兩個相鄰數(shù)字的距離相等,則向下舍入。
- HALF_EVEN:向最接近數(shù)字方向舍入的舍入模式,如果與兩個相鄰數(shù)字的距離相等,則向相鄰的偶數(shù)舍入。
- HALF_UP:向最接近數(shù)字方向舍入的舍入模式,如果與兩個相鄰數(shù)字的距離相等,則向上舍入。
- UNNECESSARY:用于斷言請求的操作具有精確結(jié)果的舍入模式,因此不需要舍入。
- UP:遠離零方向舍入的舍入模式。
@Test
public void test02(){
/*double big = 12.123456789123456789123456789;
System.out.println("big = " + big);*/
BigDecimal b1 = new BigDecimal("123.45678912345678912345678912345678");
BigDecimal b2 = new BigDecimal("7.8923456789123456789123456789998898888");
// System.out.println("和:" + (b1+b2));//錯誤的,無法直接使用+進行求和
System.out.println("和:" + b1.add(b2));
System.out.println("減:" + b1.subtract(b2));
System.out.println("乘:" + b1.multiply(b2));
System.out.println("除:" + b1.divide(b2,20,RoundingMode.UP));//divide(BigDecimal divisor, int scale, int roundingMode)
System.out.println("除:" + b1.divide(b2,20,RoundingMode.DOWN));//divide(BigDecimal divisor, int scale, int roundingMode)
System.out.println("余:" + b1.remainder(b2));
}
9.3.3 java.util.Random
用于產(chǎn)生隨機數(shù)
boolean nextBoolean():返回下一個偽隨機數(shù),它是取自此隨機數(shù)生成器序列的均勻分布的 boolean 值。void nextBytes(byte[] bytes):生成隨機字節(jié)并將其置于用戶提供的 byte 數(shù)組中。double nextDouble():返回下一個偽隨機數(shù),它是取自此隨機數(shù)生成器序列的、在 0.0 和 1.0 之間均勻分布的 double 值。float nextFloat():返回下一個偽隨機數(shù),它是取自此隨機數(shù)生成器序列的、在 0.0 和 1.0 之間均勻分布的 float 值。double nextGaussian():返回下一個偽隨機數(shù),它是取自此隨機數(shù)生成器序列的、呈高斯(“正態(tài)”)分布的 double 值,其平均值是 0.0,標準差是 1.0。int nextInt():返回下一個偽隨機數(shù),它是此隨機數(shù)生成器的序列中均勻分布的 int 值。int nextInt(int n):返回一個偽隨機數(shù),它是取自此隨機數(shù)生成器序列的、在 0(包括)和指定值(不包括)之間均勻分布的 int 值。long nextLong():返回下一個偽隨機數(shù),它是取自此隨機數(shù)生成器序列的均勻分布的 long 值。
@Test
public void test03(){
Random r = new Random();
System.out.println("隨機整數(shù):" + r.nextInt());
System.out.println("[0,100)范圍的隨機整數(shù):" + r.nextInt(100));
System.out.println("隨機小數(shù):" + r.nextDouble());
System.out.println("隨機布爾值:" + r.nextBoolean());
}
9.4 日期時間API
9.4.1 第一代日期時間(JDK1.0)
1、java.lang.System
@Test
public void test1(){
long time = System.currentTimeMillis();
System.out.println(time);//1559806982971
//當前系統(tǒng)時間距離1970-1-1 0:0:0 0毫秒的時間差,毫秒為單位
//中國地區(qū)是距離
}
2、java.util.Date
new Date():當前系統(tǒng)時間long getTime():返回該日期時間對象距離1970-1-1 0.0.0 0毫秒之間的毫秒值new Date(long 毫秒):把該毫秒值換算成日期時間對象
@Test
public void test5(){
long time = Long.MAX_VALUE;
Date d = new Date(time);
System.out.println(d);
}
@Test
public void test4(){
long time = 1559807047979L;
Date d = new Date(time);
System.out.println(d);
}
@Test
public void test3(){
Date d = new Date();
long time = d.getTime();
System.out.println(time);//1559807047979
}
@Test
public void test2(){
Date d = new Date();
System.out.println(d);
}
3、java.text.SimpleDateFormat
SimpleDateFormat用于日期時間的格式化。
public final String format(Date date)將一個 Date 格式化為日期/時間字符串。public Date parse(String source)throws ParseException從給定字符串的開始解析文本,以生成一個日期。
| 字母 | 描述 | 示例 |
|---|---|---|
| G | 紀元標記 根據(jù)語言環(huán)境顯示 | Locale.CHINA 語言環(huán)境下,如:公元;Locale.US語言環(huán)境下,如:AD |
| y | 年份。yy表示2位年份,yyyy表示4位年份 | 使用yy 表示年份,如23;使用yyyy表示年份,例如2023 |
| M | 月份 一般用 MM 表示月份,如果使用 MMM,則會根據(jù)語言環(huán)境顯示不同語言的月份 | 使用 MM 表示的月份,如 11; 使用 MMM 表示月份,在 Locale.CHINA語言環(huán)境下,如“十月”;在 Locale.US環(huán)境下 如Nov |
| d | 月份中的天數(shù)。一般用dd表示天數(shù) | 使用dd表示天數(shù) 例如:20 |
| h | 一天中的小時(1~12)。 一般使用hh表示小時 | 如 10 (注意 10 有可能是 10 點,也可能是 22 點) |
| H | 一天中的小時 (0~23)。 | 如:22 |
| m | 分鐘數(shù) 。一般用mm表示分鐘數(shù) | 使用mm表示分鐘數(shù),如:59 |
| s | 秒數(shù)。一般使用ss表示秒數(shù) | 使用ss表示秒數(shù),如:55 |
| S | 毫秒數(shù) 。一般使用SSS 表示毫秒數(shù) | 使用SSS表示毫秒數(shù),如:234 |
| E | 星期幾.根據(jù)語言環(huán)境的不同,顯示不同語言的星期幾 | Locale.CHINA 語言環(huán)境下,如:星期日;在 Locale.US 語言下,如:Sun |
| D | 一年中的日子。 | 324 一年中的第324天 |
| F | 一個月中第幾周。 | 3 表示一個月中的第三周 ,從該月1號開始7天一個周期,例如3月1日-3月7日為3月第一周。 |
| w | 一年中第幾周 。 | 48 表示一年中的第48周 |
| W | 一個月中第幾周 | 3 表示一個月中的第三周,看日歷,以2023-4-3為例,F(xiàn)還是4月第1周,W已經(jīng)是4月第2周了。 |
| a | A.M./P.M. 或上午/下午標記。根據(jù)語言環(huán)境不同,顯示不同 | Locale.CHINA 語言環(huán)境下,如:下午 Locale.US語言環(huán)境下,如:PM |
| k | 一天中的小時(1~24) | 15 一天中的第15小時 |
| K | 一天中的小時(1~12) | 3 下午3小時 |
| z | 時區(qū) | 中國的東八區(qū) 如:+0800 |
@Test
public void test10() throws ParseException{
String str = "2019年06月06日 16時03分14秒 545毫秒 星期四 +0800";
SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒 SSS毫秒 E Z");
Date d = sf.parse(str);
System.out.println(d);
}
@Test
public void test9(){
Date d = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒 SSS毫秒 E Z");
//把Date日期轉(zhuǎn)成字符串,按照指定的格式轉(zhuǎn)
String str = sf.format(d);
System.out.println(str);
}


