Java常用API(一)

第九章 常用API

本章學(xué)習(xí)目標(biāo)

  • 掌握J(rèn)Unit框架@Test的使用
  • 掌握包裝類與基本數(shù)據(jù)類型的自動(dòng)裝箱與拆箱
  • 了解哪些包裝類有緩存對(duì)象
  • 掌握數(shù)學(xué)工具類Math類的常用方法
  • 掌握使用BigInteger和BigDecimal表示整數(shù)和小數(shù)的方式
  • 掌握使用Random類的方法產(chǎn)生隨機(jī)數(shù)
  • 了解第1、2代日期時(shí)間類的基本使用及其問題
  • 掌握第3代日期時(shí)間類的常用方法
  • 掌握數(shù)組工具類Arrays的常用方法
  • 掌握系統(tǒng)類System類的常用方法
  • 掌握兩種比較器接口的使用
  • 掌握字符串String類的常用方法
  • 掌握可變字符串StringBuffer和StringBuilder的常用方法
  • 知道String,StringBuffer和StringBuilder的區(qū)別
  • 理解String類及其對(duì)象的特點(diǎn)
  • 了解文本塊的語法格式

9.1 JUnit單元測試工具

JUnit是由Erich Gamma和Kent Beck編寫的一個(gè)回歸測試框架(regression testing framework),供Java開發(fā)人員編寫單元測試之用。多數(shù)Java的開發(fā)環(huán)境都已經(jīng)集成了JUnit作為單元測試的工具。JUnit測試是程序員測試,即所謂白盒測試,因?yàn)槌绦騿T知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能。

要使用JUnit,必須在項(xiàng)目的編譯路徑中必須引入JUnit的庫,即相關(guān)的.class文件組成的jar包。

9.1.1 在線下載JUnit庫

如果沒有單獨(dú)安裝和設(shè)置過maven倉庫(Maven后面階段學(xué)習(xí)),則IDEA會(huì)使用默認(rèn)的maven倉庫路徑,它在C盤的用戶目錄下:

image-20220616175209325.png

當(dāng)我們使用JUnit時(shí),IDEA會(huì)提示我們自動(dòng)下載jar到C盤。

image-20221105140348475.png
image-20221105140654619.png

9.2.2 允許JUnit的測試方法中鍵盤輸入

因?yàn)榘裫a-netfilter.jar破解工具把idea使用的vmoption文件重定向到它自己的文vmoption文件了。找到j(luò)a-netfilter.jar破解工具的解壓目錄的vmoptions文件夾,找到idea.vmoptions文件。

image-20221105154403298.png
image-20240715194815959.png

打開idea.vmoptions配置文件,在最后獨(dú)立一行加入如下配置參數(shù)

-Deditable.java.test.console=true

image-20221105154450636.png

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("請(qǐng)輸入一句話:");
        String word = input.next();
        System.out.println("word = " + word);
        input.close();
    }
}

9.2 包裝類

9.2.1 包裝類

Java提供了兩個(gè)類型系統(tǒng),基本類型與引用類型,使用基本類型在于效率,然而當(dāng)要使用只針對(duì)對(duì)象設(shè)計(jì)的API或新特性(例如泛型),那么基本數(shù)據(jù)類型的數(shù)據(jù)就需要用包裝類來包裝。

序號(hào)基本數(shù)據(jù)類型包裝類(java.lang包)
1byteByte
2shortShort
3intInteger
4longLong
5floatFloat
6doubleDouble
7charCharacter
8booleanBoolean
9voidVoid

9.2.2 裝箱與拆箱

裝箱:把基本數(shù)據(jù)類型轉(zhuǎn)為包裝類對(duì)象。

轉(zhuǎn)為包裝類的對(duì)象,是為了使用專門為對(duì)象設(shè)計(jì)的API和特性

拆箱:把包裝類對(duì)象拆為基本數(shù)據(jù)類型。

轉(zhuǎn)為基本數(shù)據(jù)類型,一般是因?yàn)樾枰\(yùn)算,Java中的大多數(shù)運(yùn)算符是為基本數(shù)據(jù)類型設(shè)計(jì)的。比較、算術(shù)等

基本數(shù)值---->包裝對(duì)象

