常用類
1.工具類的設計
2.單例模式
3.包裝類
4.BigDecimal類
5.String
6.StringBuilder和StringBuffer類
1.工具類的設計
把很多的通用的方法集合在一起裝到一個類中,這個類就叫做工具類
- 工具類起名:XxxUtil,XxxTool等 such as:ArrayUtil,JDBCUtils
- 工具類存在的包起名:util,utils,tool等
工具類如何設計?
兩種設計
- 公共靜態方法
使用類名呼叫工具方法
構造器需要私有化,靜態方法,防止工具類創建物件來呼叫靜態方法
- 單例模式
使用工具類的物件來呼叫工具方法,把工具類設計為單例模式(后講)
工具類設計
/**
* 這是一個陣列的工具類,包含了列印陣列,排序等方法
* e.g:
* int[] arr=...
* ArrayUtils.printArray(arr)
* @author kent
* @since 2021-01-22
* @see " "
* */
public class ArrayUtils {
private ArrayUtils(){} //私有構造方法,這樣就可以防止實體被創建
//定義static方法,用類名呼叫方法
public static void printArray(){
System.out.println("假裝是陣列的演算法");
}
public static void sort(){
System.out.println("排序");
}
}
2.單例模式
設計模式:一套可以被反復使用的代碼設計經驗總結
單例設計模式(singleton):最常用、最簡單的設計模式,單例的撰寫有N種寫法
單例模式保證整個應用中某一類有且只有一個實體(物件)
2.1懶漢式
-
私有化構造方法,事先創建好類的(static)一個物件
-
提供一個公共靜態方法(用于外界訪問),在該方法中進行判斷是否有物件,有回傳預先創建好的物件,沒有就new一個 ,
-
其他方法可以不用static修飾
-
呼叫
呼叫 類名.靜態方法名(相當于一個物件)
呼叫方法 類名.靜態方法名.方法
/*
*
* 懶漢模式 ( 存在執行緒安全 )
* */
public class AppSingleton {
//要求:保持該類在系統中只有一個實體
private static AppSingleton instance = null;
//1.私有化構造方法
private AppSingleton(){}
//2.對外界提供統一的訪問方式
public static AppSingleton getInstance(){
if (null == instance){
instance =new AppSingleton();
}
return instance;
}
//3.把工具方法附載到該單例上
public void printArray(){
System.out.println("陣列");
}
}
2.2餓漢式
- 私有化構造方法(防止外界通過構造器創建新的工具類物件)
- 提前創建好類的物件 new 類名()
- 提供一個公共靜態方法,用于回傳自身物件
/*
*
* 餓漢模式
* */
public class AppSingleton01 {
//要求:保持該類在系統中只有一個實體,提前創建(JVM加載AppSingleton01單例時已經被創建好了 )
private static AppSingleton01 instance = new AppSingleton01();
//1.私有化構造方法
private AppSingleton01(){}
//2.對外界提供統一的訪問方式
public static AppSingleton01 getInstance(){
return instance;
}
//3.把工具方法附載到該單例上
public void printArray(){
System.out.println("陣列");
}
}
3.包裝類
包裝類就是把基本資料型別封裝到一個類中,讓開發者更方便的操作基本型別
3.1八大基本型別包裝類
| byte | short | int | long | float | double | char | boolean |
|---|---|---|---|---|---|---|---|
| Byte | Short | Integer | Long | Float | Double | Character | Boolean |
常用轉換方法
public class Test01 {
public static void main(String[] args) {
//常用方法
//Integer -> int
Integer i1 = new Integer("100");
int a = i1.intValue();
//int ->Integer
//這種通過靜態方法回傳一個本類的物件 =>工廠方法
//new Integer(int/String) =>valueOf(int /String)
Integer i2 = Integer.valueOf(100);
//Integer -> String
Integer i3 = Integer.valueOf(300);
System.out.println(i3.toString());
//String ->Integer
Integer i4 = Integer.valueOf("500");
//String -> int
int i = Integer.parseInt("100");
//int ---> String
String s = Integer.toString(200);
/*
*總結:
* int <->String
* Integer 橋梁 =>
* int <-> Integer <-> String
*
* */
}
}
3.2裝箱和拆箱( Auto-Boxing和 Auto-UnBoxing)
- 裝箱:基本資料型別 --> 包裝類
- 拆箱:包裝類 --> 基本資料型別
//裝箱 把基本資料型別 ->對應的包裝類的程序
Integer i1 = Integer.valueOf(10);
Integer i2 = new Integer(10); //一般不用這個了,被淘汰
//拆箱 把包裝類物件 ->對于基本資料型別
int t1 = i1.intValue();
int t2 = i2.intValue();
- 自動裝箱:可把一個基本型別變數直接賦給對應的包裝類變數,
- 自動拆箱:可以把包裝類物件直接賦給對應的基本資料型別變數,
所謂自動就是jvm自動幫我們轉換了,呼叫了裝箱與拆箱的方法
1.自動裝箱
Integer i1 = 13;
jvm實際呼叫 Integer i1 = Integer.valueOf(13)
2.自動拆箱
int i2 = i1; // jvm實際呼叫 i1.intValue()
思考?
Object obj =10;
/*
* Integer i1 =10; //自動裝箱操作
* Object obj =i1; // 把子類物件賦值給父類變數 (父引子)
*/
3.3包裝類的快取設計
從性能上考慮,把常用資料存盤到快取區域,使用時不需要每次都創建新的物件,可以提高性能,
- Byte、Short、Integer、Long:快取范圍[-128,127];
- Character:快取范圍[0,127];
cache原理

