第十一章 正则表达式、包装类和BigDecimal

文章目录

  • 第十一章 正则表达式、包装类和BigDecimal
  • 一、正则表达式
  • 二、包装类
    • 1.概述
    • 2.装箱与拆箱:
    • 3.基本数据和包装类之间的转换
    • 4.基本数据类型和包装类的转换
    • 5.包装类对象之间的比较:
  • 三、BigDecimal
    • 1.概述
    • 2.常用构造函数
    • 3.常用方法
    • 4.大小比较

一、正则表达式

本篇仅对正则表达式作简单介绍,不做深入解析

正则表达式定义了字符串的模式
正则表达式可以用来搜索、编辑或处理文本
正则表达式并不仅限于某一种语言,在不同语言中有细微的差别

实例:
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 “Hello World” 字符串

.(点号)也是一个正则表达式,它匹配任何一个字符如:“a” 或 “1”

this is text
匹配字符串 “this is text”

this\s+is\s+text
注意字符串中的 \s+
匹配单词 “this” 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,在之后 \s+ 匹配多个空格然后再跟上 text 字符串
可以匹配这个实例:this is text

^\d+(.\d+)?
^ 定义了以什么开始
\d 匹配一个或多个数字
? 设置括号内的选项是可选的
. 匹配 “.”
可以匹配的实例:“5”,“1.5” 和 “2.21”

Java 正则表达式和 Perl 的是最为相似的

java.util.regex 包主要包括以下三个类:

  • Pattern 类:
    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern对象。该方法接受一个正则表达式作为它的第一个参数
  • Matcher 类:
    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与 Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象
  • PatternSyntaxException:
    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误

以下实例实现了查找字符串中是否包含了 sisyphus 子串:

import java.util.regex.*;class RegexExample1{public static void main(String[] args){String content = "I am demo" +"from sisyphus.com.";String pattern = ".*sisyphus.*";boolean isMatch = Pattern.matches(pattern, content);System.out.println("字符串中是否包含了 'sisyphus' 子字符串? " + isMatch);}
}

运行结果:

字符串中是否包含了 ‘sisyphus’ 子字符串? true

以下实例实现了判断身份证号格式是否正确:

