如何切換鼠標(如何切換鼠標模式)
738
2025-04-04
一、工具類
1.1、工具類的設計
把很多完成通用功能的方法抽取分類存放到類中,這些類就叫工具類
工具類如何設計(分兩種)
工具方法全部使用public static修飾**(常用)**
此時只需要使用工具類類名調用工具方法,且須把工具類的構造器私有化,防止創建工具類的對象來調用靜態方法
如果工具方法沒有使用static修飾
此時必須使用工具類的對象去調用工具類的方法,且必須把工具類設計成單例模式
1.1.1、公共靜態方法
需求一:使用公共靜態方法的方式,設計一個數組的工具類
ArraysUtils類
public void ArraysUtils{ //1. 先私有化構造器,防止被實例化對象 private ArraysUtils(){ } //2.寫工具方法 public static void sort(){ System.out.println("我是排序方法") } public static void print(){ System.out.println("我是打印方法方法") } }
TsstDemo類
public class TsstDemo{ public static void main(String[] args){ ArraysUtils.sort() } }
調用者必須通過工具類名.工具方法名稱完成調用
1.2、單例模式
設計模式(Design pattern)
是一套被反復使用的代碼設計經驗總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性,Java常用的設計模式有23種
單例設計模式(singleton)
最常用、最簡單的設計模式,單例模式分為兩種:懶漢式和餓漢式
目的
保證在整個應用中某一個類有且只有一個實例
步驟(以餓漢式為例)
私有化自身構造器,防止外界通過構造器實例化出對象
在該類中,自己先創建出一個對象
向外暴露一個公共的靜態方法用于返回自身的對象
public class SingletonUtil{ // 1. 先私有化構造器,防止被實例化對象 private SingletonUtil(){ } //2. 自己創建出一個對象 private static SingletonUtil instance = new SingletonUtil(); //3. 暴露給外界調用方法,返回創建好的對象 public static SingletonUtil getInstance(){ return instance; } public void sort() { System.out.println("排序操作"); } public void binarySearch() { System.out.println("二分查找操作"); } }
調用方法:
SingletonUtil.getInstance().sort();
二、包裝類
Java中的基本數據類型沒有方法和屬性,而包裝類就是為了讓這些擁有方法和屬性,實現對象化交互,數值型包裝類都繼承至Number,而字符型和布爾型繼承至Object
2.1、基本類型的包裝類
基本數據類型和包裝類對應關系:
2.1.1、Integer
Integer內部封裝了int類型的基本數據類型value,并提供了方法對int值進行操作和String之間進行互換(開發中常用)
Integer i = new Integer(); int intValue = i.intValue();
int i = 20; Integer integer = Integer.valueOf(i);
int i = 30; Stirng value = Integer.valueOf(i);
Integer i = Integer.valueOf("3");
int i = Integer.parseInt("134");
String str = Integer.toString(134);
2.2、拆箱和裝箱
2.2.1、裝箱
把基本數據類型轉為對于的包裝類對象
Integer num2 = Integer.valueOf(17);
2.2.2、拆箱
把包裝類對象轉化為對應的基本數據類型
int val = num3.intValue();
2.2.3、自動拆箱和裝箱
從JDK5之后提供了自動裝箱和自動拆箱,我們再也不用頻繁的去手動拆箱和裝箱了
Integer num4 = 17; //裝箱操作 int val2 = num4; //拆箱操作
2.3、緩存設計
從性能上考慮,把常用數據存儲到緩存區域,使用時不需要每次都創建新的對象,可以提高性能
常用包裝類型的緩存范圍
Byte、Short、Integer、Long:緩存范圍[-128,127]
Character:緩存范圍[0,127]
//第一種 Integer i1 = new Integer(123); Integer i2 = new Integer(123); System.out.println(i1 == i2);// false,因為都在堆中new了一個新的對象 //第二種 Integer i3 = Integer.valueOf(123); Integer i4 = Integer.valueOf(123); System.out.println(i3 == i4);// true,由于在[-128,127]之間,所以直接在緩存中取,都是同一個對象 //第三種 Integer i5 = 123; // 底層等價于第二種 Integer i6 = 123; System.out.println(i5 == i6);// true
注意
如果數字都不在緩存范圍內,那么返回的結果都是false
如果要比較兩個對象的數據是否相等,必須使用equals方法來判斷,==比較的是兩個數據的內存空間是否是同一塊,equals比較的是存儲數據是否相等
int類型的默認值為0,Integer的默認值為null,在開發中建議使用Integer,因為Integer既可以表示0,也可以表示null
2.4、BigDecimal
float和double都不能表示精確的小數,使用BigDecimal類可以解決該問題,BigDecimal用于處理金錢或任意精度要求高的數據
2.4.1、基本運算
BigDecimal不能直接把賦值和運算操作,只能通過構造器傳遞數據,而且必須使用字符串類型的構造器
System.out.println(0.09 + 0.01);
我們運行這段代碼,結果是
他會生成一個無限接近0.1的值,說明這個并不適合我們運算
BigDecimal num1 = new BigDecimal(0.09); BigDecimal num2 = new BigDecimal(0.01); System.out.println(num1.add(num2));
如果我們不用字符串類型的構造器的話,BigDecimal無法開啟高精度模式
BigDecimal num3 = new BigDecimal("0.09"); BigDecimal num4 = new BigDecimal("0.01"); System.out.println(num3.add(num4));
終于運行處了正確結果,需要注意一定要使用字符串的構造方法,才可以開啟高精度計算模式
2.4.2、精度控制
我們在運算的時候需要進行精度控制操作
/* 1. 保留位數和精度控制 RoundingMode 舍入模式 RoundingMode.HALF_UP 四舍五入 */ BigDecimal num5 = new BigDecimal("0.987"); BigDecimal bigDecimal = num5.setScale(2, RoundingMode.HALF_UP); System.out.println(bigDecimal);
2.4.3、無理數問題
/* java.lang.ArithmeticException Non-terminating decimal expansion; no exact representable decimal result. 報錯原因:除不盡(3.333333333...333...) */ BigDecimal num1 = new BigDecimal("10.0"); BigDecimal num2 = new BigDecimal("3.0"); BigDecimal r2 = num1.divide(num2,3,RoundingMode.HALF_UP); System.out.println(r2);
三、字符串
字符串(字符序列),表示把多個字符按照一定得順序排列起來
字符串按照內容是否可變可以分為兩類:
不可變字符串-String:當String對象創建完畢之后,該對象的內容是不可以改變的,一旦內容改變就變成了一個新的對象
可變字符串-StringBuilder/StringBuffer:是可變的,當創建完對象之后,對象的內容可以發送改變,當內容發生改變的時候,對象保持不變
3.1、String
String 類型表示字符串,Java 程序中的所有字符串字面值(如 “ABC” )都作為此類的實例實現。String的底層是以字符數組的形式存在,String是字符數組的包裝類,并提供以只讀的形式操作其包裝的字符數組的方法
3.1.1、String內存圖
通過字面量創建的內存圖 String str1 = “ABC”
通過字面量創建的字符串分配在常量池中,所以字面量字符串是常量;它們的值在創建之后不能更
改,因為 String 對象是不可變的,所以可以共享
通過實例化對象創建的內存圖
String類,表示不可變的字符串,當String對象創建完畢之后,該對象的內容是不能改變的,一旦
內容改變就變成了一個新的對象
String str = "hello"; str = str + "word";
3.1.2、String對象的空值問題
//表示引用為空(null) String str1 = null; //沒有初始化,沒有分配內存空間. //內容為空字符串 String str2 = ""; // 已經初始化,分配內存空間,不過沒有內容
3.1.3、字符串常用方法
== 比較是否是同一個引用,即是否是同一個對象
== 比較的是值是否相等
contains
// 字符串查找 String str3 = "hello world"; // 檢測是否包含 System.out.println(str3.contains("w"));
Java Api文檔對contains方法的描述:
譯文:當且僅當此字符串包含指定的char值序列時,才返回true
endsWith/startsWith
// 判斷是否以xx為后綴/前綴 String str4 = "icon20191101.png"; System.out.println(str4.endsWith(".png")); System.out.println(str4.startsWith("icon"));
Java Api文檔對startsWith/endsWith方法的描述:
譯文:測試此字符串是否以指定的前綴開頭
測試從指定索引開始的此字符串的子串是否以指定的前綴開頭
譯文:測試此字符串是否以指定的后綴結尾
indexOf
String str5 = "helloworld123"; System.out.println(str5.indexOf('o')); System.out.println(str5.indexOf('o', 5));
Java Api文檔對indexOf方法的描述:
譯文:返回指定字符第一次出現的字符串中的索引
返回指定字符第一次出現的字符串中的索引,從指定索引處開始搜索
replace
String str1 = "helloworld123"; // 替換給定字符 String newStr1 = str1.replace("h", "H"); System.out.println(newStr1); // 替換給定字符串 // String newStr2 = str1.replace("hello", "HELLO"); String newStr2 = str1.replace("hello", ""); System.out.println(newStr2);
譯文:返回一個字符串,該字符串是用newChar替換此字符串中所有出現的oldChar的結果。
譯文:用給定的替換項替換該字符串中與給定的正則表達式匹配的每個子字符串
// 字符串分隔 String str1 = "186-2001-1234"; String[] strArr = str1.split("-"); System.out.println(Arrays.toString(strArr)); //如果有多個分隔符可以放在[]中,多個分隔符用空格隔開 String str = "a;b:c;d:w"; System.out.println(Arrays.toString(str.split("[;:]")));
譯文:圍繞給定正則表達式的匹配項拆分此字符串
substring
String str1 = "helloworld"; System.out.println(str1.substring(5)); // 有兩個參數,一個是開始的索引,一個是結束的索引,如果結束的索引不寫,默認到最后一位,求字串的原則是含頭不含尾 System.out.println(str1.substring(0,5));
譯文:返回一個字符串,該字符串是該字符串的子字符串
// 獲取自定位置的字符 String str1 = "hello"; char c = str1.charAt(0); System.out.println(c);
譯文:返回指定索引處的字符值
// 字符串連接 String str2 = "abc"; String str3 = "123"; System.out.println(str2.concat(str3));
譯文:將指定的字符串連接到該字符串的末尾
String str4 = "123"; System.out.println(str4.length());
String str4 = "123"; System.out.println(str4.length());
// 大小寫轉換 String str5 = "Hello"; System.out.println(str5.toUpperCase());//轉大寫 System.out.println(str5.toLowerCase());//轉小寫
String str = " hello "; System.out.println(str.length()); String trim = str.trim(); System.out.println(trim.length());
返回一個值為該字符串的字符串,其中刪除了所有前導和尾隨空格
public static boolean hasLength(String str) { return str != null && !"".equals(str.trim()); }
3.2、StringBuilder/StringBuffer
在程序開發過程中,我們常常碰到字符串連接的情況,方便和直接的方式是通過"+"符號來實現,但是這種方式達到目的的效率比較低,且每執行一次都會創建一個String對象,即耗時,又浪費空間。使StringBuilder類就可以避免這種問題的發生,在使用StringBuilder過程中需創建一個StringBuilder對象
StringBuffer和StringBuilder都表示可變的字符串,功能方法相同的,區別是:
StringBuffer:StringBuffer中的方法都使用了synchronized修飾,保證線程安全但性能較低
StringBuilder:StringBuilder中的方法沒有使用synchronized修飾,線程不安全但但是性能較高
開發中建議使用StringBuilder
StringBuilder stringBuilder = new StringBuilder("123");//進行初始化
3.2.1、字符串拼接
語法格式
append(String str)/append(Char c)
示范
StringBuilder stringBuilder = new StringBuilder("123"); System.out.println(stringBuilder.append("abc").append("123"));
優勢
可以鏈式調用,在后面無限進行拼接
3.2.2、替換
語法格式
setCharAt(int i, char c):將第 i 個代碼單元設置為 字符c(可以理解為替換)
示范
StringBuilder sb = new StringBuilder("123"); sb.setCharAt(1,'A'); System.out.println(sb);
注意
第一個參數是需要替換的位置,第二個參數是需要替換的字符,僅僅只是char類型
3.2.3、插入
語法格式
insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符(串)
示范
StringBuilder sb = new StringBuilder("123"); sb.insert(1,"1234"); System.out.println(sb);
注意
在添加的方法中,可以添加字符也可以添加字符串
3.2.4、刪除
語法格式
delete(int startIndex,int endIndex):刪除起始位置(含)到結尾位置(不含)之間的字符串
示范
System.out.println(sb.delete(3, 6));
注意
delete方法也是含頭不含尾
Java 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。