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

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

相关推荐
用户298698530148 分钟前
Python 实现 Word 与 TIFF 双向转换的方案
后端·python·api
weixin_3077791317 分钟前
C++代码实现MATLAB中的spectralcluster函数功能
开发语言·c++·算法·matlab
鸽鸽程序猿17 分钟前
【项目】【在线判题系统】c端:竞赛报名
c语言·开发语言
wangjialelele18 分钟前
一文梳理 Spring Cloud 核心组件:Eureka、Nacos、OpenFeign、LoadBalancer 与 Gateway
java·spring boot·spring·spring cloud·微服务·nacos
benchmark_cc20 分钟前
实时行情和分钟 K 线应该如何配合使用?从信号计算到交易决策的完整分析
大数据·python·数据分析·pandas·量化交易·股票数据·quantdash
用户62228840481921 分钟前
站在JDK的角度理解线程池:从execute 到 getTask 一篇讲透
java·面试
Wang's Blog21 分钟前
Java 项目实战: 交友项目 - 个人资料管理的需求分析与接口设计
java·开发语言·交友
LMT流氓兔24 分钟前
第四单元——第17课:让回答边生成、边显示
服务器·数据库·人工智能·python·oracle·langchain
北风toto24 分钟前
Linux 服务器如何判断 CPU 是否支持 x86-64-v2 指令集
java·linux·服务器
1024奇点25 分钟前
【仓颉语言入门 · 第二篇 第 8 课】
开发语言·数据库·ide·mysql·开源