個人理解:
Integer 中的 cache快取機制是將范圍為(-128,127)的值,提前與加載快取,
當我們去初始化這個范圍的值時(不用new),其實就已經存在了
.當超出這個范圍的值時,就是相當于真正開辟(new)了一塊空間.
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1 == i2);// false new相當于new出了兩塊空間,肯定是不一樣的
Integer i3 = Integer.valueOf(10);
Integer i4 = Integer.valueOf(10);
System.out.println(i3 == i4);// true
Integer i5 = 10; // 底層等價于
Integer i6 = 10;
System.out.println(i5 == i6);// true
4.BigDecimal類
float和double都不能表示精確的小數,使用BigDecimal類可以解決該問題
BigDecimal不能直接把賦值和運算操作,只能通過構造器傳遞資料,而且必須使用字串型別的構造器
RoundingMode 舍入模式
RoundingMode.HALF_UP四舍五入RoundingMode.HALF_Down四舍六入
例子:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Test01 {
public static void main(String[] args) {
System.out.println(0.01+0.09); //精度缺失
//一定要使用字串的構建方式
BigDecimal b1 = new BigDecimal("0.01");
BigDecimal b2 = new BigDecimal("0.09");
//相加
BigDecimal add = b1.add(b2);
System.out.println(add);
//相減
BigDecimal b9 = new BigDecimal("0.01");
BigDecimal b10 = new BigDecimal("0.09");
BigDecimal subtract = b9.subtract(b10);
System.out.println(subtract);
//精度控制
BigDecimal b3 = new BigDecimal("3.1418");
BigDecimal b4 = new BigDecimal("2");
//6.2836
//multiply 乘法操作,保留兩位小數(setScale 2),四舍五入(RoundingMode.HALF_UP)
b3.multiply(b4).setScale(2, RoundingMode.HALF_UP);
//除法
BigDecimal b5 = new BigDecimal("10");
BigDecimal b6 = new BigDecimal("3");
b5.divide(b6).setScale(2, RoundingMode.HALF_UP);//3.33
}
}
5.String
String型別表示字串,在記憶體中是以字符陣列的形式存在的
String是字符陣列的包裝類,并提供以只讀的形式操作其包裝的字符陣列的方法,
String str = "ABCD"; 等價于 char[] cs = new char[]{'A','B','C','D'};
String物件是不可變的,所以可以共享
- 常量池
1.通過字面量創建的字串分配在常量池中 字面量字串是常量,值在創建之后是不能更改的
- 堆
通過new操作創建的字串分配在堆中,當String物件創建完畢之后,該物件的內容是不能改變的,一旦內容改變就會變成了一個新的物件
1.直接賦予字面量
String str1 ="ABC"; //常量池
2.通過構造器創建
String str2 = new String("ABC"); //堆中
5.1String物件的空值
1.表示參考為空(null)
String str1 = null; //沒有初始化,沒有分配記憶體空間
2.內容為空字串
String str2 = "" //已經初始化,分配記憶體空間,不過沒有內容
5.2字串常用方法
- 字串比較
== 與equals的區別
- ==:比較兩個字串參考記憶體地址是否相同
- equals:比較兩個字串內容是否相等
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 ==str2); //true 同樣放在常量池,表示唯一參考同一地址
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1.equals(s2)); // equals 重寫后比較當前兩個物件的內容是否相等
System.out.println(str1 ==s1); // str1在常量池中,new出來的s1在堆中
//面試題
String str3 = "" + "abc";
String str4 = str1 + "";
System.out.println(str1==str3); //true ,常量詞中,允許字串拼接,"+拼接了"abc" 還是等于"abc"
System.out.println(str1 ==str4);//false , str1 + ""表示已經在堆中,地址不同
- 判斷一個字串非空
public static boolean ifNull(String str){
return str !=null && !"".equals(str.trim());
}
- 其他方法
public class Test04 {
public static void main(String[] args) {
String str = "小小羅nb";
String str1 = "小月";
String str2 = "小小羅NB";
//length():回傳字串的個數
System.out.println(str.length()); //4
//char(int index):回傳指定索引字符
System.out.println(str.charAt(0)); //小
//int indexOf(String str) 回傳指定子字串在此字串中第一次出現處的索引位置
System.out.println(str.indexOf("小")); //0
//boolean equals(Object anObject) 比較內容是否相同
System.out.println(str.equals(str1)); //false
//boolean equalsIgnoreCase(String anotherString) 忽略慮大小寫,比較內容是否相同
System.out.println(str.equalsIgnoreCase(str2)); //true
//String toUpperCase() 把當前字串轉換為大寫
System.out.println(str.toUpperCase()); //小小羅NB
//String toLowerCase() 把當前字串轉換為小寫
System.out.println(str2.toLowerCase()); //小小羅nb
//String substring(int beginIndex):從指定位置開始截取字串
System.out.println(str.substring(2)); //羅nb
//String substring(int beginIndex, int endIndex):截取指定區域的字串
System.out.println(str.substring(0, 2)); //小小
}
}
6.StringBuilder和StringBuffer類
StringBuffer和StringBuilder都表示可變的字串,可以對字串進行拼接
開發中建議使用StringBuilder(執行緒不安全,但是性能較高)
如果事先知道需要拼接多少個字符,可以在創建StringBuilder物件時指定字符陣列容量
StringBuilder re = new StringBuilder(17);
使用append方法在原字串后面進行拼接
re.append("小軒").append(520).append("小月");
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/252243.html
標籤:java
上一篇:通過爬蟲使用百度翻譯
