一、BigDecimal 精准浮点运算1. 问题double/float 二进制存储存在精度丢失double a1.06,b1.01; System.out.println(ab); //2.07000000000000032. 核心说明包java.math.BigDecimal推荐构造new BigDecimal(数值)避免 double 入参二次失真3. 常用运算方法add()加、subtract()减、multiply()乘、divide()除toString()转字符串、doubleValue()转回 double//题目需求 //商品单价 0.15 元基础购买数量 1000 件 //基础总价 单价 × 数量multiply 乘法 //额外运费 25.60 元应付总额 基础总价 运费add 加法 //店铺优惠减免 18.35 元实付金额 应付总额 − 优惠subtract 减法 //将实付金额平分给 7 个人人均费用保留 2 位小数、四舍五入divide 除法 HALF_UP //把人均费用转为字符串输出toString () //将人均费用转为 double 类型打印doubleValue () //要求所有数值必须用字符串构造 BigDecimal禁止直接传入 double。static void produce(){ BigDecimal price new BigDecimal(0.15);//单价 BigDecimal count new BigDecimal(1000);//基础购买数量 BigDecimal total price.multiply(count);//基础总价 System.out.println(基础总价total); BigDecimal freight new BigDecimal(25.6);//额外运费 BigDecimal Accounts_Payabletotal.add(freight);//应付款 System.out.println(应付款Accounts_Payable); BigDecimal Discount new BigDecimal(18.35);//优惠 BigDecimal Actual_payment Accounts_Payable.subtract(Discount);//实付款 System.out.println(实付款Actual_payment); BigDecimal people new BigDecimal(7); //考点divide必须指定保留位数与舍入模式否则除不尽抛算术异常。 BigDecimal resultActual_payment.divide(people,2, RoundingMode.HALF_DOWN);//人均 System.out.println(人均result); String strresult.toString(); System.out.println(字符串str); double d1result.doubleValue(); System.out.println(数值d1); }运行结果 基础总价150.00 应付款175.60 实付款157.25 人均22.46 字符串22.46 数值22.46二、包装类1. 基本类型与包装类对应byte→Byte、short→Short、int→Integer、long→Long 、float→Float、double→Double、boolean→Boolean、char→Character2. 核心 APICharacter 字符工具isDigit()判断数字、isLetter()判断字母、toLowerCase()/toUpperCase()大小写转换Integer 进制转换toBinaryString()二进制、toOctalString()八进制、toHexString()十六进制字符串转数值抛NumberFormatExceptionInteger.parseInt(123)、Float.parseFloat(3.14)3. 装箱 拆箱手动Integer.valueOf(10)装箱intValue()拆箱自动Integer a5; int ba;坑包装类可为 nullnull 自增直接空指针4. Integer 缓存池缓存范围-128 ~ 127范围内直接复用常量对象为 true超出范围 /new Integer()堆新建对象为 false练习 Integer 缓存池对比题 Integer a 127; Integer b Integer.valueOf(127); Integer c new Integer(127); Integer d 125; Integer e new Integer(125); System.out.println(a b); System.out.println(a c); System.out.println(d e); Q三行输出结果分别是什么底层原理 A输出依次true、false、false 原理 Integer 缓存池范围 -128~127自动装箱 /valueOf() 复用缓存对象 new Integer() 无论数值多少都会在堆新建独立对象 比较对象内存地址 a、b 都取自缓存地址相同 → true a 是缓存对象c 是 new 新对象地址不同 → false d 取自缓存e 是 new 新对象地址不同 → false5. 数值与包装类比较int Integer包装类自动拆箱比数值练习 1null 包装类参与运算Integer num null; int res num 10;Q运行报什么异常原因 A抛出NullPointerException空指针异常。 原因num 10会自动拆箱底层执行num.intValue()num 为 null没有对象可以调用方法触发空指针。练习 2Long 赋值字面量Long l1 100L; Long l2 100;QLong l2 100;能否编译通过为什么 A不能编译。 原因100 是 int 类型字面量自动装箱仅支持long转 Longint 无法直接装箱为 Long必须使用长整型字面量100L。练习 3Double 赋值字面量Double db1 200d; Double db2 200;QDouble db2 200;能否编译通过为什么 A不能编译。 原因200 是 int 整数Double 对应基础类型是 doubleint 不能直接自动装箱成 Double需写成200.0/200d。三、String 字符串1. 底层结构public final class Stringfinal 修饰不可继承里面所有的方法也不能被重写JDK9 底层private final byte[] valueJDK8 及以前char[] value是私有,且用 final 修饰value 数组 final无对外修改方法字符串不可变用 final修饰一个引用类型的时候,是个引用不能变,不是这个引用指向的容不能变,但String类本身没有提供任何能修改这个 byte [] value 内容的方法地址不变值可以变2. 两种创建方式字面量String s abc先查字符串常量池有则复用无则池中创建newString s new String(abc)常量池先存 abc再在堆创建 String 对象引用指向堆3. 不可变设计优点实现常量池减少对象创建节省内存线程安全多线程共享无需同步锁缓存 hash 值高效用作 Map 的 key内容不可篡改保证数据使用安全一处修改不影响其他引用。四、字符串比较规则比较地址equals()String 重写逐字符对比内容经典易错场景Integer a 128; Integer b 128; System.out.println(a b); // false System.out.println(a.equals(b)); // true128 超出 Integer 缓存池范围自动装箱会 new 两个不同对象地址不同为 false但数值相等equals 为 true。包装类用比地址地址相同才 true不能判断数值包装类比较数字统一使用.equals()常量拼接编译优化String s1ab; //编译为ab走常量池 String s2a1; String s3atrue; //均优化为常量变量拼接无优化String ahello,bworld; String cab; //底层new StringBuilder拼接返回new String不在常量池final 常量参与拼接 常量优化final String aa; String bab; //编译优化常量池对象五、内存对象数量速记String axyz常量池 1 对象new String(xyz)常量池 1 堆 1共 2 个对象new String(a)new String(b)常量池a、b堆2 个 String、1 个 StringBuilder、toString 新建 String合计 6 个对象六、字符串的常用方法全部返回新串原串不变长度 / 索引length()获取长度数组 length 属性字符串 length () 方法charAt(int index)根据下标取字符charAt()根据索引求字符indexOf(str)正向查找无返回 - 1lastIndexOf()反向查找判断类contains()是否包含子串startsWith()/endsWith()首尾匹配isEmpty()判断空串 isBlank()(JDK11) 判断全空白equals()区分大小写equalsIgnoreCase()忽略大小写转换toCharArray()转字符数组getBytes()转字节数组可指定编码 UTF-8/GBKtoUpperCase()/toLowerCase()大小写trim()去除首尾空格截取替换分割substring(start)、substring(start,end)含头不含尾replace(原,新)普通替换replaceAll(正则,新)支持正则split(正则)按规则分割为字符串数组特殊符号 |. 需转义\\|类型互转数组转 Stringnew String(char[])/String.valueOf(数组)基本类型转 String变量/String.valueOf(数值)七、StringBuffer StringBuilder可变字符串缓冲区1. 区别StringBuffer方法synchronized加锁线程安全效率低StringBuilder无锁线程不安全拼接性能高单线程优先2. 通用方法append()追加、reverse()翻转、delete(start,end)区间删除、insert()插入、replace()替换注意未重写 equals ()两个内容相同对象、equals()均为 false性能对比String 对象不可变循环每次拼接都会生成新字符串对象频繁字符拷贝、产生大量垃圾GC 开销大 StringBuilder/StringBuffer 对象可变内部使用可变字符数组缓冲区复用内存仅在最后生成一次字符串减少对象创建与字符复制性能大幅提升。八、字符串暴力匹配算法功能查找子串起始下标无匹配返回 - 1static int getIndex(String main,String sub){ int i0,j0; while(imain.length()jsub.length()){ if(main.charAt(i)sub.charAt(j)){i;j;} else {ii-j1;j0;} } return jsub.length()?i-j:-1; }