Java常用API(一)
第九章 常用API
本章學(xué)習(xí)目標(biāo)
- 掌握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盤的用戶目錄下:
當(dāng)我們使用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),基本類型與引用類型,使用基本類型在于效率,然而當(dā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;//自動裝箱。相當(dāng)于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。(相當(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)的隨機值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,標(biāo)準差是 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
//當(dāng)前系統(tǒng)時間距離1970-1-1 0:0:0 0毫秒的時間差,毫秒為單位
//中國地區(qū)是距離
}
2、java.util.Date
new Date()
:當(dāng)前系統(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 | 紀元標(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,則會根據(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. 或上午/下午標(biāo)記。根據(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);
}