新手小白学JAVA 正则表达式 包装类 自动装箱/自动拆箱 BigDecimal

新手小白学JAVA 正则表达式 包装类 自动装箱/自动拆箱 BigDecimal1正则表达式Regex1.1概述正确的字符串格式规则。常用来判断用户输入的内容是否符合格式的要求,注意是严格区分大小写的。1.2常见语法1.3String提供了支持正则表达式的方法Matches(正则):当前字符串能否匹配正则表达式replaceAll(正则,子串):替换子串split(正则):拆分字符串1.4练习:测试输入身份证号创建包:cn.tedu.api创建类:TestRegex.javapackagecn.tedu.api;impo

大家好,又见面了,我是你们的朋友全栈君。

1 正则表达式Regex

1.1 概述

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

1.2 常见语法

在这里插入图片描述

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

Matches(正则) : 当前字符串能否匹配正则表达式
replaceAll(正则,子串) : 替换子串
split(正则) : 拆分字符串

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

创建包: cn.tedu.api
创建类: TestRegex.java

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

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

创建对象

  1. new Double(3.14)
  2. Double.valueOf(3.14)//和 new 没有区别

常用方法

Double.parseDouble();

2.5 练习: Number之Double

创建包: cn.tedu.api
创建类: TestNumber.java

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

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
需求: 接收用户输入的两个小数,做运算

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一样

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133788.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 使用wangEditor批量上传并且保证图片顺序

    使用wangEditor批量上传并且保证图片顺序

  • oracle物化视图可以创建索引,oracle 物化视图及创建索引

    oracle物化视图可以创建索引,oracle 物化视图及创建索引物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。1、物化视图的类型:ONDEMAND、ONCOMMIT二者的区别在于刷新方法的不同,ONDEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(RE…

  • ioctl() FIONREAD 检测socket是否有数据可读

    ioctl() FIONREAD 检测socket是否有数据可读先看看FIONREAD的作用FIONREAD:Getthenumberofbytesintheinputbuffer获取接收缓存中数据的字节数项目中用来判断tcpsocket是否有数据接收到,但是出现了一个问题,对于用于accept的socket即调用listen()之后的socket,用FIONREAD,判断的时候报错,ioctl()返回-1,错误码是2…

  • python中的merge函数_Python Merge函数原理及用法解析[通俗易懂]

    python中的merge函数_Python Merge函数原理及用法解析[通俗易懂]Merge函数的用法jfz免费资源网简单来说Merge函数相当于Excel中的vlookup函数。当我们对2个表进行数据合并的时候需要通过指定两个表中相同的列作为key,然后通过key匹配到其中要合并在一起的values值。jfz免费资源网然后对于merge函数在Pandas中分为1vs1,多(m)vs1,以及多(m)vs多(m)这三种场景。但是平时用的最多的往往是多vs1的这种场景。也就是说2…

  • L2-021 点赞狂魔(排序)「建议收藏」

    L2-021 点赞狂魔(排序)「建议收藏」原题链接微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。输入格式:输入在第一行给出一个正整数N(≤100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name K F​1​

  • create table as select * from mysql_达梦数据库建表语句

    create table as select * from mysql_达梦数据库建表语句达梦数据库建表语句之createtableasselect注意事项

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号