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盤的用戶目錄下:
當(dāng)我們使用JUnit時(shí),IDEA會(huì)提示我們自動(dòng)下載jar到C盤。
9.2.2 允許JUnit的測試方法中鍵盤輸入
因?yàn)榘裫a-netfilter.jar破解工具把idea使用的vmoption文件重定向到它自己的文vmoption文件了。找到j(luò)a-netfilter.jar破解工具的解壓目錄的vmoptions文件夾,找到idea.vmoptions文件。
打開idea.vmoptions配置文件,在最后獨(dú)立一行加入如下配置參數(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("請(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包) |
---|---|---|
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)為包裝類對(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 | 沒有 |
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 比較地址,沒有緩存對(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周了。 |
a | A.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);
}