Integer obj1 = Integer.valueOf(4);//使用構(gòu)造函數(shù)函數(shù)
Integer obj2 = Integer.valueOf(4);//使用包裝類中的valueOf方法

包裝對(duì)象---->基本數(shù)值

Integer obj = Integer.valueOf(4);
int num1 = obj.intValue();

JDK1.5之后,可以自動(dòng)裝箱與拆箱。

注意:只能與自己對(duì)應(yīng)的類型之間才能實(shí)現(xiàn)自動(dòng)裝箱與拆箱。

Integer i = 4;//自動(dòng)裝箱。相當(dāng)于Integer i = Integer.valueOf(4);
i = i + 5;//等號(hào)右邊:將i對(duì)象轉(zhuǎn)成基本數(shù)值(自動(dòng)拆箱) i.intValue() + 5;
//加法運(yùn)算完成后,再次裝箱,把基本數(shù)值轉(zhuǎn)成對(duì)象。
Integer i = 1;
Double d = 1;//錯(cuò)誤的,1是int類型

7.10.3 包裝類的一些API

1、基本數(shù)據(jù)類型和字符串之間的轉(zhuǎn)換

(1)把基本數(shù)據(jù)類型轉(zhuǎn)為字符串
int a = 10;
//String str = a;//錯(cuò)誤的
//方式一:
String str = a + "";
//方式二:
String str = String.valueOf(a);
(2)把字符串轉(zhuǎn)為基本數(shù)據(jù)類型

String轉(zhuǎn)換成對(duì)應(yīng)的基本類型 ,除了Character類之外,其他所有包裝類都具有parseXxx靜態(tài)方法可以將字符串參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的基本類型,例如:

  • public static int parseInt(String s):將字符串參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的int基本類型。
  • public static long parseLong(String s):將字符串參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的long基本類型。
  • public static double parseDouble(String s):將字符串參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的double基本類型。

或把字符串轉(zhuǎn)為包裝類,然后可以自動(dòng)拆箱為基本數(shù)據(jù)類型

  • public static Integer valueOf(String s):將字符串參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的Integer包裝類,然后可以自動(dòng)拆箱為int基本類型
  • public static Long valueOf(String s):將字符串參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的Long包裝類,然后可以自動(dòng)拆箱為long基本類型
  • public static Double valueOf(String s):將字符串參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的Double包裝類,然后可以自動(dòng)拆箱為double基本類型

注意:如果字符串參數(shù)的內(nèi)容無法正確轉(zhuǎn)換為對(duì)應(yīng)的基本類型,則會(huì)拋出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 包裝類對(duì)象的特點(diǎn)

1、包裝類對(duì)象不可變

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ù)傳遞機(jī)制:
     * (1)基本數(shù)據(jù)類型:形參的修改完全不影響實(shí)參
     * (2)引用數(shù)據(jù)類型:通過形參修改對(duì)象的屬性值,會(huì)影響實(shí)參的屬性值
     * 這類Integer等包裝類對(duì)象是“不可變”對(duì)象,即一旦修改,就是新對(duì)象,和實(shí)參就無關(guān)了
     */
    public static void change(int a, Integer b, Circle c) {
        a += 10;
//        b += 10;//等價(jià)于  b = Integer.valueOf(b+10);//指向另一個(gè)Integer對(duì)象
        c.radius += 10;
        /*c = new Circle();
        c.radius+=10;*/
    }
}
class Circle {
    double radius;
}

2、包裝類緩存對(duì)象

包裝類緩存對(duì)象
Byte-128~127
Short-128~127
Integer-128~127
Long-128~127
Float沒有
Double沒有
Character0~127
Booleantrue和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 比較地址,沒有緩存對(duì)象,每一個(gè)都是新new的

3、包裝類對(duì)象計(jì)算問題

- 兩個(gè)包裝類對(duì)象之間進(jìn)行“==”和“!=”運(yùn)算,比較的是對(duì)象的地址值,要求兩個(gè)包裝類對(duì)象必須是同一種類型。

- 兩個(gè)包裝類對(duì)象之間進(jìn)行其他運(yùn)算(>,<,+,-等等),先自動(dòng)拆箱為基本數(shù)據(jù)類型之后再運(yùn)算,不要求兩個(gè)包裝類對(duì)象是同一種類型(Boolean不參與)。

