Java-06 枚舉胡野、包裝類、字符串

枚舉

  • 如果一個變量的取值只可能是固定的幾個值痕鳍,可以考慮使用枚舉
    • 枚舉由一組預定義的常量構(gòu)成
public enum Season {
  SPRING, SUMMER, FALL, WINTER
}

public class Main {
  public static void main(String[] args) {
    Season s = Season.WINTER;
    
    // 打印名稱
    System.out.println(s.name());// WINTER
    // 打印下標
    System.out.println(s.ordinal());// 3
  }
}

枚舉本質(zhì)上還是一個類硫豆,所有的枚舉類型最終都隱式的繼承自java.lang.Enum

枚舉定義完常量之后可以再定義成員變量,方法等內(nèi)容(也間接說明了枚舉本質(zhì)上確實是一個類)

public enum Season {
  SPRING, SUMMER, FALL, WINTER;

  int age = 0;
  public void test(){
    System.out.println(age);
  }
}

枚舉的構(gòu)造方法的權(quán)限必須是無修飾或者private的笼呆。

Java會自動為每一個枚舉添加構(gòu)造函數(shù)熊响,外界不能調(diào)用,枚舉在初始化常量的時候會調(diào)用構(gòu)造方法诗赌。也就是枚舉的構(gòu)造方法并不是提供給外部使用的汗茄,而是給內(nèi)部使用的

包裝類(Wrapper Class)

在講述包裝類之前,先看看基本類型的缺陷

  • 無法表示不存在的值(null)
  • 不能利用面向?qū)ο蟮姆绞饺ゲ僮骰绢愋停ū热缰苯邮褂没绢愋驼{(diào)用方法)
  • 當方法參數(shù)是引用類型時铭若,基本類型無法傳遞

為了解決這些缺陷洪碳,可以將基本類型包裝為引用類型

public class IntObject {
  private final int value;
  public  IntObject(int v) {
    this.value = v;
  }

  public int getValue() {
    return this.value;
  }
}

IntObject[] money = {
    new IntObject(10),
    new IntObject(23),
    null,
    new IntObject(-100),
    new IntObject(150),
  };
  

這樣就可以解決上述的缺陷

Java已經(jīng)內(nèi)置了基本類型的包裝類(都在java.lang包中),其中叼屠,數(shù)字類型的基本類型最終都繼承自java.lang.Number

基本類型 包裝類
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
Integer[] money2 = {
    new Integer(10),
    new Integer(23),
    null,
    new Integer(-100),
    new Integer(150)
  };

自動裝箱瞳腌、拆箱(Autoboxing and Unboxing)

自動裝箱:java編譯器會自動調(diào)用valueOf方法,將基本類型轉(zhuǎn)換為包裝類型

  Integer[] money2 = {
    Integer.valueOf(10),
    Integer.valueOf(100),
    Integer.valueOf(110),
    Integer.valueOf(120),
  };

  // 自動裝箱
  // 數(shù)組里存儲的并不是基本類型 而是Integer
  Integer[] money3 = {
    10, // 等同于 Integer.valueOf(10)
    100,
    110,
    120,
  };
  // 這里也是對的
  // java編譯器會自動裝箱成Integer類型 
  Object num = 10;

自動拆箱: java編譯器會自動調(diào)用xxxValue方法环鲤,將包裝類轉(zhuǎn)為基本類型

  Integer i1 = 10;
  int i2 = i1;
  // 上面等同于下面的代碼
  // int i2 = i1.intValue();

包裝類的判等

包裝類的判等纯趋,不要使用==!=運算符冷离,應該使用equals方法

包裝類是一個類吵冒,所以在使用==時比較的不是包裝的值,而是對象的內(nèi)存地址西剥。

    Integer i1 = 88; // 等價于 Integer.valueOf(88);
    Integer i2 = 88;
    Integer i3 = 888;
    Integer i4 = 888;
    // 不推薦
    System.out.println(i1 == i2); // true
    System.out.println(i3 == i4); // false 888 超出了緩存范圍 所以每次都是新創(chuàng)建的對象

    // 推薦
    System.out.println(i1.equals(i2)); // true
    System.out.println(i3.equals(i4)); // true

在Integer類中有一個IntegerCache嵌套類痹栖,會緩存-128到127之間的值,在使用valueOf方法時瞭空,會先從該緩存類中檢查是否有緩存揪阿,有的話直接返回而不是新創(chuàng)建一個Integer對象。 所以i1 == i2返回true,而i3 == i4返回false,

    Integer i5 = 88;
    Integer i6 = Integer.valueOf(88);
    Integer i7 = new Integer(88); // 這里是新創(chuàng)建了Integer對象 而沒有從緩存取 所以地址不同了

    System.out.println(i5 == i6);// true
    System.out.println(i5 == i7);// false

