一、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代表四舍五入。
注意:除法如果除不尽,不指定保留位数会直接抛出算术异常。