广告位联系
返回顶部
分享到

java新手小白学正则表达式、包装类、自动装箱/自动拆箱以及BigDecimal

java 来源:互联网 作者:秩名 发布时间:2022-03-01 16:56:21 人浏览
摘要

1 正则表达式Regex 1.1 概述 正确的字符串格式规则。 常用来判断用户输入的内容是否符合格式的要求,注意是严格区分大小写的。 1.2 常见语法 1.3 String提供了支持正则表达式的方法 Ma

1 正则表达式Regex

1.1 概述

正确的字符串格式规则。

常用来判断用户输入的内容是否符合格式的要求,注意是严格区分大小写的。

1.2 常见语法

1.3 String提供了支持正则表达式的方法

Matches(正则) : 当前字符串能否匹配正则表达式

replaceAll(正则,子串) : 替换子串

split(正则) : 拆分字符串

1.4 练习:测试输入身份证号

创建包: cn.tedu.api

创建类: TestRegex.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

package cn.tedu.api;

 

import java.util.Scanner;

/*本类用于正则表达式入门案例*/

//需求:接收用户输入的身份证号,并将判断的结果输出

public class TestRegex {

    public static void main(String[] args) {

        //1.编辑正则表达式

        //身份证号的规律:一共是18位,前17位是数子,第18位有可能是数字,也有可能是X

        //String regex = "[0-9]{17}[0-9X]";

        /*单个\在Java中有特殊的含义,表示转义符号,不认为是一个斜杠

         * 所以如果想要表示斜杠,需要在它的前面加一个用来转义的\

         * 也就是\\才表示成一个单纯的斜杠

         * \t -- 制表符  \r回车符 \n换行符*/

        String regex = "\\d{17}[0-9X]";

 

        //2.定义变量用来接收用户输入的身份证号:

        String input;

 

        //3.判断用户输入的数据是否符合正则表达式,如果不正确,继续输入

        do {

            System.out.println("请输入您的身份证号:");

            input = new Scanner(System.in).nextLine();

            if (input.matches(regex)) {//如果身份证号正确

                System.out.println("恭喜你!输入正确!");

                return;//结束本方法

            }

        } while (!input.matches(regex));//只要不符合正则表达式,就继续输入

    }

}

2 包装类

把基本类型进行包装,提供更加完善的功能。

基本类型是没有任何功能的,只是一个变量,记录值,而包装类可以有更加丰富的功能

2.1 与基本类型的对应关系

2.2 Number

数字包装类的抽象父类。

提供了各种获取值的方式。

2.3 Integer 创建对象

方式一: new Integer(5);

方式二: Integer.valueOf(5);

Integer类中包含256个Integer缓存对象,范围是 -128~127

使用valueOf()时,如果指定范围内的值,直接访问缓存对象不新建;如果指定范围外的值,直接新建对象。

常见方法

static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析

2.4 练习: Number之Integer

创建包: cn.tedu. api

创建类: TestNumber.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

package cn.tedu.api;

/*本类用于测试包装类*/

public class TestNumber {

    //1.定义成员变量,注意要设置成静态的,因为静态只能调用静态

    static Integer i0;

