JAVA新手小白學(xué)正則表達(dá)式、包裝類、自動裝箱/自動拆箱以及BigDecimal
1 正則表達(dá)式Regex
1.1 概述
正確的字符串格式規(guī)則。
常用來判斷用戶輸入的內(nèi)容是否符合格式的要求,注意是嚴(yán)格區(qū)分大小寫的。
1.2 常見語法

1.3 String提供了支持正則表達(dá)式的方法
Matches(正則) : 當(dāng)前字符串能否匹配正則表達(dá)式
replaceAll(正則,子串) : 替換子串
split(正則) : 拆分字符串
1.4 練習(xí):測試輸入身份證號
創(chuàng)建包: cn.tedu.api
創(chuàng)建類: TestRegex.java
package cn.tedu.api;
import java.util.Scanner;
/*本類用于正則表達(dá)式入門案例*/
//需求:接收用戶輸入的身份證號,并將判斷的結(jié)果輸出
public class TestRegex {
public static void main(String[] args) {
//1.編輯正則表達(dá)式
//身份證號的規(guī)律:一共是18位,前17位是數(shù)子,第18位有可能是數(shù)字,也有可能是X
//String regex = "[0-9]{17}[0-9X]";
/*單個\在Java中有特殊的含義,表示轉(zhuǎn)義符號,不認(rèn)為是一個斜杠
* 所以如果想要表示斜杠,需要在它的前面加一個用來轉(zhuǎn)義的\
* 也就是\\才表示成一個單純的斜杠
* \t -- 制表符 \r回車符 \n換行符*/
String regex = "\\d{17}[0-9X]";
//2.定義變量用來接收用戶輸入的身份證號:
String input;
//3.判斷用戶輸入的數(shù)據(jù)是否符合正則表達(dá)式,如果不正確,繼續(xù)輸入
do {
System.out.println("請輸入您的身份證號:");
input = new Scanner(System.in).nextLine();
if (input.matches(regex)) {//如果身份證號正確
System.out.println("恭喜你!輸入正確!");
return;//結(jié)束本方法
}
} while (!input.matches(regex));//只要不符合正則表達(dá)式,就繼續(xù)輸入
}
}
2 包裝類
把基本類型進(jìn)行包裝,提供更加完善的功能。
基本類型是沒有任何功能的,只是一個變量,記錄值,而包裝類可以有更加豐富的功能
2.1 與基本類型的對應(yīng)關(guān)系

2.2 Number
數(shù)字包裝類的抽象父類。
提供了各種獲取值的方式。


