前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:深入、全面、系统的介绍java的基础知识 🌰 文章简介:本文将介绍java常用的工具类,建议收藏备用,创作不易,敬请三连哦 。
文章目录
- 1. Objects类
- 2.StringBuffer、StringBuilder
- 3.ThreadLocalRandom与Random
- 4.BigDecimal类
- 5.java.time包
- 6.正则表达式相关工具类
Java中有许多方便的工具类,可以避免方法传入空参数的Objects类,实现java国际化的Locale类,ResourceBundle类,避免计算浮点数计算精度损失的BigDecimal运算类…
1. Objects类
ava7新增了Objects类,不会引发空指针异常,如果不确定一个对象是否为空,可以使用这个类的方法。在传入参数时可以使用Objects类中的requireNonNull()方法,防止传入的参数为null。
import java.util.Objects; | |
public class ObjectsTest { | |
static ObjectsTest obj; | |
public static void main(String[] args) { | |
// 打印结果:null | |
System.out.println(Objects.toString(obj)); | |
// 要求某个对象不为null,返回该对象,否则引发异常且报错进行提示 | |
obj = new ObjectsTest(); | |
System.out.println(Objects.requireNonNull(obj, "该对象未进行初始化!")); | |
} | |
} |
2.StringBuffer、StringBuilder
String创建的字符串对象不可以改变,StringBuffer与StringBuilder都可以改变,其中StringBuffer类型是线程安全的,但其效率也会降低点。
String有许多API,可以实现将字符数组与字符串序列相互转换,可以将StringBuilder、StringBuffering类数据转换为String类,也可以与它们进行值的比较。
StringBuffer与StringBuilder类中有length()与capcity()两个方法,前者表示字符串序列的长度,二者表示容量。
3.ThreadLocalRandom与Random
Random用于生成伪随机数(比Math类提供了更多方式),ThreadLocalRandom是其线程安全的增强版,也提供了指定范围的随机数生成方法。
import java.util.Random; | |
public class RandomTest { | |
public static void main(String[] args) { | |
// 使用默认种子生成伪随机数,以当前时间为种子 | |
Random rd = new Random(); | |
// 伪随机生成boolean值 | |
System.out.println("rd.nextBoolean():" + rd.nextBoolean()); | |
// 伪随机生成平均值是0.0,标准差是1 .0的高斯数 | |
System.out.println("rd.nextGaussian():" + rd.nextGaussian()); | |
// 伪随机生成0~26之间的int值 | |
System.out.println("rd.nextInt(26):" + rd.nextInt(26)); | |
// rd1与rd2的种子一样,方法调用顺序也相同,生成的结果一样,所以是伪随机数 | |
System.out.println("------------"); | |
Random rd1 = new Random(50); | |
System.out.println("rd1.nextBoolean():" + rd1.nextBoolean()); | |
System.out.println("rd1.nextGaussian():" + rd1.nextGaussian()); | |
System.out.println("rd1.nextInt(26):" + rd1.nextInt(26)); | |
System.out.println("------------"); | |
Random rd2 = new Random(50); | |
System.out.println("rd2.nextBoolean():" + rd2.nextBoolean()); | |
System.out.println("rd2.nextGaussian():" + rd2.nextGaussian()); | |
System.out.println("rd2.nextInt(26):" + rd2.nextInt(26)); | |
} | |
} |
4.BigDecimal类
BigDecimal提供精确计算浮点数的方式。
import java.math.BigDecimal; | |
public class BigDecimalTest { | |
public static void main(String[] args) { | |
// 输出0.05+0.01=0.060000000000000005 | |
System.out.println("0.05+0.01=" + (0.05 + 0.01)); | |
BigDecimal f1 = new BigDecimal("0.05"); | |
BigDecimal f2 = BigDecimal.valueOf(0.01); | |
BigDecimal f3 = new BigDecimal(0.05); | |
// 基于String作为BigDecimal构造器参数,输出0.05+0.01=0.06,推荐! | |
System.out.println("0.05+0.01=" + f1.add(f2)); | |
// 基于Double作为BigDecimal构造器参数,输出0.05+0.01=0.06000000000000000277555756156289135105907917022705078125 | |
System.out.println("0.05+0.01=" + f2.add(f3)); | |
} | |
} |
如果程序需要对于double浮点数进行精确的加、减、乘、除运算,可以编写一个Arith工具类,在这个类里面使用BigDecimal类返回精确的计算结果。
5.java.time包
java8以前使用Data类、Calendar类来实现对于日期、时间的处理,但由于Date类设计存在问题,Calendar过于复杂,Java8吸取了Joda-Time库,提供一个java.time包用于处理时间。
public class NewDatePackageTest { | |
public static void main(String[] args) { | |
// -------Clock类的使用:可取代System.currentTimeMillis()方法获取当前时间-------- | |
Clock clock = Clock.systemUTC(); | |
// 输出 当前时刻为:2021-04-01T06:50:55.221Z,注意这里打印的时间是UTC时间,北京时间=UTC+8h | |
System.out.println("当前UTC时刻为:" + clock.instant()); | |
// clock对应的毫秒数,下面二者打印内容相同 | |
System.out.println(clock.millis()); | |
System.out.println(System.currentTimeMillis()); | |
// --------Duration类的用法:获取一段时间进行计算------------ | |
Duration d = Duration.ofSeconds(3600 * 8); | |
System.out.println("3600 * 8 秒=" + d.toHours() + "时"); | |
Clock clock2 = Clock.offset(clock, d); | |
System.out.println("当前时刻的北京时间" + clock2.instant()); | |
// ------------Instant类的用法,可以获取精确到纳秒的时间------------ | |
// 获取当前时间 | |
Instant instant = Instant.now(); | |
System.out.println(instant); | |
// 根据当前字符串解析时间 | |
Instant instant2 = Instant.parse("2021-04-01T15:26:43.281Z"); | |
System.out.println(instant2); | |
// -----LocalDate获得日期—----------- | |
LocalDate localDate = LocalDate.ofYearDay(2021, 146); | |
// 2021年的第146天是2021-05-26 | |
System.out.println(" 2021年的第146天是" + localDate); | |
// -----LocalTime获得当地时间—----------- | |
LocalTime localTime = LocalTime.now(); | |
System.out.println(localTime); | |
} | |
} |
6.正则表达式相关工具类
正则表达式可用于对字符串进行查找、分割、替换等操作,java提供了Pattern和Matcher两个类专门用于支持正则表达式。正则表达式可以应用与比如网站的密码格式检查等实际场景。
正则表达式语法参见:你是如何学会正则表达式的? - 老刘的回答 - 知乎 https://www.zhihu.com/question/48219401/answer/742444326 正则表达式在java中的使用示例代码如下。
// 将一个字符串编译成为Pattern对象,这是正则表达式在内存中的表示形式 | |
Pattern p = Pattern.compile("a*b"); | |
// 利用Pattern对象来创建Matcher对象 | |
Matcher m = p.matcher("aaaaab"); | |
//返回true | |
System.out.println(m.matches()); | |
//上面代码等价于该行代码 | |
System.out.println(Pattern.matches("a*b", "aaaaab")); |
使用正则表达式可以实现网络爬虫——提取网络的网址超链接,再进入超链接即可。下面通过一小段代码提取电话号码。
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
public class FindGroup { | |
public static void main(String[] args) { | |
String str = "我是wz,call我电话15173737429" + "我是wd," + "喝茶联系15627270324" | |
+ "我是zzsgd,水果配送热线13683675854"; | |
Matcher m = Pattern.compile("((15[1|6])|136)\\d{8}").matcher(str); | |
while (m.find()) { | |
System.out.println(m.group()); | |
} | |
} | |
} |
matcheres()方法需要字符串与正则表达式完全一致才返回true,lookingAt()方法只需要与Pattern作为开头即返回true。
7.国际化与格式化工具类 软件可能需要适应不同地区的本土市场,比如支付宝投入日本市场需要能够对日文进行本土化显示,因此要能够进行国际化与本土化。当然本土化不仅仅是语言方面的工作,还有比如日期格式、货币格式等。
Java格式化的思路是将程序中的标签、提示等通过资源文件来存放,不同国家、语言环境调用不同的资源文件。资源文件的存放格式是Key-value对,每个资源key不变,value随国家、语言环境而变。
java.util.Locale类可以获取Java所支持的国家和语言。
import java.util.Locale; | |
public class LocalList { | |
public static void main(String[] args) { | |
Locale[] localList = Locale.getAvailableLocales(); | |
// 遍历获取java支持的国家与语言,打印:阿拉伯联合酋长国=AE 阿拉伯文=ar... | |
for (int i = 0; i < localList.length; i++) { | |
System.out.println(localList[i].getDisplayCountry() + "=" | |
+ localList[i].getCountry() + " " | |
+ localList[i].getDisplayLanguage() + "=" | |
+ localList[i].getLanguage()); | |
} | |
} | |
} |
下面编写一个实现了国际化的程序。
import java.util.Locale; | |
import java.util.ResourceBundle; | |
public class Hello { | |
public static void main(String[] args) { | |
//获取系统默认的国家/语言环境 | |
Locale myLocale=Locale.getDefault(Locale.Category.FORMAT); | |
//根据指定的国家/语言环境加载资源文件 | |
ResourceBundle bundle=ResourceBundle.getBundle("mess", myLocale); | |
//打印该国家/语言环境文件资源中的hello | |
System.out.println(bundle.getString("hello")); | |
} | |
} |
这个程序将获取系统默认支持的语言,并且加载对应语言的资源文件。如果默认的语言环境是中文,则在配置文件mess_zh_CN.properties下查找hello具体的值。下面是配置文件的具体内容(看似乱码的部分是中文的“你好”所对应的ASCII码)。
hello=\u4F60\u597D!
如果遇到Canot find bundle for base name 异常,是因为没有把配置文件加入类路径中。