一、String 类
- String 类位于
java.lang包,被final修饰,不能被继承,没有子类。
1. 字符串两种创建方式
方式 1:字面量直接赋值
String s1 = "hello";
原理:优先去**字符串常量池(串池)**查找该字符串。
- 存在:直接复用池中的对象
- 不存在:在常量池创建对象
- 对象产生数量:
0‑1个
方式 2:new String 创建对象
String s2 = new String("world");
原理:
- 一定会在堆内存创建字符串对象
- 再去常量池查找字面量,没有则在常量池新建对象,有则直接复用
- 对象产生数量:
1‑2个
intern () 方法:
String s2 = new String("world");
s2 = s2.intern();
调用intern(),让引用指向字符串常量池中的对象。
2. String 常用 API 方法
String 底层本质是
char[] value字符数组,下标范围:0 ~ 字符串长度‑1,下标越界抛出StringIndexOutOfBoundsException
表格
| 方法 | 说明 |
|---|---|
char charAt(int index) |
根据下标获取对应字符 |
int length() |
获取字符串长度,是方法:str.length ();数组是属性:arr.length |
boolean contains(String str) |
判断是否包含子串,返回 true/false |
char[] toCharArray() |
字符串转为 char 字符数组 |
boolean equals(String str) |
比较字符串内容是否相等,重写 Object 的 equals |
boolean equalsIgnoreCase(String str) |
忽略大小写比较字符串内容 |
String toUpperCase() |
全部转为大写 |
String toLowerCase() |
全部转为小写 |
int indexOf(String str) |
查找子串第一次出现的下标,找不到返回‑1 |
int indexOf(String str,int fromIndex) |
从指定下标位置向后查找 |
int lastIndexOf(String str) |
查找子串最后一次出现的下标,找不到返回‑1 |
boolean endsWith(String str) |
判断字符串是否以指定后缀结尾 |
String substring(int fromIndex,int toIndex) |
截取字符串,左包含,右不包含 fromIndex , toIndex‑1 |
String trim() |
去除字符串前后两端空格 |
String[] split(String str) |
按照分隔符拆分字符串,返回字符串数组 |
String replaceAll("旧内容","新内容") |
字符串替换 |
示例:字符串遍历
String str = "hello";
for(int i = 0 ; i < str.length() ; i++){
char c = str.charAt(i);
//操作字符c
}
trim 实际开发场景:去除前后空格,避免数字转换异常
String str = " 38 ";
int age = Integer.parseInt(str.trim());
3. String 的不变性
- 字符串字面量属于常量,一旦创建不可修改。字符串拼接等操作不会修改原字符串,会拷贝生成新字符串。
- String 不可变长,大量字符串拼接时效率低,会产生很多中间垃圾对象。
4. 可变字符串:StringBuffer & StringBuilder
都位于
java.lang包,可变字符序列。
表格
| 类 | 版本 | 线程安全 | 执行效率 |
|---|---|---|---|
| StringBuffer | JDK1.0 | 线程安全 | 效率较慢 |
| StringBuilder | JDK5.0 | 线程不安全 | 效率高 |
构造方法:
//无参构造
StringBuilder sb1 = new StringBuilder();
//根据字符串创建可变字符串
StringBuilder sb2 = new StringBuilder("java");
核心方法:
sb2.append(" 学习"); //字符串拼接
String res = sb2.toString(); //转为String类型
✨面试题:String、StringBuffer、StringBuilder 区别
- String:不可变字符串;拼接会产生大量新对象,效率低;线程安全。
- StringBuffer:可变字符串;线程安全;拼接效率较高。
- StringBuilder:可变字符串;线程不安全;拼接效率最高。
二、BigDecimal 高精度运算
包路径:
java.math作用:解决浮点型float/double计算精度丢失问题,用于金融、金额等对精度要求高的场景。
1. 构造方法
优先使用字符串构造,保证精度
BigDecimal bd = new BigDecimal("10.25");
2. 常用运算方法
BigDecimal bd1 = new BigDecimal("10.0");
BigDecimal bd2 = new BigDecimal("3.0");
BigDecimal r1 = bd1.add(bd2); //加法 bd1 + bd2
BigDecimal r2 = bd1.subtract(bd2); //减法 bd1 - bd2
BigDecimal r3 = bd1.multiply(bd2); //乘法 bd1 * bd2
//除法:参数(除数,保留小数位数,舍入模式)
BigDecimal r4 = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP);
参数说明:
- 第一个参数:除数
- 第二个参数:保留小数位数
- 第三个参数:舍入模式,
BigDecimal.ROUND_HALF_UP代表四舍五入。
注意:除法如果除不尽,不指定保留位数会直接抛出算术异常。