|String類(lèi)詳解 + BigDecimal精準(zhǔn)計(jì)算(含面試題))
一、String 類(lèi)String 類(lèi)位于java.lang包被final修飾不能被繼承沒(méi)有子類(lèi)。1. 字符串兩種創(chuàng)建方式方式 1字面量直接賦值String s1 hello;原理優(yōu)先去字符串常量池串池查找該字符串。存在直接復(fù)用池中的對(duì)象不存在在常量池創(chuàng)建對(duì)象對(duì)象產(chǎn)生數(shù)量0?1個(gè)方式 2new String 創(chuàng)建對(duì)象String s2 new String(world);原理一定會(huì)在堆內(nèi)存創(chuàng)建字符串對(duì)象再去常量池查找字面量沒(méi)有則在常量池新建對(duì)象有則直接復(fù)用對(duì)象產(chǎn)生數(shù)量1?2個(gè)intern () 方法String s2 new String(world); s2 s2.intern();調(diào)用intern()讓引用指向字符串常量池中的對(duì)象。2. String 常用 API 方法String 底層本質(zhì)是char[] value字符數(shù)組下標(biāo)范圍0 ~ 字符串長(zhǎng)度?1下標(biāo)越界拋出StringIndexOutOfBoundsException表格方法說(shuō)明char charAt(int index)根據(jù)下標(biāo)獲取對(duì)應(yīng)字符int length()獲取字符串長(zhǎng)度是方法str.length ()數(shù)組是屬性arr.lengthboolean contains(String str)判斷是否包含子串返回 true/falsechar[] toCharArray()字符串轉(zhuǎn)為 char 字符數(shù)組boolean equals(String str)比較字符串內(nèi)容是否相等重寫(xiě) Object 的 equalsboolean equalsIgnoreCase(String str)忽略大小寫(xiě)比較字符串內(nèi)容String toUpperCase()全部轉(zhuǎn)為大寫(xiě)String toLowerCase()全部轉(zhuǎn)為小寫(xiě)int indexOf(String str)查找子串第一次出現(xiàn)的下標(biāo)找不到返回?1int indexOf(String str,int fromIndex)從指定下標(biāo)位置向后查找int lastIndexOf(String str)查找子串最后一次出現(xiàn)的下標(biāo)找不到返回?1boolean endsWith(String str)判斷字符串是否以指定后綴結(jié)尾String substring(int fromIndex,int toIndex)截取字符串左包含右不包含[fromIndex , toIndex?1]String trim()去除字符串前后兩端空格String[] split(String str)按照分隔符拆分字符串返回字符串?dāng)?shù)組String replaceAll(舊內(nèi)容,新內(nèi)容)字符串替換示例字符串遍歷String str hello; for(int i 0 ; i str.length() ; i){ char c str.charAt(i); //操作字符c }trim 實(shí)際開(kāi)發(fā)場(chǎng)景去除前后空格避免數(shù)字轉(zhuǎn)換異常String str 38 ; int age Integer.parseInt(str.trim());3. String 的不變性字符串字面量屬于常量一旦創(chuàng)建不可修改。字符串拼接等操作不會(huì)修改原字符串會(huì)拷貝生成新字符串。String 不可變長(zhǎng)大量字符串拼接時(shí)效率低會(huì)產(chǎn)生很多中間垃圾對(duì)象。4. 可變字符串StringBuffer StringBuilder都位于java.lang包可變字符序列。表格類(lèi)版本線程安全執(zhí)行效率StringBufferJDK1.0線程安全效率較慢StringBuilderJDK5.0線程不安全效率高構(gòu)造方法//無(wú)參構(gòu)造 StringBuilder sb1 new StringBuilder(); //根據(jù)字符串創(chuàng)建可變字符串 StringBuilder sb2 new StringBuilder(java);核心方法sb2.append( 學(xué)習(xí)); //字符串拼接 String res sb2.toString(); //轉(zhuǎn)為String類(lèi)型?面試題String、StringBuffer、StringBuilder 區(qū)別String不可變字符串拼接會(huì)產(chǎn)生大量新對(duì)象效率低線程安全。StringBuffer可變字符串線程安全拼接效率較高。StringBuilder可變字符串線程不安全拼接效率最高。二、BigDecimal 高精度運(yùn)算包路徑j(luò)ava.math作用解決浮點(diǎn)型float/double計(jì)算精度丟失問(wèn)題用于金融、金額等對(duì)精度要求高的場(chǎng)景。1. 構(gòu)造方法優(yōu)先使用字符串構(gòu)造保證精度BigDecimal bd new BigDecimal(10.25);2. 常用運(yùn)算方法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 //除法參數(shù)(除數(shù),保留小數(shù)位數(shù),舍入模式) BigDecimal r4 bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP);參數(shù)說(shuō)明第一個(gè)參數(shù)除數(shù)第二個(gè)參數(shù)保留小數(shù)位數(shù)第三個(gè)參數(shù)舍入模式BigDecimal.ROUND_HALF_UP代表四舍五入。注意除法如果除不盡不指定保留位數(shù)會(huì)直接拋出算術(shù)異常。