- 包裝類對(duì)象和基本數(shù)據(jù)類型的混合運(yùn)算都是自動(dòng)拆箱為基本數(shù)據(jù)類型之后再運(yùn)算。

Integer i = 1;
Integer j = 1;
System.out.println(i == j);//true 比較地址值,緩存對(duì)象
Integer i = 128;Integer j = 128;
System.out.println(i==j);//false 比較地址值
Integer i = 1000;
double j = 1000;
System.out.println(i == j);//true  會(huì)先將i自動(dòng)拆箱為int,然后根據(jù)基本數(shù)據(jù)類型“自動(dòng)類型轉(zhuǎn)換”規(guī)則,轉(zhuǎn)為double比較
Integer i = 1000;
int j = 1000;
System.out.println(i == j);//true 會(huì)自動(dòng)拆箱,按照基本數(shù)據(jù)類型進(jìn)行比較
Integer i = 1;
Double d = 1.0
System.out.println(i == d);//編譯報(bào)錯(cuò)
Integer i = 2;
Double d = 1.0
System.out.println(i > d);//true,自動(dòng)拆箱后比較

9.3 和數(shù)學(xué)相關(guān)的類

9.3.1 java.lang.Math

java.lang.Math 類包含用于執(zhí)行基本數(shù)學(xué)運(yùn)算的方法,如初等指數(shù)、對(duì)數(shù)、平方根和三角函數(shù)。類似這樣的工具類,其所有方法均為靜態(tài)方法,并且不會(huì)創(chuàng)建對(duì)象,調(diào)用起來非常簡單。

  • public static double abs(double a) :返回 double 值的絕對(duì)值。
  • public static double ceil(double a) :返回大于等于參數(shù)的最小的整數(shù)。
  • public static double floor(double a) :返回小于等于參數(shù)最大的整數(shù)。
  • public static long round(double a) :返回最接近參數(shù)的 long。(相當(dāng)于四舍五入方法)
  • public static double pow(double a,double b):返回a的b冪次方法
  • public static double sqrt(double a):返回a的平方根
  • public static double random():返回[0,1)的隨機(jī)值
  • 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));//錯(cuò)誤的,無法直接使用+進(jìn)行求和
    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

不可變的、任意精度的有符號(hào)十進(jìn)制數(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枚舉類的部分常量對(duì)象:

  • CEILING :向正無限大方向舍入的舍入模式。
  • DOWN :向零方向舍入的舍入模式。
  • FLOOR:向負(fù)無限大方向舍入的舍入模式。
  • HALF_DOWN :向最接近數(shù)字方向舍入的舍入模式,如果與兩個(gè)相鄰數(shù)字的距離相等,則向下舍入。
  • HALF_EVEN:向最接近數(shù)字方向舍入的舍入模式,如果與兩個(gè)相鄰數(shù)字的距離相等,則向相鄰的偶數(shù)舍入。
  • HALF_UP:向最接近數(shù)字方向舍入的舍入模式,如果與兩個(gè)相鄰數(shù)字的距離相等,則向上舍入。
  • UNNECESSARY:用于斷言請(qǐng)求的操作具有精確結(jié)果的舍入模式,因此不需要舍入。
  • UP:遠(yuǎn)離零方向舍入的舍入模式。

@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));//錯(cuò)誤的,無法直接使用+進(jìn)行求和
    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)生隨機(jī)數(shù)

  • boolean nextBoolean():返回下一個(gè)偽隨機(jī)數(shù),它是取自此隨機(jī)數(shù)生成器序列的均勻分布的 boolean 值。
  • void nextBytes(byte[] bytes):生成隨機(jī)字節(jié)并將其置于用戶提供的 byte 數(shù)組中。
  • double nextDouble():返回下一個(gè)偽隨機(jī)數(shù),它是取自此隨機(jī)數(shù)生成器序列的、在 0.0 和 1.0 之間均勻分布的 double 值。
  • float nextFloat():返回下一個(gè)偽隨機(jī)數(shù),它是取自此隨機(jī)數(shù)生成器序列的、在 0.0 和 1.0 之間均勻分布的 float 值。
  • double nextGaussian():返回下一個(gè)偽隨機(jī)數(shù),它是取自此隨機(jī)數(shù)生成器序列的、呈高斯(“正態(tài)”)分布的 double 值,其平均值是 0.0,標(biāo)準(zhǔn)差是 1.0。
  • int nextInt():返回下一個(gè)偽隨機(jī)數(shù),它是此隨機(jī)數(shù)生成器的序列中均勻分布的 int 值。
  • int nextInt(int n):返回一個(gè)偽隨機(jī)數(shù),它是取自此隨機(jī)數(shù)生成器序列的、在 0(包括)和指定值(不包括)之間均勻分布的 int 值。
  • long nextLong():返回下一個(gè)偽隨機(jī)數(shù),它是取自此隨機(jī)數(shù)生成器序列的均勻分布的 long 值。