    public static void main(String[] args) {

        //2.打印Integer的默认值进行测试

        System.out.println(i0);//默认值为null

 

        //3.创建int类型对应的包装类Integer类型的对象--方式一

        Integer i1 = new Integer(5);

        Integer i11 = new Integer(5);

        System.out.println( i1 == i11 );//false,==对于引用类型,比较的是地址值

 

        //4.创建int类型对应的包装类Integer类型的对象--方式二

        /*Integer有一个高效的效果,数据在:(-128~127)

        * 在此范围内,相同的数据只会存一次,后续再存都是使用之前存过的数据*/

        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

创建对象

  • new Double(3.14)
  • Double.valueOf(3.14)//和 new 没有区别 常用方法

Double.parseDouble();

2.5 练习: Number之Double

创建包: cn.tedu.api

创建类: TestNumber.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

package cn.tedu.api;

/*本类用于测试基本类型的包装类*/

public class TestNumber {

    public static void main(String[] args) {

        //1.创建int包装类Integer对象的方式1

        Integer i1 = new Integer(100);

        Integer i11 = new Integer(100);

        System.out.println(i1 == i11);//false,new了两次,是两个不同的对象,地址值不同

 

        //2.创建int包装类Integer对象的方式2

        /*Integer有一个高效的效果,但是必须满足3个条件:

        * 1.是Integer类型

        * 2.使用valueOf()的创建方式

        * 3.数据在-128~127的范围内

        * 满足以上条件,相同的数据只会存一次,后续再使用都是以前存过的数据*/

        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 超出高效的数据范围-128~127

 

        //3.创建double包装类Double对象的方式1

        Double d1 = new Double(3.14);

        Double d11 = new Double(3.14);

        System.out.println(d1 == d11);//false,创建两个不同的对象,地址值不同

 

        //4.创建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类型的数据转成int

        /*对象是什么类型的,就可以使用这个类的所有资源

        i1是Integer类型的对象,所以可以使用parseInt()将String类型的数据转为int类型

        d1是Double类型的对象,所以可以使用parseDouble()将String类型的数据转为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 概述

自动装箱:把 基本类型 包装成对应的 包装类型 的过程

Integer a = 5;//a是引用类型,引用了包装对象的地址。

编译器会完成对象的自动装箱:Integer a = Integer.valueOf(5);

自动拆箱:从包装类型的值,自动变成 基本类型的值

int i = a;//a现在是包装类型,没法给变量赋值,需要把5取出来。

编译器会完成自动拆箱:int i = a.intValue();

3.2 练习: 自动装箱与自动拆箱测试

创建包: cn.tedu.api

创建类: TestBox.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package cn.tedu.api;

/*本类用于测试自动装箱和自动拆箱*/

public class TestBox {

    public static void main(String[] args) {

        //1.定义包装类型的数据

        //回顾:以前创建包装类型的两种方式

        Integer i1 = new Integer(127);

        Integer i2 = Integer.valueOf(127);

        //2.现在的方式:

        /*1.自动装箱:编译器会自动把基本类型int 5,包装成包装类型Integer

        * 然后交给i3来保存,自动装箱底层发生的代码Integer.valueOf(5);

        * valueOf()的方向: int --> Integer*/

        Integer i3 = 5;//不会报错,这个现象就是自动装箱

        /*2.自动拆箱:编译器会自动把包装类型的i1拆掉"箱子",变回基本类型数据127

        * 然后交给i4来保存,自动拆箱底层发生的代码:i1.intValue();

        * intValue()的方向:Integer -> int

        * */

        int i4 = i1;//不会报错,这个现象就是自动拆箱

    }

}

4 BigDecimal

BigDecimal:常用来解决精确的浮点数运算不精确的问题

4.1 创建对象

方式一 :

BigDecimal(double val)

将double转换为BigDecimal,后者是double的二进制浮点值十进制表示形式,有坑!

方式二 :

BigDecimal(String val)

将String类型字符串的形式转换为BigDecimal

4.2 常用方法

Add(BigDecimal bd) : 做加法运算
Subtract(BigDecimal bd) : 做减法运算
Multiply(BigDecimal bd) : 做乘法运算
Divide(BigDecimal bd) : 做除法运算,除不尽时会抛异常
Divide(BigDecimal bd,保留位数,舍入方式) : 除不尽时使用
setScale(保留位数,舍入方式) : 同上
pow(int n) : 求数据的几次幂

4.3 练习:测试常用方法

创建包: cn.tedu.bigdecimal

创建类: TestBigDecimal.java

需求: 接收用户输入的两个小数,做运算

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

package cn.tedu.api;

 

import java.math.BigDecimal;

import java.util.Scanner;

 

public class TestBigDecimal {

    public static void main(String[] args) {

        //f1();//使用普通的 +-*/ 四则运算,暴露出浮点数运算不精确的问题

        f2();//使用BigDecimal来解决浮点数运算不精确的问题

    }

 

    private static void f2() {

        //1.提示并接收用户输入的两个小数

        System.out.println("请输入您要计算的两个小数:");

        double a = new Scanner(System.in).nextDouble();

        double b = new Scanner(System.in).nextDouble();

        //2.创建工具类对象,把基本类型a和b交给工具类对象BigDecimal来保存

        /*1.最好不要用double作为构造函数的参数,不然还会有不精确的现象,有坑!!!*/

        /*2.最好使用重载的,参数类型是String的构造函数

        * double转String,直接拼个空串就可以*/

        BigDecimal bd1 = new BigDecimal(a+"");

        BigDecimal bd2 = new BigDecimal(b+"");

 

        //3.通过BigDecimal的对象来调用其方法,实现精确运算

        //3.1 定义BigDecimal类型的引用类型变量来保存结果

        BigDecimal bd3;

        //3.2 Add(BigDecimal bd) : 做加法运算

        bd3 = bd1.add(bd2);

        System.out.println(bd3);

        //3.3 Subtract(BigDecimal bd) : 做减法运算

        bd3 = bd1.subtract(bd2);

        System.out.println(bd3);

        //3.4 Multiply(BigDecimal bd) : 做乘法运算

        bd3 = bd1.multiply(bd2);

        System.out.println(bd3);

        //3.5 Divide(BigDecimal bd) : 做除法运算,除不尽时会抛异常

        /*3.除法运算,除不尽时会抛出异常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.提示并接收用户输入的两个小数

        System.out.println("请输入您要计算的两个小数:");

        double a = new Scanner(System.in).nextDouble();

        double b = new Scanner(System.in).nextDouble();

 

        //2.做运算

        System.out.println(a + b);//不精确

        System.out.println(a - b);//不精确

        System.out.println(a * b);//不精确

        System.out.println(a / b);//不精确

    }

}

到这里,API第一课就结束啦,恭喜你又闯过一关哦~

5 拓展

舍入方式解析

ROUND_HALF_UP 四舍五入,五入 如:4.4结果是4; 4.5结果是5

ROUND_HALF_DOWN 五舍六入,五不入 如:4.5结果是4; 4.6结果是5

ROUND_HALF_EVEN 公平舍入(银行常用)

比如:在5和6之间,靠近5就舍弃成5,靠近6就进位成6,如果是5.5,就找偶数,变成6

ROUND_UP 直接进位,不算0.1还是0.9,都进位

ROUND_DOWN 直接舍弃,不算0.1还是0.9,都舍弃

ROUND_CEILING(天花板) 向上取整,取实际值的大值

朝正无穷方向round 如果为正数,行为和round_up一样,如果为负数,行为和round_down一样

ROUND_FLOOR(地板) 向下取整,取实际值的小值

朝负无穷方向round 如果为正数,行为和round_down一样,如果为负数,行为和round_up一样


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/weixin_43884234/article/details/116865138
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计