Java常用类|String类详解 + BigDecimal精准计算(含面试题)

一、String 类

  • String 类位于java.lang包,被final修饰,不能被继承,没有子类

1. 字符串两种创建方式

方式 1:字面量直接赋值
String s1 = "hello";

原理:优先去字符串常量池(串池)查找该字符串。

  • 存在:直接复用池中的对象
  • 不存在:在常量池创建对象
  • 对象产生数量:0‑1
方式 2:new String 创建对象
String s2 = new String("world");

原理:

  1. 一定会在堆内存创建字符串对象
  2. 再去常量池查找字面量,没有则在常量池新建对象,有则直接复用
  • 对象产生数量: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 的不变性

  1. 字符串字面量属于常量,一旦创建不可修改。字符串拼接等操作不会修改原字符串,会拷贝生成新字符串。
  2. String 不可变长,大量字符串拼接时效率低,会产生很多中间垃圾对象。

4. 可变字符串:StringBuffer & StringBuilder

都位于java.lang包,可变字符序列。

表格

版本线程安全执行效率
StringBufferJDK1.0线程安全效率较慢
StringBuilderJDK5.0线程不安全效率高

构造方法:

//无参构造
StringBuilder sb1 = new StringBuilder();
//根据字符串创建可变字符串
StringBuilder sb2 = new StringBuilder("java");

核心方法:

sb2.append(" 学习"); //字符串拼接
String res = sb2.toString(); //转为String类型

✨面试题:String、StringBuffer、StringBuilder 区别

  1. String:不可变字符串;拼接会产生大量新对象,效率低;线程安全。
  2. StringBuffer:可变字符串;线程安全;拼接效率较高。
  3. 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);

参数说明:

  1. 第一个参数:除数
  2. 第二个参数:保留小数位数
  3. 第三个参数:舍入模式,BigDecimal.ROUND_HALF_UP代表四舍五入。

注意:除法如果除不尽,不指定保留位数会直接抛出算术异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值