package com.sisyphus.regex;import java.util.Scanner;public class TestRegex {public static void main(String[] args) {//1.接收身份证号System.out.println("请输入您的身份证号:");String input = new Scanner(System.in).nextLine();//2.编辑正则表达式//身份证号的规律:一般都是 18 位,前 17 位是数字//最后一位可能是数字,也可能是 X//单个 \ 在 java 中有特殊的意义,会认为这是一个转义字符//如果想使用 \ 需要在 \ 前面再加一个 \ 也就是 \\String regex = "\\d{17}[0-9X]";//3.判断用户输入的数据是否符合正则的规则if (input.matches(regex)){System.out.println("身份证号格式正确");}else{System.out.println("身份证格式错误!");}}
}

运行结果:

请输入您的身份证号:
12345620001010789X
身份证号格式正确

请输入您的身份证号:
X12345678912345678
身份证格式错误!

二、包装类

1.概述

Java 中的基本数据类型没有属性和方法,而包装类就是为了让它们拥有属性和方法,实现对象化交互

基本类型 对应的包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

数值型包装类都继承自 Number,而字符型和布尔型继承自 Object

2.装箱与拆箱:

  • 装箱:基本数据类型转换为包装类
  • 拆箱:包装类转换为基本数据类型

自动装箱与自动拆箱实例:

package com.sisyphus.temp;public class Number {public static void main(String[] args) {//1.定义包装类型的数据//回顾:以前创建包装类型的两种方式Integer i1 = new Integer(127);Integer i2 = Integer.valueOf(127);//2.现在的方式/**1.自动装箱:编译器会自动把基本类型 int 包装成包装类型 Integer* 然后交给 i3 来保存,自动装箱底层发生的阿代码是 Integer.valueOf();* valueOf() 的转换方向:int -> Integer*/Integer i3 = 5;//不会报错,这个现象就是自动装箱/**2.自动拆箱:编译器会自动把包装类型的 i1 拆掉“箱子”,变回基本数据类型* 然后交给 i4 来保存,自动拆箱底层发生的代码是 i1.intValue();* intValue() 的转换方向:Integer -> int*/int i4 = i1;//不会报错,这个现象就是自动拆箱}
}

3.基本数据和包装类之间的转换

package com.sisyphus.temp;public class Number {public static void main(String[] args) {//1.自动装箱int t1 = 1;Integer t2 = t1;//2.手动装箱Integer t3 = new Integer(t1);System.out.println("int 类型 t1 = " + t1);System.out.println("自动装箱,Integer 类型对象 t2 =" + t2);System.out.println("手动装箱,Integer 类型对象 t3 =" + t3);//1.自动拆箱int t4 = t2;//2.手动拆箱//通过 intValue() 方法返回 int 值int t5 = t2.intValue();System.out.println("自动拆箱,int 型 t4 = " + t4);System.out.println("手动拆箱,int 型 t5 = " + t5);}
}

int 类型 t1 = 1
自动装箱,Integer 类型对象 t2 =1
手动装箱,Integer 类型对象 t3 =1
自动拆箱,int 型 t4 = 1
手动拆箱,int 型 t5 = 1

4.基本数据类型和包装类的转换

package com.sisyphus.temp;public class Number {public static void main(String[] args) {//1.1将基本数据类型转换为字符串int t1 = 12;String t2 = Integer.toString(t1);System.out.println("int 转换为 String:" + t2);//1.2通过 parseInt(),将字符串转换为基本数据类型int t3 = Integer.parseInt(t2);//2.通过 valueOf(),先把字符串转换为包装类,然后自动拆箱完成转换int t4 = Integer.valueOf(t2);System.out.println("t3:" + t3);System.out.println("t4:" + t4);}
}

运行结果:

int 转换为 String:12
t3:12
t4:12

5.包装类对象之间的比较:

package com.sisyphus.temp;public class Number {public static void main(String[] args) {Integer one = new Integer(100);Integer two = new Integer(100);//one 和 two 是两个不同的对象,== 比较的是内存地址,因此结果为 falseSystem.out.println("one == two:" + (one == two));//自动装箱,实际执行的是 Integer three = Integer.valueOf(100)// 这时缓存区没有,会构造一个Integer three = 100;System.out.println("three == 100:" + (three == 100));//自动拆箱//这时缓存区有,就会直接取用/**Java 为了提高拆箱效率,在执行过程中提供了一个缓存区(对象池)【类似于常量数组】* 如果传入的参数在区间 [-128,127] 之间,就会直接去缓存查找数据,如果有就直接取用* 如果没有就隐式调用 new 方法*/Integer four = 100;System.out.println("three == four:" + (three == four));//之所以加括号是因为 + 的优先级比 == 大//测试一下超过 200 的数Integer five = 200;System.out.println("five == 200:" + (five == 200));Integer six = 200;System.out.println("five == six:" + (five == six));}
}

运行结果:

one == two:false
three == 100:true
three == four:true
five == 200:true
five == six:false

三、BigDecimal

1.概述

Java 在 java.math 包中提供的 API 类 BigDecimal,用来对超过 16 位有效位的数进行精确的运算。双精度浮点型变量 double 可以处理 16 位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理

一般情况下,对于那些不需要精确计算精度的数字,我们可以直接使用 Float 和 Double 处理,但是 Double.valueOf(String) 和 Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用 BigDecimal 类来操作

BigDecimal 所创建的是对象,故我们不能使用传统的 +、-、×、/ 等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是 BigDecimal 对象

2.常用构造函数

  • BigDecimal(int)
    创建一个具有参数所指定整数值的对象
  • BigDecimal(double)
    创建一个具有参数所指定双精度值的对象
  • BigDecimal(long)
    创建一个具有参数所指定长整数值的对象
  • BigDecimal(String)
    创建一个具有参数所指定以字符串表示的数值的对象

实例:

BigDecimal a =new BigDecimal(0.1);
System.out.println("a values is:"+a);
BigDecimal b =new BigDecimal("0.1");
System.out.println("b values is:"+b);

运行结果:

a values is:0.1000000000000000055511151231257827021181583404541015625
b values is:0.1

原因分析:

参数类型为 double 的构造方法的结果有一定的不可预知性,有人可能认为在 Java 中写入 newBigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1 ,但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)

而String 构造方法是完全可预知的,new BigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1.因此,通常建议优先使用 String 构造方法

当 double 必须用作 BigDecmal 的源时,采取以下操作:
先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,最后要获取该结果,使用 static valueOf(double)

package com.sisyphus.bigdecimal;import java.math.BigDecimal;
import java.util.Scanner;/**本类用作浮点数运算不精确的解决方案*/
public class TestBigDecimal {public static void main(String[] args) {f2();//使用 BigDecimal 解决浮点数运算不精确的问题}private static void f1() {System.out.println("请输入您要计算的第一个数");Scanner scanner = new Scanner(System.in);double a = scanner.nextDouble();System.out.println("请输入您要计算的第二个数");Scanner scanner1 = new Scanner(System.in);double b = scanner1.nextDouble();//2.创建工具类对象BigDecimal bd1 = new BigDecimal(String.valueOf(a));//传 Stirng 类型的参数BigDecimal bd2 = new BigDecimal(String.valueOf(b));//传 Stirng 类型的参数//3.通过工具类对象进行四则运算//定义同类型的 BigDecimal引用类型变量来保存结果BigDecimal bd3;//用于保存结果bd3 = bd1.add(bd2);//做加法运算System.out.println(bd3);bd3 = bd1.subtract(bd2);//做减法运算System.out.println(bd3);bd3 = bd1.multiply(bd2);//做乘法运算System.out.println(bd3);//divide(除数,保留位数,舍入方式【四舍五入】)bd3 = bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP);//做除法运算System.out.println(bd3);}
}

运行结果::

请输入您要计算的第一个小数
请输入您要计算的第一个小数
10
请输入您要计算的第二个小数
3
13.0
7.0
30.00
3.333

3.常用方法

  • add(BigDecimal)
    BigDecimal 对象中的值相加,返回 BigDecimal 对象
  • subtract(BigDecimal)
    BigDecimal 对象中的值相减,返回 BigDecimal 对象
  • multiply(BigDecimal)
    BigDecimal 对象中的值相乘,返回 BigDecimal 对象
  • divide(BigDecimal)
    BigDecimal 对象中的值相除,返回 BigDecimal 对象
  • toString()
    将 BigDecimal 对象中的值转换成字符串
  • doubleValue()
    将 BigDecimal 对象中的值转换成双精度数
  • floatValue()
    将 BigDecimal 对象中的值转换成单精度数
  • longValue()
    将 BigDecimal 对象中的值转换成长整数
  • intValue()
    将 BigDecimal 对象中的值转换成整数

4.大小比较

Java 中对 BigDecimal 比较大小一般用的是 compareTo() 方法

int a = bigdecimal.compareTo(bigdecimal2)

a 的值:

a = -1,表示 bigdecimal 小于 bigdecimal2
a = 0,表示 bigdecimal 等于 bigdecimal2
a = 1,表示 bigdecimal 大于 bigdecimal2

【JAVA SE】第十一章 正则表达式、包装类和BigDecimal相关推荐

  1. Java SE第8章 Java集合

    Java SE第8章 Java集合 1. 集合的概念和作用 2. 使用Lambad表达式遍历集合 3.Collection集合的常规用法 4. 使用Predicate操作集合 5.使用Iterator ...

  2. 【JAVA SE】第一章 Java语言概述、环境变量和HelloWorld

    第一章 Java语言概述.环境变量和HelloWorld 文章目录 第一章 Java语言概述.环境变量和HelloWorld 一.Java语言概述 1.Java简介 2.Java发展历史 3.Java ...

  3. ios 获取一个枚举的所有值_凯哥带你从零学大数据系列之Java篇---第十一章:枚举...

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  4. [深入理解Java虚拟机]第十一章 程序编译与代码优化-晚期(运行期)优化

    概述 在部分的商用虚拟机(Sun HotSpot.IBM J9)中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认 ...

  5. 【JAVA SE】第九章 接口

    第九章 接口 文章目录 第九章 接口 一.概念 二.接口与类 1.相似点 2.区别 三.接口特性 四.接口的声明 五.接口的实现 六.接口的继承 七.接口的多继承 八.标记接口 一.概念 接口(Int ...

  6. 用JAVA编写一个水果箱,Java SE 第四章类之间的关系--水果箱编程题

    问题:有一个水果箱(Box),箱子里装有水果(Fruit),每一种水果都有不同的重量和颜色,水果有:苹果.梨.桔子.每个苹果(Apple)都有不同的重量和颜色,每个桔子(Orange)都有不同的重量和 ...

  7. Linux 笔记 - 第十一章 正则表达式

    博客地址:http://www.moonxy.com 一.前言 正则表达式(英语为 Regular Expression,在代码中常简写为 regex.regexp 或 RE),是使用单个字符串来描述 ...

  8. java SE(十一)——File、方法递归、IO流

    File.方法递归.IO流 File(定位.操作文件) 前言 File类概述 File类的常用API 判断文件类型.获取文件信息 创建文件.删除文件功能 遍历文件夹 方法递归 递归的形式和特点 递归的 ...

  9. 【JAVA SE】第二章 Java语法基础、数据类型、基本类型的字面值、基本类型的类型转换和运算规则

    第二章 Java语法基础.数据类型.基本类型的字面值.基本类型的类型转换.运算规则和标识符命名风格 文章目录 第二章 Java语法基础.数据类型.基本类型的字面值.基本类型的类型转换.运算规则和标识符 ...

最新文章

  1. 【网络安全】 利用 EHole 进行红队快速批量打点
  2. win10系统下安装Navicat for MySql 连接出现错误解决方法
  3. C语言文件读写(结构体文件)
  4. 项目宝提供的服务器,开源WebSocket服务器项目宝贝鱼CshBBrain V4.0.1 和 V2.0.2发布
  5. [BZOJ4349]最小树形图
  6. python爬取新闻网站内容findall函数爬取_Python爬取新闻网标题、日期、点击量
  7. OpenCV实现截图并保存到另外一张图
  8. java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表
  9. Akka查询设备组《fourteen》译
  10. python -- 判断给定的参数是否是地理位置的经度和纬度
  11. 耗时一个月,总结的Linux C++后台开发学习路线(已签腾讯sp,附学习资料)
  12. 数学建模常用模型04 :灰色关联分析法
  13. 【整理】SISD、MIMD、SIMD、MISD计算机的体系结构的Flynn分类法
  14. pythonl list 的修改元素
  15. 数据分析案例-数据可视化
  16. 火狐浏览器打不开淘宝首页的解决办法
  17. Android adb常用命令 app流量消耗获取
  18. 在windows系统上安装双系统
  19. 微医网爬虫(二) java实现
  20. 登上 Science,AlphaZero完整论文首次发布

热门文章

  1. vant在cell中加表格_Vant Cell 单元格
  2. Java抓取Codeforces——针对某一次提交的源码和数据
  3. C# ToString()和Convert.ToString()的区别【转】
  4. c# 拼凑特定格式的报表打印
  5. python对比图片
  6. TCP/IP详解学习笔记(1)
  7. (一)问候 Log4j 你好
  8. Asp.Net Core发布绑定域名和端口
  9. codeblocks 调试
  10. CFileDialog常见用法