黑马Java基础笔记-11
测试类,工具类,JavaBean类
Javabean类
用来描述一类事物的类。比如,Student,Teacher,Dog,Cat等
测试类
用来检查其他类是否书写正确,带有main方法的类,是程序的入口
工具类
不是用来描述一类事物的,而是帮我们做一些事情的类。
- 类名见名知意
ArrUtil
体现数组处理工具类的定位 - 私有化构造方法 防止外部通过
new
创建实例(工具类无需实例化) - 方法定义为静态 通过
类名.方法名()
直接调用
/**
* 数组操作工具类(符合设计准则)
*/
public class ArrUtil {// 禁止实例化设计private ArrUtil() {} public static int getMax(int[] arr) {}public static int getMin(int[] arr) {}public static int getSum(int[] arr) {}public static int getAvg(int[] arr) {}
}
将一维数组转化为二维数组
for (int i = 0; i < arr.length; i++) {// 核心逻辑:用 / 和 % 计算行列位置int row = i / cols; // 确定行索引int col = i % cols; // 确定列索引result[row][col] = arr[i];}return result;
常用的api
顶级父类Object类常用方法
toString()
对象的 class 名称 + @ + hashCode 的十六进制字符串。
源码
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
eg
java.lang.Object@6d06d69c
equals()
该方法用于比较两个对象,如果这两个对象引用指向的是同一个对象,那么返回 true,否则返回 false。一般 equals 和 == 是不一样的,但是在 Object 中两者是一样的。子类一般都要重写这个方法。
源码
public boolean equals(Object obj) { return (this == obj);}
clone()
浅克隆(object默认)
不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来
深克隆(重写方法或使用第三方工具)
字符串复用(因为在串池里面)
基本数据类型拷贝过来
引用数据类型会重新创建新的
objects
是一个对象工具类
equals()
boolean result =Objects.equals(s1,s2);
细节:
1.方法的底层会判断s1是否为null,如果为null,直接返回false
2.如果s1不为null,那么就利用s1再次调用equals方法
3.此时s1是Student类型,所以最终还是会调用student中的equals方法。
BigInteger
-
如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取.
public static Biglnteger valueOf(long val)// 示例代码: BigInteger bd4 = BigInteger.valueOf(100L);
细节:
- 1.能表示范围比较小,只能在long的取值范围之内,如果超出long的范围就不行了。
- 2.在内部对常用的数字:-16~16进行了优化。 // 提前把-16 ~ 16 先创建好BigInteger的对象,如果多次获取不会重新创建新的。
-
如果BigInteger表示的超出long的范围,可以用构造方法获取
public Biglnteger(String val) //指定字符串构造 // 示例代码: BigInteger bd2 = new BigInteger("100");
-
对象一旦创建,BigInteger内部记录的值不能发生改变。
-
只要进行计算都会产生一个新的BigInteger对象
其他构造方法
Biglnteger(String val, int radix)//指定 进制字符串构造
Biglnteger(int numBits, Random rnd)//生成随机大整数
- max和min方法不会创建新对象,而是会返回大的或小的对象
底层逻辑
有一个intsignum
用来存储符号(-1负数,0表示0,1正数)
有一个int[]mag
用来将存储数值的绝对值,按大端顺序(高位在前)分割为 32 位无符号整数块。
- 去前导零:确保
mag
数组没有前导零块(如0x00000001
→[1]
)。 - 大端顺序:高位块在前,低位块在后。
- 零的特殊处理:若数值为 0,
mag
为空数组。 - 按照进制划分固定的字符串长度(10进制9位划分)
eg:
Long.MIN_VALUE(-9223372036854775808)
signum: -1
mag: {0x80000000, 0x00000000} (绝对值 0x8000000000000000 → 分解为 0x80000000(高 32 位)和 0x00000000(低 32 位))
BigDecima
可以解决精度丢失
构造方法
-
通过 double 类型创建(不建议)
存在精度丢失风险BigDecimal bd1 = new BigDecimal(0.01); BigDecimal bd2 = new BigDecimal(0.09);
-
通过 String 类型创建(推荐方式)
可保证精度准确BigDecimal bd3 = new BigDecimal("0.01"); BigDecimal bd4 = new BigDecimal("0.09");【使用细节】
-
数值范围选择策略:
数值较小(在 double 范围内):建议使用静态方法(如 valueOf(),这个内部转化为字符串)
数值超大(超出 double 范围):必须使用构造方法 -
特殊数值优化:
当传递 0-10 的整数(含边界)时,方法直接返回预创建对象,不会新建实例(10.0还是会创建新的,但是10不会)
底层存储方式
负号也会被存为一个ascII表字符(45)
和BigInteger一致上限为int数组的最大存储长度
&&是且,单个&是待匹配的符号,?号表示0次或一次
[]
匹配一次 {}
匹配范围()
分组(将某一段正则表达式变为一组)
(?i)
忽略大小写
String regex = "((?i)Java)(?=8|11|17)";
?
理解为前面的数据Java
=
表示在Java后面要跟随的数据,但是在获取的时候,只获取前半部分(?)
:
表示在Java后面要跟随的数据,但是在获取的时候加上后面的匹配的内容(在这里和不写差不多)
捕获分组
()
它会把括号里面的正则表达式匹配到的内容保存到该分组(使用group(非0其他货获取))里面,也就是说,它捕获的就是分组里面的正则表达式匹配到的内容
\\组号
表示将第几组(看左括号)的分组的内容拿过来再用一次,匹配的内容要与之前的一致(a111a,abc333abc…),在java中使用是使用$组号
(.)\\1+/*需求:
将字符串:我要学学编编编编程程程程程程
替换为:我要学编程*/
Stringstr="我要学学编编编编程程程程程程";
//需求:把重复的内容替换为单个的
//(.)表示把重复内容的第一个字符看做一组
//\\1表示第一字符再次出现
//$1表示把正则表达式中第一组的内容,再拿出来用
String result = str.replaceAll(regex:"(.)\\1+", replacement:"$1");
System.out.println(result);//我要学编程
非捕获分组
不占用组号
(?:正则表达式) # 仅分组不捕获 group(0)可以获取到?:后面的内容,但是group(非0其他)就不行,因为不捕获分组
(?=正则表达式) # 正向肯定预查(匹配前置条件) group(0)获取不到后续
(?!正则表达式) # 正向否定预查(排除前置条件) group(0)获取不到后续
语法 | 作用方向 | 是否捕获内容(是否能使用group(非0其他)获取到) | 是否消耗字符(不移动匹配指针) | 典型场景 |
---|---|---|---|---|
(?:) | 分组 | 否 | 是(匹配) | 逻辑分组,避免组号干扰 |
(?=) | 向后检查 | 否 | 否 | 验证后续内容(如价格单位) |
(?!) | 向后检查 | 否 | 否 | 排除后续内容(如敏感词) |
-
非捕获分组用于逻辑分组或性能优化(因为不需要保存匹配的结果),不保存匹配结果。
-
正向预查(
(?=)
/(?!)
)是零宽断言,仅验证条件,不占用匹配结果(起到约束后续匹配内容的作用)。a(?=b)c
为何无法匹配 “abc”?假设输入字符串为
"abc"
,正则表达式为a(?=b)c
:- 匹配
a
:
- 正则引擎从位置0开始匹配字符
a
,成功后将指针移动到位置1(b
)。
- 执行零宽断言
(?=b)
:
- 检查当前位置(位置1)的后续字符是否为
b
。此时字符b
确实在位置1,断言通过。 - 关键点:零宽断言不会移动匹配指针,指针仍停留在位置1(即
b
)
- 尝试匹配
c
:
- 引擎从位置1开始匹配字符
c
,但位置1的字符是b
,与c
不匹配,导致整体匹配失败
- 匹配
爬虫
贪婪爬取
默认形式,最大长度优先
非贪婪爬取
加上?
,首次匹配成功即停止
ab+:
贪梦爬取:abbbbbbbbbbbb
ab+?:
非贪婪爬取:ab