@Test
public void test03(){
    Random r = new Random();
    System.out.println("隨機(jī)整數(shù):" + r.nextInt());
    System.out.println("[0,100)范圍的隨機(jī)整數(shù):" + r.nextInt(100));
    System.out.println("隨機(jī)小數(shù):" + r.nextDouble());
    System.out.println("隨機(jī)布爾值:" + r.nextBoolean());
}

9.4 日期時(shí)間API

9.4.1 第一代日期時(shí)間(JDK1.0)

1、java.lang.System


@Test
public void test1(){
    long time = System.currentTimeMillis();
    System.out.println(time);//1559806982971
    //當(dāng)前系統(tǒng)時(shí)間距離1970-1-1 0:0:0 0毫秒的時(shí)間差,毫秒為單位
    //中國地區(qū)是距離
}

2、java.util.Date

  • new Date():當(dāng)前系統(tǒng)時(shí)間
  • long getTime():返回該日期時(shí)間對(duì)象距離1970-1-1 0.0.0 0毫秒之間的毫秒值
  • new Date(long 毫秒):把該毫秒值換算成日期時(shí)間對(duì)象

@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用于日期時(shí)間的格式化。

  • public final String format(Date date)將一個(gè) Date 格式化為日期/時(shí)間字符串。
  • public Date parse(String source)throws ParseException從給定字符串的開始解析文本,以生成一個(gè)日期。
字母描述示例
G紀(jì)元標(biāo)記 根據(jù)語言環(huán)境顯示Locale.CHINA 語言環(huán)境下,如:公元;Locale.US語言環(huán)境下,如:AD
y年份。yy表示2位年份,yyyy表示4位年份使用yy 表示年份,如23;使用yyyy表示年份,例如2023
M月份 一般用 MM 表示月份,如果使用 MMM,則會(huì)根據(jù)語言環(huán)境顯示不同語言的月份使用 MM 表示的月份,如 11; 使用 MMM 表示月份,在 Locale.CHINA語言環(huán)境下,如“十月”;在 Locale.US環(huán)境下 如Nov
d月份中的天數(shù)。一般用dd表示天數(shù)使用dd表示天數(shù) 例如:20
h一天中的小時(shí)(1~12)。 一般使用hh表示小時(shí)如 10 (注意 10 有可能是 10 點(diǎn),也可能是 22 點(diǎn))
H一天中的小時(shí) (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一個(gè)月中第幾周。3 表示一個(gè)月中的第三周 ,從該月1號(hào)開始7天一個(gè)周期,例如3月1日-3月7日為3月第一周。
w一年中第幾周 。48 表示一年中的第48周
W一個(gè)月中第幾周3 表示一個(gè)月中的第三周,看日歷,以2023-4-3為例,F(xiàn)還是4月第1周,W已經(jīng)是4月第2周了。
aA.M./P.M. 或上午/下午標(biāo)記。根據(jù)語言環(huán)境不同,顯示不同Locale.CHINA 語言環(huán)境下,如:下午 Locale.US語言環(huán)境下,如:PM
k一天中的小時(shí)(1~24)15 一天中的第15小時(shí)
K一天中的小時(shí)(1~12)3 下午3小時(shí)
z時(shí)區(qū)中國的東八區(qū) 如:+0800

@Test
public void test10() throws ParseException{
    String str = "2019年06月06日 16時(shí)03分14秒 545毫秒  星期四 +0800";
    SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH時(shí)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時(shí)mm分ss秒 SSS毫秒  E Z");
    //把Date日期轉(zhuǎn)成字符串,按照指定的格式轉(zhuǎn)
    String str = sf.format(d);
    System.out.println(str);
}