使用注意

【基本類型數(shù)組】與【包裝類數(shù)組】之間是不能自動裝箱咆畏、拆箱的南捂。
比如int數(shù)組不能直接賦值給Integer數(shù)組

字符串

  • Java中用java.lang.String類代表字符串

  • 低層使用char[]存儲字符數(shù)據(jù),從java9開始旧找,低層使用byte[]存儲字符數(shù)據(jù)

  • 所有字符串字面亮都是String類的實例

  • String對象一旦創(chuàng)建完畢溺健,它的字符內(nèi)容是不可以修改的

字符串常量池(String Constant Pool)

  • java中有個字符串常量池(String Constant Pool,簡稱SCP)
  • 從java 7開始屬于堆空間的一部分(之前屬于方法區(qū))

當遇到字符串字面量時,回去查看SCP钮蛛,如果SCP中有與字面量內(nèi)容一樣的字符串對象A時鞭缭,就會返回A剖膳,如果沒有,就創(chuàng)建一個新的字符串對象岭辣,并加入到SCP吱晒,然后返回

    String s1 = "lwy"; // 會從scp中查找 沒有 然后創(chuàng)建字符串對象返回
    String s2 = "lwy"; // 從scp中查找 找到并返回
    System.out.println(s1 == s2); // true 所以s1與s2是同一個對象
    String s1 = "wy";
    String s2 = new String("wy");// 
    String s3 = new String(s1);
    String s4 = new String(s2);
    char[] cs = {'w','y'};
    String s5 = new String(cs);
    String s6 = new String(s5);

上述字符串的內(nèi)存分布大致如下

內(nèi)存分布

前面說過,字符串的底層是通過數(shù)組來存放字符的沦童,

    @Stable
    private final byte[] value;

每次調(diào)用String的構(gòu)造方法都會創(chuàng)建一個新的String對象仑濒,存放在堆區(qū)。

public String(String original) {
        this.value = original.value;
        this.coder = original.coder;
        this.hash = original.hash;
}

但是點開查看String的構(gòu)造方法查看搞动,當初始化傳遞一個String對象的時候躏精,會把傳遞的String的value直接賦值給新對象的value渣刷,也就是說s1,s2,s3,s4的value都是同一個鹦肿。同理,s5辅柴,s6也是同一個value

intern的用法

    String s = new String("wy");
    s.intern();

A.intern方法的作用: 如果SCP中存在與A內(nèi)容一樣的字符串對象C時箩溃,就返回C,如果沒有碌嘀,就將A添加進SCP涣旨,并返回A

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市股冗,隨后出現(xiàn)的幾起案子霹陡,更是在濱河造成了極大的恐慌,老刑警劉巖止状,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烹棉,死亡現(xiàn)場離奇詭異,居然都是意外死亡怯疤,警方通過查閱死者的電腦和手機浆洗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來集峦,“玉大人伏社,你說我怎么就攤上這事∷伲” “怎么了摘昌?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長高蜂。 經(jīng)常有香客問我聪黎,道長,這世上最難降的妖魔是什么妨马? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任挺举,我火速辦了婚禮杀赢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湘纵。我一直安慰自己脂崔,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布梧喷。 她就那樣靜靜地躺著砌左,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铺敌。 梳的紋絲不亂的頭發(fā)上汇歹,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音偿凭,去河邊找鬼产弹。 笑死,一個胖子當著我的面吹牛弯囊,可吹牛的內(nèi)容都是我干的痰哨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匾嘱,長吁一口氣:“原來是場噩夢啊……” “哼斤斧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霎烙,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤撬讽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悬垃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體游昼,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年盗忱,在試婚紗的時候發(fā)現(xiàn)自己被綠了酱床。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡趟佃,死狀恐怖扇谣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闲昭,我是刑警寧澤罐寨,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站序矩,受9級特大地震影響鸯绿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一瓶蝴、第九天 我趴在偏房一處隱蔽的房頂上張望毒返。 院中可真熱鬧,春花似錦舷手、人聲如沸拧簸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盆赤。三九已至,卻和暖如春歉眷,著一層夾襖步出監(jiān)牢的瞬間牺六,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工汗捡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淑际,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓凉唐,卻偏偏與公主長得像庸追,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子台囱,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354