Java的基本使用之核心類
1、StringBuilder類
在 Java 中,我們可以使用 + 來拼接字符串,類似于下面的代碼:
String s = ""; for (int i = 0; i < 1000; i++) { s = s + "," + i; }
但是在每次循環中都會創建新的字符串對象(因為字符串是不可變的),然后扔掉舊的字符串。這樣,絕大部分字符串都是臨時對象,不但浪費內存,還會影響GC效率。
為了能高效拼接字符串,Java標準庫提供了StringBuilder,它是一個可變對象,可以預分配緩沖區,這樣,往StringBuilder中新增字符時,不會創建新的臨時對象:
StringBuilder sb = new StringBuilder(1024); for (int i = 0; i < 1000; i++) { //StringBuilder可以進行鏈式操作 sb.append(',').append(i); } String s = sb.toString();
對于一般的字符串操作,我們可以不必將其改寫為 StringBuilder,在對字符串進行頻繁的插入、刪除等操作時可以將其改寫成 StringBuilder。
2、JavaBean
JavaBean 是一種符合命名規范的 class,也就是說,只要符合這些命名規范的類,都可以稱之為 JavaBean。
JavaBean 的命名規范:
- JavaBean 類必須是一個公共類,即訪問修飾符為 public
- JavaBean 類必須有一個空的構造函數,類中必須有一個無參的public構造方法
- JavaBean類不應有公共實例變量,類變量都應該是 private
- 屬性應該由一組讀寫方法(getXxx 和 setXxx)來訪問,一個 JavaBean 對象的屬性可以是可讀寫、或只讀、或只寫。可以用IDE來為屬性自動生成 getter / setter 方法。(如果操作的字段為boolean類型,此時的讀方法不應該命名為 getter 方法,而是 is 方法,例如把 getTrue 變成 isTrue)
比如:
public class Person { private String age; private boolean man; public String getAge() { return this.age; } public void setAge(String age) { this.age= age; } public boolean isMan(){}; // 讀方法 public void setMan(boolean value){} // 寫方法 //屬性只需要定義getter和setter方法,不是一定需要有對應的字段即成員變量。比如這個類中就沒有下面對應的child字段 public boolean isChild() { return age <= 6; } }
我們通常把一組對應的讀方法(getter)和寫方法(setter)稱為屬性,例如,name屬性:
- 對應的讀方法是
String getName() - 對應的寫方法是
setName(String)
只有getter的屬性稱為只讀屬性,只有setter的屬性稱為只寫屬性,很明顯,只讀屬性很常見,只寫屬性不常見。
3、枚舉類(enum)
3.1、枚舉類介紹
枚舉類說明:
- 枚舉類的對象是確定的,只有有限個。例如,如果把季節定義成類,那么這個類只有四個對象:春夏秋冬。此時就能把季節定義為一個枚舉類,這個枚舉類的對象是確定的并且只有有限個。
- 當需要定義一組常量時,強烈建議使用枚舉類。
- 如果枚舉類只有一個對象,則可以作為一種單例模式的實現方式。
枚舉類的舉例:
- 季節:春,夏,秋,冬
- 線程的狀態:創建、就緒、運行、阻塞、死亡
枚舉類中的每個枚舉都是單例模式,枚舉類中的實例對象是有限且固定的。
3.2、定義枚舉類
在JDK 5.0之前,需要我們自定義枚舉類。
//自定義枚舉類 class Season{ //1.聲明Season對象的屬性:private final修飾 private final String seasonName; private final String seasonDesc; //2.私有化類的構造器,并給對象屬性賦值 private Season(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //3.提供當前枚舉類的多個對象:public static final修飾 public static final Season SPRING = new Season("春天","春天來了"); public static final Season SUMMER = new Season("夏天","夏天來了"); public static final Season AUTUMN = new Season("秋天","秋天來了"); public static final Season WINTER = new Season("冬天","冰天來了"); }
從JDK5.0 開始可以使用enum關鍵字來定義枚舉類,簡化書寫過程。
package test; //使用enum關鍵字枚舉類 public enum Season { //1.提供當前枚舉類的對象,多個對象之間用","隔開,末尾對象";"結束 SPRING("春天","春天來了"), SUMMER("夏天","夏天來了"), AUTUMN("秋天","秋天來了"), WINTER("冬天","冰天來了"); //2.聲明Season對象的屬性:private final修飾 private final String seasonName; private final String seasonDesc; //3.私化類的構造器,并給對象屬性賦值 private Season(String seasonName,String seasonDesc){ this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //4.其他需求:根據需要定義 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } //其他訴求1:提供toString() @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }
使用枚舉類時,通過 枚舉類名.常量名 來使用,此時得到的是枚舉類的實例對象,可以通過訪問該類的成員方法來獲取相應的數據。
package test; public class Test02 { public static void main(String[] args) { Season spring = Season.SPRING; System.out.println(spring); //Season{seasonName='春天', seasonDesc='春暖花開'} String seasonStr = Season.SUMMER.getSeasonName(); String seasonDesc = Season.SUMMER.getSeasonDesc(); System.out.println(seasonStr + " " + seasonDesc); // 夏天 夏天來了 } }
3.3、枚舉類的特點
通過enum定義的枚舉類,和其他的class沒有任何區別,enum定義的類型就是class。
- 使用enum關鍵字定義的枚舉類默認繼承了java.lang.Enum類,由于Java的單繼承性,不能再繼承其他類。
- 必須要在第一行聲明枚舉類的對象,否則會報錯。
- 從JDK5.0 開始Java的 switch語句可以把使用enum定義的枚舉類的對象作為表達式,并且case只能直接使用枚舉類對象名,不能加類名限定。如下:
package test; public class Test02 { public static void main(String[] args) { Season sea = Season.SPRING; switch (sea){ case Season.SPRING://這里編譯會報錯,應該直接使用 SPRING System.out.println(111); break; case SUMMER: System.out.println(222); break; case AUTUMN: break; case WINTER: break; } } }
使用enum定義的枚舉類是一種引用類型,引用類型比較,要始終使用equals()方法,但enum類型可以例外。這是因為enum類型的每個常量在JVM中只有一個唯一實例,所以可以直接用==比較
3.4、枚舉類的主要方法
- values()方法:將枚舉類的所有對象以數組形式返回,利用此方法可以方便地遍歷枚舉類的值。
- valueOf(String name)方法:返回枚舉類中對象名為name的對象。若沒有,則拋出IllegalArgumentException的異常。
- toString()方法:返回枚舉類對象的名稱
package test; public class Test02 { public static void main(String[] args) { Season summer = Season.SUMMER; //toString():返回枚舉類對象的名稱 System.out.println(summer.toString()); //values():返回所的枚舉類對象構成的數組 Season[] values = Season.values(); for(int i = 0;i < values.length;i++){ System.out.println(values[i]); } //valueOf(String objName):返回枚舉類中對象名是objName的對象。 Season winter = Season.valueOf("WINTER"); //如果沒objName的枚舉類對象,則拋異常:IllegalArgumentException Season winter1 = Season.valueOf("WINTER1"); System.out.println(winter1); } }
輸出結果如下:

3.5、枚舉值的其他方法
因為enum是一個class,每個枚舉的值都是class實例,因此,這些實例有一些方法,如下:
name()方法 返回常量名
String s = Weekday.SUN.name(); // "SUN"
ordinal()返回定義的常量的順序,從0開始計數
int n = Weekday.MON.ordinal(); // 1
但是改變枚舉常量的順序就會導致ordinal()返回值發生變化。
因為enum本身是class,所以我們可以定義private的構造方法,并且,給每個枚舉常量添加字段:
public class Main { public static void main(String[] args) { Weekday day = Weekday.SUN; if (day.dayValue == 6 || day.dayValue == 0) { System.out.println("Work at home!"); //輸出 Work at home! } else { System.out.println("Work at office!"); } } } enum Weekday { MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6), SUN(0); public final int dayValue; private Weekday(int dayValue) { this.dayValue = dayValue; } }
這樣就無需擔心順序的變化,新增枚舉常量時,也需要指定一個int值。
給枚舉類添加的字段也可以是非final類型,即讓該字段可以在使用時被修改,但是不推薦這樣做!

浙公網安備 33010602011771號