第九章---常用类解析 + 正则表达式*
一、Object类
Java中的每一个类都是以java.lang.Object为基础构建的,这表明Object是最底层父类
如果未显式指定继承性,则该类默认继承自 Object 类;
例如 String 和 StringBuilder 等类型均默认继承于 Object 类。
下面将介绍 Object 类中如 toStringO、equals() 等方法的具体实现。
toStringO
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
AI写代码
Object自身的toString方法会返回其核心数据类型名称后缀加上带有@符号的十六进制哈希码。
若希望改变对象的字符串表示方式,则应在子类中进行相应定义。
equals()
该方法用于验证两个对象是否相等。 调用它的语法如下:$Object1.equals(Object2);
public boolean equals(Object obj) {
return (this == obj);
}
AI写代码
该对象的equals方法比较的是自身对象this和传入对象obj的内存地址值 如果需要重新实现equals方法 则需要对父类中的equals方法进行重写
二、基本数据类型包装类
为什么要对基本数据类型进行包装?
Java作为一种程序设计语言采用面向对象的方式进行编程;基本数据类型无法直接作为对象使用。在向ArrayList、HashMap等容器传递数据时,int和double类型的数据无法直接传输到这些容器中,因为这些容器都存储的是Object类型的元素。因此,在传输时需要将这些数值转换为对应的包装类如Integer和Double等类型才能实现有效的数据存储与操作。byte对应的是Byte;short对应的是Short;int对应的是Integer;long对应的是Long;float对应的是Float;double对应的是Double;char对应的是Character;boolean对应的是Boolean。
三、StringBuilder与StringBuffer
两者均为Java中String类的专用缓冲字符串工具。相较于String类型而言,它们的主要特点是能够动态调整大小,并支持增删改查等基本操作。
StringBuilder与字符串String不同的是:
StringBuilder 是一种可变的字符序列,在 StringBuilder 的基础上提供的主要操作包括 append 和 insert 方法。这些方法可以被重新实现以支持接收各种类型的参数。
String类 在其创建对象之后就不能更改,可以共享。
String str1 = “abc”
String str2 = “abc”
String创建的常量存储在内存方法区的字符串常量池中,当String要创建新的常量时,先判断常量池中是否存在,若存在则直接将地址给新的常量,即str1 == str2。他俩共同指向一个地址,这就叫共享。
StringBuffer
StringBuffer和StringBuilder本质上功能几乎相同——它们均提供相似的功能接口和数据存储能力。然而,在设计理念上存在显著差异——StringBuffer具有线程安全特性(即在多线程环境下和单线 threading环境下均能保证数据操作的安全性)。在多线程环境下运行时不容易出现数据竞争导致的异常问题
StringBuilder是thread unsafe的 ——在多线程环境下运行时易导致错误,在单线程环境中运行则更加稳定和安全。适合在不需要高并发操作的场景中使用。
在代码实现层面,StringBuffer中的多数成员函数都被synchronized关键字修饰。
在单处理器场景下, String Builder相较于 String Buffer 在性能上略胜一筹, 这是因为无需进行锁相关判断。
在多处理器场景下, String Buffer相较于 String Builder 提供更高的安全性, 这是因为涉及锁操作。
四、BigInteger与BigDecimal
那么为何会出现整数类型的int、long与双精度浮点数double?为何又发展出了不可变精度的BigInteger和BigDecimal?在基本数据类型中,整数类型的最长者为长整数类型long(占用8字节/64位),其取值范围为-263至263-1。当我们在实际应用中处理的数据超出上述范围时,则需要使用不可变精度的BigInteger和BigDecimal——分别表示具有任意长度的精确整数值与高精度浮点数值。
BigInteger专门处理大整数运算
BigDecimal专门处理大小数运算
BigDecimal实际上基于BigInteger和一个用于存储小数位数的scale字段构成
五、 正则表达式
正则表达式是一种用于表示一组字符串特征的模式工具。其主要功能是帮助执行匹配、提取、替换和统计特定文本内容的操作,并被归类为一种文本处理技术。它通过结合特殊符号与普通字符来构建复杂且精确的搜索模式,在数据处理中发挥着关键作用

匹配开头和结尾
匹配开头用^ 匹配结尾用$
String regex01 = "^Demo\ w*\ .java$";
System.out.println("Demo01.java".matches(regex01));
AI写代码
匹配指定范围
用\d表示从零到九的所有整数,并排除零与一以及十进制范围[2-9]。
每个十六进制位可取值为零到九、小写字母a到f以及大写字母A到F。
String regex02 = "[2-9]\ d{5}";
System.out.println("345678".matches(regex02));
System.out.println("123456".matches(regex02));
String regex03 = "[0-9a-fA-F]{4}";
System.out.println("12ab".matches(regex03));
System.out.println("wc99".matches(regex03));
AI写代码
逻辑或匹配规则
在正则表达式中,并行运算符同样可用;例如' | '用于连接条件。通过并列符号' | '可将两个正则表达式组合起来。除了简单的连接外,在某些情况下还可以通过括号实现复杂模式的组合。若希望识别包含学习语言的术语如've learn java', 'learn php', 'learn go’等
`learn\sjava|learn\sphp|learn\sgo` => `learn\s(java|php|go)`
AI写代码
分组匹配
通常情况下,在应用正则表达式时
搜索字符串
String s = "the quick brown fox jumps over the lazy dog";
Pattern p2 = Pattern.compile("\ wo\ w");
Matcher m2 = p2.matcher(s);
while (m2.find()) {
//Matcher的start和end是从左到右每一个匹配到的字符串在原字符串中的起始位置
String sub = s.substring(m2.start(),m2.end());
System.out.println(sub);
}
AI写代码
替换字符串
String.replace String.replaceAll
String s1 = "the quick brown fox jumps over the lazy dog";
s1 = s1.replaceAll("\ s+"," ");
System.out.println(s1);
AI写代码
