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包,可变字符序列。

表格

类 版本 线程安全 执行效率
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 区别

  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代表四舍五入。

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

相关推荐
这个昵称不容易35 分钟前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长1 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
羲云网络1 小时前
GPT Image 2.6 接入指南:Flare、Sunburst 怎么选,编辑失败如何排查
人工智能·python·aigc·图像生成·acedatacloud
张张123y1 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
文丑颜不良啊2 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼2 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
冻柠檬飞冰走茶4 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
文丑颜不良啊4 小时前
LeetCode2161~2180题目解析
java·leetcode
FRing034 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
橙橙笔记4 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能