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

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

相关推荐
随遇而安zx1 小时前
【多线程】---JMM 与 volatile 深度解析
java·多线程
YYYing.1 小时前
【C++进阶系列 (二)】关于线程堆栈的那些事——函数调用过程
开发语言·c++·函数·线程堆栈
邪修king1 小时前
Re:Linux系统篇(十九):进程篇(八): 进程等待详解:wait/waitpid,僵尸进程到底该如何回收
java·开发语言
大汉堡玩测试2 小时前
langfuse测试实战(一): 配置一个简单的项目快速落地
python·测试工具
啵啵啵鱼2 小时前
DS-顺序表
java·数据结构·笔记·后端·链表·obsidian
我爱写代码i2 小时前
SKAPP SK影视反编译详细教程+源码 含苹果端ipa
开发语言·javascript·ecmascript
TinyMemory2 小时前
Java 面向对象核心入门(七):方法重载 Overload,同一个方法名能干不一样的活
java·面向对象·overload·方法重载
一位正在转型AI全栈的前端工程师2 小时前
AI 全栈学习之旅 -Week 8:从单 Agent 到多 Agent 协作:LangGraph 实战与记忆持久化
前端·python