2.3 Integer 創(chuàng)建對象
方式一: new Integer(5);
方式二: Integer.valueOf(5);
Integer類中包含256個Integer緩存對象,范圍是 -128~127
使用valueOf()時,如果指定范圍內(nèi)的值,直接訪問緩存對象不新建;如果指定范圍外的值,直接新建對象。
常見方法
static int parseInt(String s) 將字符串參數(shù)作為有符號的十進(jìn)制整數(shù)進(jìn)行解析
2.4 練習(xí): Number之Integer
創(chuàng)建包: cn.tedu. api
創(chuàng)建類: TestNumber.java
package cn.tedu.api;
/*本類用于測試包裝類*/
public class TestNumber {
//1.定義成員變量,注意要設(shè)置成靜態(tài)的,因?yàn)殪o態(tài)只能調(diào)用靜態(tài)
static Integer i0;
public static void main(String[] args) {
//2.打印Integer的默認(rèn)值進(jìn)行測試
System.out.println(i0);//默認(rèn)值為null
//3.創(chuàng)建int類型對應(yīng)的包裝類Integer類型的對象--方式一
Integer i1 = new Integer(5);
Integer i11 = new Integer(5);
System.out.println( i1 == i11 );//false,==對于引用類型,比較的是地址值
//4.創(chuàng)建int類型對應(yīng)的包裝類Integer類型的對象--方式二
/*Integer有一個高效的效果,數(shù)據(jù)在:(-128~127)
* 在此范圍內(nèi),相同的數(shù)據(jù)只會存一次,后續(xù)再存都是使用之前存過的數(shù)據(jù)*/
Integer i2 = Integer.valueOf(127);
Integer i3 = Integer.valueOf(127);
System.out.println(i1 == i2);//false
System.out.println(i2 == i3);//true
//滿足高效效果的3個條件:Integer valueOf() -128~127
Integer i4 = Integer.valueOf(300);
Integer i5 = Integer.valueOf(300);
System.out.println(i4 == i5);//false
}
}
2.5 Double
創(chuàng)建對象
- new Double(3.14)
- Double.valueOf(3.14)//和 new 沒有區(qū)別 常用方法
Double.parseDouble();
2.5 練習(xí): Number之Double
創(chuàng)建包: cn.tedu.api
創(chuàng)建類: TestNumber.java
package cn.tedu.api;
/*本類用于測試基本類型的包裝類*/
public class TestNumber {
public static void main(String[] args) {
//1.創(chuàng)建int包裝類Integer對象的方式1
Integer i1 = new Integer(100);
Integer i11 = new Integer(100);
System.out.println(i1 == i11);//false,new了兩次,是兩個不同的對象,地址值不同
//2.創(chuàng)建int包裝類Integer對象的方式2
/*Integer有一個高效的效果,但是必須滿足3個條件:
* 1.是Integer類型
* 2.使用valueOf()的創(chuàng)建方式
* 3.數(shù)據(jù)在-128~127的范圍內(nèi)
* 滿足以上條件,相同的數(shù)據(jù)只會存一次,后續(xù)再使用都是以前存過的數(shù)據(jù)*/
Integer i2 = Integer.valueOf(100);
Integer i22 = Integer.valueOf(100);
System.out.println(i2 == i22);//true
Integer i3 = Integer.valueOf(300);
Integer i33 = Integer.valueOf(300);
System.out.println(i3 == i33);//false 超出高效的數(shù)據(jù)范圍-128~127
//3.創(chuàng)建double包裝類Double對象的方式1
Double d1 = new Double(3.14);
Double d11 = new Double(3.14);
System.out.println(d1 == d11);//false,創(chuàng)建兩個不同的對象,地址值不同
//4.創(chuàng)建double包裝類Double對象的方式2
/*只有Integer才有高效的效果Double是沒有的*/
Double d2 = Double.valueOf(3.14);
Double d22 = Double.valueOf(3.14);
System.out.println(d1 == d2);//false
System.out.println(d2 == d22);
//5.測試常用方法
//這個方法的作用就是把傳入的String類型的數(shù)據(jù)轉(zhuǎn)成int
/*對象是什么類型的,就可以使用這個類的所有資源
i1是Integer類型的對象,所以可以使用parseInt()將String類型的數(shù)據(jù)轉(zhuǎn)為int類型
d1是Double類型的對象,所以可以使用parseDouble()將String類型的數(shù)據(jù)轉(zhuǎn)為double類型*/
System.out.println(i1.parseInt("800")+8);//808->int+int
System.out.println(d1.parseDouble("2.2")+3.1);//5.300000000000001->double+double
}
}
3 自動裝箱和自動拆箱
3.1 概述
自動裝箱:把 基本類型 包裝成對應(yīng)的 包裝類型 的過程
Integer a = 5;//a是引用類型,引用了包裝對象的地址。
編譯器會完成對象的自動裝箱:Integer a = Integer.valueOf(5);
自動拆箱:從包裝類型的值,自動變成 基本類型的值
int i = a;//a現(xiàn)在是包裝類型,沒法給變量賦值,需要把5取出來。
編譯器會完成自動拆箱:int i = a.intValue();
3.2 練習(xí): 自動裝箱與自動拆箱測試
創(chuàng)建包: cn.tedu.api
創(chuàng)建類: TestBox.java
package cn.tedu.api;
/*本類用于測試自動裝箱和自動拆箱*/
public class TestBox {
public static void main(String[] args) {
//1.定義包裝類型的數(shù)據(jù)
//回顧:以前創(chuàng)建包裝類型的兩種方式
Integer i1 = new Integer(127);
Integer i2 = Integer.valueOf(127);
//2.現(xiàn)在的方式:
/*1.自動裝箱:編譯器會自動把基本類型int 5,包裝成包裝類型Integer
* 然后交給i3來保存,自動裝箱底層發(fā)生的代碼Integer.valueOf(5);
* valueOf()的方向: int --> Integer*/
Integer i3 = 5;//不會報錯,這個現(xiàn)象就是自動裝箱
/*2.自動拆箱:編譯器會自動把包裝類型的i1拆掉"箱子",變回基本類型數(shù)據(jù)127
* 然后交給i4來保存,自動拆箱底層發(fā)生的代碼:i1.intValue();
* intValue()的方向:Integer -> int
* */
int i4 = i1;//不會報錯,這個現(xiàn)象就是自動拆箱
}
}
4 BigDecimal
BigDecimal:常用來解決精確的浮點(diǎn)數(shù)運(yùn)算不精確的問題
4.1 創(chuàng)建對象
方式一 :
BigDecimal(double val)
將double轉(zhuǎn)換為BigDecimal,后者是double的二進(jìn)制浮點(diǎn)值十進(jìn)制表示形式,有坑!
方式二 :
BigDecimal(String val)
將String類型字符串的形式轉(zhuǎn)換為BigDecimal
4.2 常用方法
Add(BigDecimal bd) : 做加法運(yùn)算
Subtract(BigDecimal bd) : 做減法運(yùn)算
Multiply(BigDecimal bd) : 做乘法運(yùn)算
Divide(BigDecimal bd) : 做除法運(yùn)算,除不盡時會拋異常
Divide(BigDecimal bd,保留位數(shù),舍入方式) : 除不盡時使用
setScale(保留位數(shù),舍入方式) : 同上
pow(int n) : 求數(shù)據(jù)的幾次冪
4.3 練習(xí):測試常用方法
創(chuàng)建包: cn.tedu.bigdecimal
創(chuàng)建類: TestBigDecimal.java
需求: 接收用戶輸入的兩個小數(shù),做運(yùn)算
package cn.tedu.api;
import java.math.BigDecimal;
import java.util.Scanner;
public class TestBigDecimal {
public static void main(String[] args) {
//f1();//使用普通的 +-*/ 四則運(yùn)算,暴露出浮點(diǎn)數(shù)運(yùn)算不精確的問題
f2();//使用BigDecimal來解決浮點(diǎn)數(shù)運(yùn)算不精確的問題
}
private static void f2() {
//1.提示并接收用戶輸入的兩個小數(shù)
System.out.println("請輸入您要計算的兩個小數(shù):");
double a = new Scanner(System.in).nextDouble();
double b = new Scanner(System.in).nextDouble();
//2.創(chuàng)建工具類對象,把基本類型a和b交給工具類對象BigDecimal來保存
/*1.最好不要用double作為構(gòu)造函數(shù)的參數(shù),不然還會有不精確的現(xiàn)象,有坑!!!*/
/*2.最好使用重載的,參數(shù)類型是String的構(gòu)造函數(shù)
* double轉(zhuǎn)String,直接拼個空串就可以*/
BigDecimal bd1 = new BigDecimal(a+"");
BigDecimal bd2 = new BigDecimal(b+"");
//3.通過BigDecimal的對象來調(diào)用其方法,實(shí)現(xiàn)精確運(yùn)算
//3.1 定義BigDecimal類型的引用類型變量來保存結(jié)果
BigDecimal bd3;
//3.2 Add(BigDecimal bd) : 做加法運(yùn)算
bd3 = bd1.add(bd2);
System.out.println(bd3);
//3.3 Subtract(BigDecimal bd) : 做減法運(yùn)算
bd3 = bd1.subtract(bd2);
System.out.println(bd3);
//3.4 Multiply(BigDecimal bd) : 做乘法運(yùn)算
bd3 = bd1.multiply(bd2);
System.out.println(bd3);
//3.5 Divide(BigDecimal bd) : 做除法運(yùn)算,除不盡時會拋異常
/*3.除法運(yùn)算,除不盡時會拋出異常ArithmeticException*/
//方案一:(除不盡時有問題)
//bd3 = bd1.divide(bd2);
/*divide(m,n,o)
m是要除以哪個對象,n指要保留幾位,o指舍入方式(比如四舍五入)*/
//方案二:
bd3 = bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP);
System.out.println(bd3);
}
private static void f1() {
//1.提示并接收用戶輸入的兩個小數(shù)
System.out.println("請輸入您要計算的兩個小數(shù):");
double a = new Scanner(System.in).nextDouble();
double b = new Scanner(System.in).nextDouble();
//2.做運(yùn)算
System.out.println(a + b);//不精確
System.out.println(a - b);//不精確
System.out.println(a * b);//不精確
System.out.println(a / b);//不精確
}
}
到這里,API第一課就結(jié)束啦,恭喜你又闖過一關(guān)哦~
5 拓展
舍入方式解析
ROUND_HALF_UP 四舍五入,五入 如:4.4結(jié)果是4; 4.5結(jié)果是5
ROUND_HALF_DOWN 五舍六入,五不入 如:4.5結(jié)果是4; 4.6結(jié)果是5
ROUND_HALF_EVEN 公平舍入(銀行常用)
比如:在5和6之間,靠近5就舍棄成5,靠近6就進(jìn)位成6,如果是5.5,就找偶數(shù),變成6
ROUND_UP 直接進(jìn)位,不算0.1還是0.9,都進(jìn)位
ROUND_DOWN 直接舍棄,不算0.1還是0.9,都舍棄
ROUND_CEILING(天花板) 向上取整,取實(shí)際值的大值
朝正無窮方向round 如果為正數(shù),行為和round_up一樣,如果為負(fù)數(shù),行為和round_down一樣
ROUND_FLOOR(地板) 向下取整,取實(shí)際值的小值
朝負(fù)無窮方向round 如果為正數(shù),行為和round_down一樣,如果為負(fù)數(shù),行為和round_up一樣
總結(jié)
到此這篇關(guān)于JAVA新手小白學(xué)正則表達(dá)式、包裝類、自動裝箱/自動拆箱以及BigDecimal的文章就介紹到這了,更多相關(guān)JAVA正則表達(dá)式、包裝類、自動裝箱/拆箱及BigDecimal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis如何實(shí)現(xiàn)@Select等注解動態(tài)組合SQL語句
這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)@Select等注解動態(tài)組合SQL語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
使用Java實(shí)現(xiàn)簡單搭建內(nèi)網(wǎng)穿透
內(nèi)網(wǎng)穿透是一種網(wǎng)絡(luò)技術(shù),適用于需要遠(yuǎn)程訪問本地部署服務(wù)的場景,本文主要為大家介紹了如何使用Java實(shí)現(xiàn)簡單搭建內(nèi)網(wǎng)穿透,感興趣的可以了解下2024-02-02
springboot實(shí)現(xiàn)發(fā)送QQ郵箱
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)發(fā)送QQ郵箱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06
java swing中實(shí)現(xiàn)拖拽功能示例
這篇文章主要介紹了java swing中實(shí)現(xiàn)拖拽功能示例,需要的朋友可以參考下2014-04-04
Log4j定時打印日志及添加模塊名配置的Java代碼實(shí)例
這篇文章主要介紹了Log4j定時打印日志及添加模塊名配置的Java代碼實(shí)例,Log4j是Apache的一個開源Java日志項(xiàng)目,需要的朋友可以參考下2016-01-01
SpringCloud?微服務(wù)數(shù)據(jù)權(quán)限控制的實(shí)現(xiàn)
這篇文章主要介紹的是權(quán)限控制的數(shù)據(jù)權(quán)限層面,意思是控制可訪問數(shù)據(jù)資源的數(shù)量,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-11-11

