与运行环境交互(下)
Math类
- Java提供了基本的+、-、*、/、%等基本算数运算的运算符、但对于更复杂的数学运算,例如三角函数、对数运算、指数运算等则无能为力。Java提供了Math工具类来完成这些复杂的运算
- Math类是一个工具类,它的构造器被定义成private,因此无法创建Math类的对象;Math类中所有方法都是类方法,可以直接通过类名来调用它们。
Random与ThreadLocalRandom
- Random类专门用于生成一个伪随机数,它又两个构造器:一个构造器使用默认的种子,另一个构造器需要程序员显式传入一个long型整形的种子。
- 相对于Math的random()方法而言,Random类的提供了更多方法生成各种伪随机数,它不仅可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围
- ThreadLocalRandom是Java 7新增的,它可以在多线程环境下代替Random减少多线程资源竞争,从而提供更好的线程安全
BigDecimal类
- float、double两种基本浮点类型的浮点数容易引起精度丢失。
- 程序中需要对double浮点数进行加、减、乘、除基本运算,则需要先将double类型数值包装成BigDecial对象,调用BigDecimal对象的方法执行运算后再将结果转换成double型变量
Date类
- Java提供了Date类来处理日期、时间
- Date类从JDK 1.0起就开始存在了。但正因为它历史悠久,所以它的大部分构造器、方法都已经过时,不再推荐使用了
Calendar类
- 因为Date类的设计上存在一些缺陷,Java提供了Calendar类来更好地处理日期和时间。Calendar是一个抽象类,它用于表示日历
- Calendar本身是一个抽象类,它是所有日历类的模板,并提供了一些所有日历通用的方法,但它本身不能直接实例化。程序只能创建Calendar子类的实例,Java本身提供了一个GregorianCalendar类,一个代表GergorianCalendar的子类,它代表了我们通常所说的公历。
- 开发者可以开发自己的Calendar子类
Java 8新增的日期、时间包
- Java 8专门新增了一个Java.time包,该包下包含了如下常用的类:
- Clock:该类用于获取指定时区的当前日期、时间。该类可取代System类的currentTimeMillis()方法,而且该类提供了更多的方法来获取当前日期、时间的方法。该类提供了大量静态方法类获取Clock对象
- Instant:代表一个具体的时刻,它可以精确到纳秒。该类提供了静态的now()方法来获取当前时刻,也可以提供了系类minusXxx()方法在当前时刻基础减去一段时间,也提供了plusXxx()方法在当前时刻基础上加上一段时间
- LocalDate: 代表日期,比如2020-01-14
- LocalTime: 代表时刻,比如12:59:59
- LocalDateTime: 代表具体时间 2020-01-12 12:22:26
- MonthDay:该类仅代表月日,比如:-04-12
- Year:该类仅代表年
- YearMonth:该类仅代表年月
- DayOfWeek:这是一个枚举类,定义了周日到周六的枚举值
- Month:这也是一个枚举值,定义了一月到十二月的枚举值
String类的正则表达式支持
- boolean matches(String regex):判断该字符串是否匹配指定正则表达式
- String repaceAll(String regex,String replacement):放回该字符串中所有匹配正则表达式的子串替换成replacement后的新字符串
- String replaceFirst(String regex,String repalcement):返回该字符串中第一个匹配正则表达式的替换成replacement后的字符串
- String[] split(String regex):根据给定正则表达式的拆分该字符串后得到的字符串数组
创建正则表达式
- 表达式就是一个字符串模板,可以匹配一批字符串,所以创建正则表达式就是创建一个特殊字符串
正则表达式所支持的合法字符
- x字符:x(x可代表任何合法的字符)\0mnn:8进制数0mnn所表示的字符
- \xhh:16进制0xhh所表示的字符
- \uhhhh:16进制值0xhhhh所表示的UNICODE字符
- \t:制表符
- \n:新行(换行)符(‘\u000A’)
- \r:回车符(‘\u000A’)
- \f:换页符(‘\u000c’)
- \a:报警(bell)符(‘\u0007’)
- \e:Escape符(‘\u001B’)
- \cx:对应的控制符。例如,\cM:匹配Ctrl-M。x值必须为A-Z或a-z之一
使用正则表达式
- 一旦在程序中定义了正则表达式之后,就可以使用Pattern和Matcher来使用正则表达式
- Pattern对象是正则表达式的编译后在内存中的表示形式,因此,正则表达式必须先被编译为Pattern对象,然后再利用该Pattern对象 创建对应的Matcher对象。执行匹配所涉及的状态保留再Matcher对象中,多个Matcher对象可共享同一个Pattern对象
方法处理和变量处理
- 通过VarHandle和MethodHandle类,允许Java像动态语言逸一样引用变量、引用方法,并调用它们
- MethodHandles.Lookup对象可以根据类、方法名、方法类型来获取MethodHandle对象,这意味着通过MethodHandle可以让Java动态调用某个方法。
- VarHandle主要用于动态操作数组的元素或对象的成员变量。VarHandle与MethodHandle非常相似,它也需要通过MethodHandles来获取实例,接下来调用VarHandle的方法即可动态操作指定数组的元素或指定对象的成员变量。
- VarHandle与MethodHandle一样,它也是一种动态滴哦也能够机制,当程序通过MethodHandles.Lookup来获取成员变量时,可根据字符串名称来获取成员变量,这个字符串名称同样可以是同台改变的,因此非常灵活。
处理带占位符的消息
- 此时需要使用MessageFormat类,该类包含一个有用的静态方法:
—format(String pattern,Object…values):返回后面的多个参数值填充前面的pattern的字符串,其中pattern字符串不是正则表达式,而是一个带占位符的字符串
使用NumberFormat格式化
-
NumberFormat和DateFormat都包含了format和parse方法,其中format用于将数字、日期格式化成字符串,parse用于将字符串解析成数值、日期
-
NumberFormat也是一个抽象基类,所以无法通过它的构造器来创建NumberFormat对象,它提供了如下几个工厂方法来得到
NumberFormat对象:
—getCurrenyInstance:返回默认Locale的货币格式器。也可以再调用该方法传入指定Loale,则获取指定Locale的货币格式器
—getIntegerInstance:返回默认Locale的整数各时期。也可以再调用该方法传入指定的Locale,则获取指定的Locale的整数格式器
—getNumberInstance:返回默认Locale的通用数值各时期。也可以在调用该方法传入指定Locale,则获取指定Locale的通用数值格式器
—getPercentInstance:返回默认Locale的百分数格式器。也可以在调用该方法传入指定Locale,则获取指定Loale的百分数格式器
使用DateFormat
- 与NumberFormat相似的是:DateFormat也是一个抽象类,它也提供了几个工厂方法用于获取DateFormat对象:
- getDateInstance:返回一个日期格式器,它格式化后的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和Locale等参数。如果不指定这些参数,则使用默认的参数
- getTimeInstance:返回一个时间格式器,它格式化后的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定日期样式、时间样式和Locale等参数。如果不指定这些参数,则使用默认参数
使用SimpleDateFormat
- SimpleDateFormat是DateFormat的子类,正如它的名字所暗示的,它是”简单“的日期格式器。很多读者对”简单“的日期格式器不屑一顾,实际上SimpleDateFormat比DateFormat更简单、功能更强大。
- SimpleDateFormat可以非常灵活地输格式化Date,可可以非常接卸各种格式的日期字符串。创建SimpleDateFormat对象时需要传入一个pattern字符串,这个pattern不是正则表达式,而是一个日期模板字符串