Java&Android 基礎(chǔ)知識梳理(0) - Java 基礎(chǔ)知識大綱

Java 基礎(chǔ)知識大綱

  • 一澈魄、面向?qū)ο?/li>
  • 二景鼠、Object類相關(guān)
  • 三、重要關(guān)鍵字
  • 四痹扇、內(nèi)部類
  • 五铛漓、抽象類 & 接口
  • 六、編碼
  • 七鲫构、異常
  • 八浓恶、注解
  • 九、容器
  • 十结笨、內(nèi)存區(qū)域
  • 十一包晰、垃圾回收
  • 十二湿镀、類加載
  • 十三、泛型
  • 十四伐憾、反射

一勉痴、面向?qū)ο?/h1>

1.1 對 Java 多態(tài)的理解

面向?qū)ο缶幊痰娜筇匦裕悍庋b、繼承树肃、多態(tài)蚀腿。

  • 封裝:隱藏類的內(nèi)部實現(xiàn)機制奔则。
  • 繼承:重用父類代碼亦镶,為多態(tài)做鋪墊。
  • 多態(tài):程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定进萄,而是在程序運行期間才確定筛谚。

實現(xiàn)多態(tài)的三個必要條件:繼承磁玉、重寫、向上轉(zhuǎn)型驾讲。

  • 繼承:在多態(tài)中必須存在有繼承關(guān)系的子類和父類蚊伞。
  • 重寫:子類對父類中的某些方法進行重新定義,在調(diào)用這些方法時就會調(diào)用子類的方法吮铭。
  • 向上轉(zhuǎn)型:將父類引用指向子類對象时迫,只有這樣,該引用才具備調(diào)用子類方法的能力谓晌。

實現(xiàn)形式:

  • 基于繼承實現(xiàn)的多態(tài)掠拳。
  • 基于接口實現(xiàn)的多態(tài)。

1.2 父類靜態(tài)方法能不能被子類重寫

結(jié)論

父類的靜態(tài)方法可以被子類繼承纸肉,但是不能被子類重寫溺欧。

當(dāng)子類聲明了一個與父類相同的靜態(tài)方法時,只能稱為隱藏柏肪。

  • 父類
/**
 * @author lizejun
 **/
public class Parent {
    
    public static void staticMethod() {
        System.out.println("Parent Static Method");
    }
    
    public void method() {
        System.out.println("Parent Method");
    }
}
  • 子類
/**
 * @author lizejun
 **/
public class Child extends Parent {

    public static void staticMethod() {
        System.out.println("Child Static Method");
    }

    public void method() {
        System.out.println("Child Method");
    }
}
  • 示例姐刁。
/**
 * @author lizejun
 */
public class MainApp {

    public static void main(String[] args) {
        Parent parent = new Child();
        parent.method();
        parent.staticMethod();
        
        Child child = new Child();
        child.method();
        child.staticMethod();
    }
}
  • 運行結(jié)果。
Child Method
Parent Static Method
Child Method
Child Static Method

二烦味、Object 類相關(guān)

2.1 Java 中 ==聂使、equals 和 hashCode 的區(qū)別

==

Java中,分為基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型谬俄,基本數(shù)據(jù)類型包括byte柏靶、shortchar凤瘦、int宿礁、longfloat蔬芥、double梆靖、boolean這八種控汉。

  • 對于基本數(shù)據(jù)類型,==比較的是它們的值返吻。
  • 對于復(fù)合數(shù)據(jù)類型姑子,比較的是它們在內(nèi)存中的存放地址,即比較的是否是同一個對象测僵。

equals

Objectequals默認的實現(xiàn)是比較兩個對象是不是==街佑,和==的效果是相同的。

    public boolean equals(Object obj) {
        return (this == obj);
    }

而有些時候捍靠,對于兩個不同的對象沐旨,我們又需要提供 邏輯 上是否相等的判斷方法,這時候就需要重寫equals方法榨婆。Java提供的某些類已經(jīng)重寫了equals方法磁携,用于判斷"相等"的邏輯,例如Integer良风。

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

hashCode

hashCode的目的是用于在對象進行散列的時候作為key輸入谊迄,保證散列的存取性能。Object的默認hashCode實現(xiàn)為在對象的內(nèi)存地址上經(jīng)過特點的算法計算出烟央。
由此可見统诺,equalshashCode的其實沒有什么關(guān)系。但是由于HashSet/HashMap容器的存在疑俭,又需要保證:

  • 對于equals相等兩個對象粮呢,其hashCode返回的值一定相等
  • 對于equals不同的對象要盡量做到hashCode不同。

Java&Android 基礎(chǔ)知識梳理(8) - 容器類 中提到的HashMap的實現(xiàn)怠硼,value替換的條件是判斷key

//Value 替換的條件
//條件1:hash 值完全相同
//條件2:key 指向同一塊內(nèi)存地址 或者 key 的 equals 方法返回為 true
(e.hash == hash && ((k = e.key) == key || key.equals(k)))

假如我們只重寫了equals方法鬼贱,而沒有重寫hashCode方法移怯,就會導(dǎo)致邏輯上相等的兩個key香璃,放在了容器中的不同位置。

2.2 Integer

存儲原理

  • int屬于基本數(shù)據(jù)類型舟误,存儲在棧中葡秒。
  • Integer屬于復(fù)合數(shù)據(jù)類型,引用存儲在棧中嵌溢,引用所指向的對象存儲在堆中眯牧。

缺省值

  • 0
  • null

泛型支持

泛型支持Integer,不支持int

int 與 Integer 之間的比較

//基本數(shù)據(jù)類型赖草。
int a1 = 128;
//非 new 出來的 Integer学少。
Integer a2 = 128;
//new 出來的 Integer。
Integer a3 = new Integer(128);
  • new出來的Integernew出來的Integer不相等秧骑,前者指向存放它的常量池(數(shù)值位于-128127之間)或者堆版确,后者指向堆中的另外一塊內(nèi)存扣囊。
  • 兩個都是非new出來的Integer,如果在-128127之間绒疗,返回的是true侵歇,否則返回的是false,因為Java在編譯Integer a2 = 128的時候吓蘑,會翻譯成Integer.valueOf(128)惕虑,而valueOf函數(shù)會對-128127之間的數(shù)進行緩存。
    public static Integer valueOf(int i) {
        //low = -128, high = 127.
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
  • 兩個都是new出來的磨镶,返回false溃蔫。
  • intInteger相比,都為true琳猫,因為會把Integer自動拆箱為int再去比較酒唉。

2.3 String

2.3.1 new String 和直接賦值的區(qū)別

new String和直接賦值的區(qū)別:

  • String str1 = "ABC",可能創(chuàng)建一個或者不創(chuàng)建對象沸移,如果ABC這個字符串在常量池中已經(jīng)存在了痪伦,那么str1直接指向這個常量池中的對象。
  • String str2 = new String("ABC")雹锣,至少創(chuàng)建一個對象网沾。一定會在堆中創(chuàng)建一個str2中的String對象,它的valueABC蕊爵,如果ABC這個字符串在常量池中不存在辉哥,會在池中創(chuàng)建一個對象。

例子 1

String s ="a" + "b" + "c" + "d"

只創(chuàng)建了一個對象攒射,在編譯器在編譯時優(yōu)化后醋旦,相當(dāng)于直接定義了一個abcd的字符串。

例子 2

String ab = "ab";                                          
String cd = "cd";                                       
String abcd = ab + cd;                                      
String s = "abcd";  

abcd存儲的是兩個常量池中的對象会放,當(dāng)執(zhí)行ab + cd時饲齐,首先會在堆中創(chuàng)建一個StringBuilder類,同時用ab指向的字符串對象完成初始化咧最,然后調(diào)用append方法完成對cd指向字符串的合并操作捂人,接著調(diào)用StringBuildertoString方法在堆中創(chuàng)建一個String對象,最后將剛生成的String對象的地址存放在局部變量abcd中矢沿。

2.3.2 String滥搭、StringBuilder、StringBuffer 的區(qū)別

對比

  • String中的是常量數(shù)組捣鲸,只能被賦值一次瑟匆。
  • 在編譯階段就能夠確定的字符串常量,沒有必要創(chuàng)建String/StringBuffer對象栽惶,直接使用字符串常量的+效率更高愁溜。
  • StringBuffer中的value[]是一個很普通的數(shù)組无午,而且可以通過append方法將新字符串加入到末尾,改變內(nèi)容和大小祝谚。
  • StringBuffer允許多線程操作宪迟,其很多方法都被關(guān)鍵字synchronized修飾,而StringBuilder則不是交惯,如果不考慮線程安全次泽,StringBuilder應(yīng)該是首選。

注意點

  • 不停地創(chuàng)建對象是程序低效的原因席爽,因此我們應(yīng)該盡可能保證相同的字符串在堆中只創(chuàng)建一個String對象意荤。
  • 當(dāng)調(diào)用Stringintern時,如果常量池已經(jīng)有了當(dāng)前String的值只锻,那么返回這個常量指向的地址玖像;如果沒有,則將String值加入到常量池中齐饮。
  • String捐寥、StringBuffer、StringBuilder 詳細對比

2.3.3 String 為什么要設(shè)計成不可變類

常量池的需要

字符串常量池是Java堆內(nèi)存的一個特殊區(qū)域祖驱,當(dāng)創(chuàng)建一個String對象時握恳,假如字符串已經(jīng)存在于常量池中,則不會創(chuàng)建新的對象捺僻,而是直接引用已經(jīng)存在的對象乡洼。

String s1 = "abc";
String s2 = "abc";

s1s2指向常量池中的同一個對象abc,如果String是可變類匕坯,s1對其的修改將會影響到s2束昵。

HashCode 緩存的需要

因為字符串不可變,在創(chuàng)建的時候HashCode就被緩存葛峻,不需要重新計算锹雏。

多線程安全

由多個線程之間共享,不需要同步處理泞歉。

如何實現(xiàn)不可變

  • 私有成員變量
  • public的方法都是復(fù)制一份數(shù)據(jù)
  • Stringfinal逼侦,因此不可繼承
  • 構(gòu)造函數(shù)深拷貝,進行copy而不是直接將value[]賦值給內(nèi)部變量腰耙。

2.4 序列化 & 反序列化

Java&Android 基礎(chǔ)知識梳理(2) - 序列化

三、重要關(guān)鍵字

3.1 final

final可以用于以下四個地方:

  • 變量:靜態(tài)和非靜態(tài)
  • 定義方法的參數(shù)
  • 定義方法
  • 定義類

3.1.1 變量

靜態(tài)變量

  • 如果final修飾的是一個基本類型铲球,就表示這個變量被賦予的值是不可變的挺庞。
  • 如果final修飾的是一個對象,就表示這個變量被賦予的引用是不可變的稼病。

非靜態(tài)變量

final修飾的變量必須被初始化选侨,初始化的方式有以下幾種:

  • 在定義的時候初始化
  • 非靜態(tài)final變量在初始化塊中初始化掖鱼,不可在靜態(tài)初始化塊中初始化
  • 靜態(tài)final變量可以在靜態(tài)初始化塊中初始化。
  • 非靜態(tài)final變量可以在類的構(gòu)造器中初始化援制,但是靜態(tài)final變量不可以

3.1.2 方法

不可以被子類重寫戏挡,但是不影響被子類繼承。

3.1.3 類

不允許被繼承晨仑。

3.2 static

static 方法

  • 靜態(tài)方法不依賴于任何對象就可以訪問褐墅,因此對于靜態(tài)方法來說,是沒有this的洪己。
  • 靜態(tài)方法中不能訪問類的非靜態(tài)成員變量和非靜態(tài)成員方法妥凳。

static 變量

  • 靜態(tài)變量被所有的對象所共享,在內(nèi)存中只有一個副本答捕,它當(dāng)且僅當(dāng)在類初次加載時被初始化逝钥。
  • 非靜態(tài)變量是對象所擁有的,在創(chuàng)建對象的時候被初始化拱镐,存在多個副本艘款,各個對象擁有的副本互不影響。
  • static成員變量的初始化順序按照定義的順序進行初始化沃琅。

static 代碼塊

  • static塊可以置于類的任何地方磷箕,類中可以有多個static塊。
  • 在類初次被加載的時候阵难,會按照static塊的順序來執(zhí)行每個static塊岳枷,并且只執(zhí)行一次。

Java 中的 static 關(guān)鍵字解析

四呜叫、內(nèi)部類

4.1 定義

內(nèi)部類的定義:在一個外部類的內(nèi)部再定義一個類空繁。

4.2 分類

  • 成員內(nèi)部類:作為外部類的成員,可以直接使用外部類的所有成員和方法朱庆。
  • 靜態(tài)內(nèi)部類:聲明為static的內(nèi)部類盛泡,成員內(nèi)部類不能有static數(shù)據(jù)和static方法,但嵌套內(nèi)部類可以娱颊。
  • 局部內(nèi)部類:內(nèi)部類定義在方法和作用域內(nèi)傲诵。只在該方法或條件的作用域內(nèi)才能使用,退出作用域后無法使用箱硕。
  • 匿名內(nèi)部類:匿名內(nèi)部類有幾個特點:不能加訪問修飾符拴竹;當(dāng)所在方法的形參需要被內(nèi)部類里面使用時,該形參必須為final剧罩。

4.3 作用

4.3.1 實現(xiàn)隱藏

外部頂級類即類名和文件名相同的只能使用publicdefault修飾栓拜,但內(nèi)部類可以是staticpublic/default/protected/private

首先幕与,定義內(nèi)部類需要實現(xiàn)的接口:

/**
 * @author lizejun
 **/
public interface InnerInterface {
    void call();
}

再定義一個包裝類:

/**
 * @author lizejun
 **/
public class Outer {

    private class InnerImpl implements InnerInterface {

        @Override
        public void call() {
            System.out.println("call inner");
        }
    }

    public InnerInterface getInnerInterface() {
        return new InnerImpl();
    }
}

由于我們將InnerInterface的實現(xiàn)類聲明為了private挑势,因此外部并不知道它的存在,也就達到了隱藏的目的啦鸣。

/**
 * @author lizejun
 */
public class MainApp {

    public static void main(String[] args) {
        Outer outer = new Outer();
        InnerInterface inner = outer.getInnerInterface();
        inner.call();
    }
}

4.3.2 無條件地訪問外部類當(dāng)中的元素

/**
 * @author lizejun
 **/
public class Outer {
    
    //外部類的私有變量潮饱。
    private int outerSelfValue = 0;

    private class InnerImpl implements InnerInterface {

        @Override
        public void call() {
            //內(nèi)部類可以無條件地訪問。
            System.out.println("call inner, outerValue=" + outerSelfValue);
        }

    }

    public InnerInterface getInnerInterface() {
        return new InnerImpl();
    }
}

這僅限于非靜態(tài)內(nèi)部類诫给,它和靜態(tài)內(nèi)部類的區(qū)別是:

  • 靜態(tài)內(nèi)部類沒有指向外部的引用
  • 在任何非靜態(tài)內(nèi)部類中香拉,都不能有靜態(tài)變量、靜態(tài)方法或者靜態(tài)內(nèi)部類蝙搔。
  • 創(chuàng)建非靜態(tài)內(nèi)部類缕溉,必須要通過外部類來創(chuàng)建,例如Outer.InnerImpl outer = new Outer().new InnerImpl();吃型;靜態(tài)內(nèi)部類則可以直接創(chuàng)建证鸥,Outer.InnerImpl outer = new Outer.InnerImpl();
  • 靜態(tài)內(nèi)部類只可以訪問外部類的靜態(tài)方法和靜態(tài)變量。

4.3.3 實現(xiàn)多重繼承

由于Java不允許多重繼承勤晚,因此假如我們希望一個類同時具備其它兩個類的功能時枉层,就可以采用內(nèi)部類來實現(xiàn)。

實現(xiàn)乘法的子類:

/**
 * @author lizejun
 **/
public class MultiCalculator {

    public int multi(int a, int b) {
        return a * b;
    }
}

實現(xiàn)加法的子類:

/**
 * @author lizejun
 **/
public class PlusCalculator {

    public int add(int a, int b) {
        return a;
    }
}
  • 通過內(nèi)部類實現(xiàn)多重繼承
/**
 * @author lizejun
 **/
public class Calculator extends PlusCalculator {

    class MultiCalculatorImpl extends MultiCalculator {

        @Override
        public int multi(int a, int b) {
            return super.multi(a, b);
        }
    }

    public int multi(int a, int b) {
        return new MultiCalculatorImpl().multi(a, b);
    }
}

4.3.4 避免修改接口而實現(xiàn)同一個類中兩種同名方法的調(diào)用

用于解決下面的困境:一個需要繼承另一個類赐写,還要實現(xiàn)一個接口鸟蜡,而繼承的類和接口里面有兩個同名的方法。那么我們調(diào)用該方法的時候挺邀,究竟是父類的揉忘,還是實現(xiàn)的接口呢,這時候就可以使用內(nèi)部類來解決這一問題端铛。

  • 需要繼承的子類中有call方法
/**
 * @author lizejun
 **/
public class BaseOuter {

    public void call() {
        System.out.println("call baseOuter");
    }
}
  • 需要實現(xiàn)的接口泣矛,同樣有call方法
/**
 * @author lizejun
 **/
public interface InnerInterface {
    void call();
}
  • 采用內(nèi)部類的方式避免出現(xiàn)困惑
/**
 * @author lizejun
 **/
public class Outer extends BaseOuter {

    private class InnerImpl implements InnerInterface {

        @Override
        public void call() {
            //內(nèi)部類可以無條件地訪問。
            System.out.println("call inner");
        }

    }

    public InnerInterface getInnerInterface() {
        return new InnerImpl();
    }
}
  • 調(diào)用方式
/**
 * @author lizejun
 */
public class MainApp {

    public static void main(String[] args) {
        Outer outer = new Outer();
        //1. 調(diào)用的是繼承父類的接口禾蚕。
        outer.call();
        //2. 調(diào)用的實現(xiàn)接口的方法您朽。
        outer.getInnerInterface().call();
    }
}

4.4 應(yīng)用場景

幕后英雄的用武之地——淺談 Java 內(nèi)部類的四個應(yīng)用場景

  • 除了它的外部類,不再被其它的類使用
  • 解決一些非面向?qū)ο蟮恼Z句塊
/**
 * @author lizejun
 **/
public interface InnerWorker {
    void work();
}
/**
 * @author lizejun
 **/
public class Factory {

    public void doWork(InnerWorker worker) {
        try {
            worker.work();
        } catch (Exception exception) {
            System.out.println("exception!");
        } finally {
            System.out.println("finally!");
        }
    }
}
/**
 * @author lizejun
 */
public class MainApp {

    public static void main(String[] args) {
        Factory factory = new Factory();
        factory.doWork(new InnerWorker() {

            @Override
            public void work() {
                System.out.println("work1 work");
            }
        });
        factory.doWork(new InnerWorker() {

            @Override
            public void work() {
                System.out.println("work2 work");
            }
        });
    }
}
  • 一些多算法場合
  • 適當(dāng)使用內(nèi)部類换淆,使得代碼更加靈活和具有擴展性
/**
 * @author lizejun
 **/
public interface Shape {
    void draw();
}
/**
 * @author lizejun
 **/
public abstract class ShapeFactory {

    private static HashMap<String, ShapeFactory> factories = new HashMap();

    public static void addFactory(String id, ShapeFactory factory) {
        factories.put(id, factory);
    }

    public static Shape createShape(String id) {
        if (!factories.containsKey(id)) {
            try {
                Class.forName(id);
            } catch (Exception e) {}
        }
        return factories.get(id).create();
    }

    protected abstract Shape create();

}
/**
 * @author lizejun
 */
public class MainApp {

    public static void main(String[] args) {
        Shape shape = ShapeFactory.createShape(Circle.ID);
        shape.draw();
    }
}

4.5 內(nèi)部類和閉包

閉包就是把函數(shù)以及變量包起來哗总,使得變量的生存周期延長,閉包跟面向?qū)ο笫且豢脴渖系膬蓷l枝倍试,實現(xiàn)的功能是等價的讯屈。

涉及到閉包的兩種內(nèi)部是:局部內(nèi)部類和匿名內(nèi)部類。當(dāng)它們引用外部變量時易猫,外部的變量需要是final的耻煤。

以下面這個例子為例具壮,定義一個內(nèi)部類的接口:

/**
 * @author lizejun
 **/
public interface InnerInterface {
    void call();
}
/**
 * @author lizejun
 **/
public class InnerClose {
    
    public void doClose(final int a) {
        InnerInterface inner = new InnerInterface() {
            
            @Override
            public void call() {
                System.out.println("a=" + a);    
            }
        };
        inner.call();
    }
}
/**
 * @author lizejun
 */
public class MainApp {

    public static void main(String[] args) {
        InnerClose close = new InnerClose();
        close.doClose(1);
    }
}

在編譯之后准颓,局部內(nèi)部類會生成獨立的InnerClose$1.class文件哈蝇,而變量a是方法級別的,方法運行完變量就銷毀了攘已,而局部內(nèi)部類對象還可能一直存在炮赦,不會隨著方法運行結(jié)束就馬上被銷毀。這時候就會出現(xiàn)样勃,局部內(nèi)部類對象需要訪問一個已經(jīng)不存在的局部變量a吠勘。

因此,通過將變量聲明為final峡眶,編譯器會將final局部變量復(fù)制一份剧防,復(fù)制品作為局部內(nèi)部類中的成員,這樣辫樱,當(dāng)局部內(nèi)部類訪問局部變量時峭拘,其實真正訪問的是這個局部變量的復(fù)制品。

由于被final修飾的變量賦值后不能再修改狮暑,所以就保證了復(fù)制品與原始變量的一致鸡挠,就好像是局部變量的 生命期變長了,這就是Java的閉包搬男。

匿名內(nèi)部類為什么訪問外部類局部變量必須是 final 的

五拣展、抽象類 & 接口

5.1 區(qū)別

  • 抽象類和接口都不能被實例化。
  • 抽象類要被子類繼承缔逛,接口要被類實現(xiàn)备埃。
  • 接口只能做方法的聲明,抽象類可以做方法的聲明褐奴,也可以做方法的實現(xiàn)按脚。
  • 接口里定義的變量只能是公共的靜態(tài)常量,抽象類中的變量可以是普通變量歉糜。
  • 抽象類里的抽象方法必須全部被子類實現(xiàn)乘寒;接口的接口方法必須全部被子類實現(xiàn),否則只能為抽象類匪补。
  • 抽象類里可以沒有抽象方法伞辛。
  • 如果一個類里有抽象方法,那么這個類只能是抽象類夯缺。
  • 抽象方法要被實現(xiàn)蚤氏,所以不能是靜態(tài)的,也不能是私有的踊兜。
  • 接口可繼承接口竿滨,并可多繼承接口,但類只能單繼承。

5.2 應(yīng)用場景

抽象類

在既需要統(tǒng)一的接口于游,又需要實例變量或缺省方法的情況下毁葱,可以使用:

  • 定義了一組接口,但又不想強迫每個實現(xiàn)類都必須實現(xiàn)所有的接口贰剥。
  • 某些場合下倾剿,只靠純粹的接口不能滿足類與類之間的協(xié)調(diào),還需要類中表示狀態(tài)的變量來區(qū)別不同的關(guān)系蚌成。
  • 規(guī)范了一組相互協(xié)調(diào)的方法前痘,其中一些方法是共同的,與狀態(tài)無關(guān)的担忧,可以共享的芹缔,無需子類分別實現(xiàn);而另一些方法卻需要各個子類根據(jù)自己特定的狀態(tài)來實現(xiàn)特定的功能瓶盛。

接口

  • 類與類之間需要特定的接口協(xié)調(diào)最欠,而不在乎其如何實現(xiàn)。
  • 需要將一組類視為單一的類蓬网,而調(diào)用者只通過接口來與這組類發(fā)生聯(lián)系窒所。

六、編碼

6.1 為什么要編碼

  • 計算機中存儲信息的最小單元是8bit帆锋,所以能表示的字符范圍是0~255個吵取。
  • 要表示的符號太多,無法用一個字節(jié)來完全表示锯厢。
  • 要解決這個矛盾必須要一個新的數(shù)據(jù)結(jié)構(gòu)char皮官,從charbyte必須編碼。

6.2 編碼方式

ASCII 碼

ASCII碼總共有128個实辑,用一個字節(jié)的低7位表示捺氢。

ISO-8859-1

ASCII碼基礎(chǔ)上制定了一系列標(biāo)準(zhǔn)來擴展ASCII編碼,其仍然是單字節(jié)編碼剪撬,總共能表示256個字符摄乒。

GB2312

雙字節(jié)編碼,總的范圍是A1~F7残黑,從A1~A9是符號區(qū)馍佑,總共包含682個符號;從B0~F7是漢字區(qū)梨水,包含6763個漢字拭荤。

GBK

擴展GB2312,加入更多的漢字疫诽,其編碼范圍是8140~FEFE舅世,和GB2312兼容旦委。

GB18030

我國的強制標(biāo)準(zhǔn),可能是單字節(jié)雏亚、雙字節(jié)或者四字節(jié)編碼缨硝,與GB2312兼容。

Unicode 編碼集

ISO試圖創(chuàng)建一個全新的語言字典评凝,將所有的語言互相翻譯追葡。String在內(nèi)存中 不需要編碼格式腺律,它只是一個Unicode字符串而已奕短。只有當(dāng)字符串需要在網(wǎng)絡(luò)中傳輸或要被寫入文件時,才需要編碼格式匀钧。

  • UTF-16
    UTF-16具體定義了Unicode字符在計算機中的存取方法翎碑,它用兩個字節(jié)表示Unicode轉(zhuǎn)化格式。
  • UTF-8
    UTF-16的缺點在于很大部分字符僅用一個字節(jié)就可以表示之斯,目前卻需要使用兩個日杈,而UTF-8采用了變長技術(shù),不同類型的字符可以由1~6個字節(jié)組成佑刷。
    • 如果一個字節(jié)莉擒,最高位為0,表示這是一個ASCII字符瘫絮。
    • 如果一個字節(jié)涨冀,以11開頭,連續(xù)的1個數(shù)表示這個字符的字節(jié)數(shù)麦萤。
    • 如果一個字節(jié)鹿鳖,以10開始,表示它不是首字節(jié)壮莹,需要向前查找才能得到當(dāng)前字符的首字節(jié)翅帜。
String s = "嚴"; 
//編碼。
byte[] b = s.getBytes("UTF-8");
//解碼命满。 
String n = new String(b,"UTF-8"); 

6.3 對比

  • GB2312GBK編碼規(guī)則類似涝滴,但是GBK范圍更大,它能處理所有漢字字符胶台。
  • UTF-16UTF-8都是處理Unicode編碼歼疮,UTF-16效率更高,它適合在本地磁盤和內(nèi)存之間使用概作。
  • UTF-16不是在網(wǎng)絡(luò)之間傳輸腋妙,因為網(wǎng)絡(luò)傳輸容易損壞字節(jié)流,UTF-8更適合網(wǎng)絡(luò)傳輸讯榕,對ASCII字符采用單字節(jié)存儲骤素,單字節(jié)損毀不會影響后面其它字符匙睹。

6.4 參考文章

七、異常

Java中定義了許多異常類济竹,并定義了Throwable作為所有異常的超類痕檬,將異常劃分為兩類ErrorException

  • Error:程序中無法處理的錯誤送浊,例如NoClassDefFoundError梦谜、OutOfMemory等,當(dāng)此類錯誤發(fā)生時袭景,JVM將終止進程唁桩。
  • Exception:程序本身可以處理的異常。
    • 運行時異常耸棒,RuntimeException及其子類荒澡,表示JVM在運行時可能出現(xiàn)的錯誤,例如空指針与殃、數(shù)組越界等单山,一般是由邏輯錯誤引起。
    • 受檢異常:除RuntimeException及其子類的異常幅疼。編譯器會檢查此類異常米奸,并提示你處理本類異常 - 要么使用try-catch捕獲,要么使用throws語句拋出爽篷,否則編譯不通過悴晰。

八、注解

Java&Android 基礎(chǔ)知識梳理(1) - 注解

九狼忱、容器

Java&Android 基礎(chǔ)知識梳理(8) - 容器類

十膨疏、內(nèi)存區(qū)域

Java&Android 基礎(chǔ)知識梳理(3) - 內(nèi)存區(qū)域

十一、垃圾回收

Java&Android 基礎(chǔ)知識梳理(4) - 垃圾收集器與內(nèi)存分配策略

十二钻弄、類加載

Java&Android 基礎(chǔ)知識梳理(5) - 類加載&對象實例化

十三佃却、泛型

Java & Android 基礎(chǔ)知識梳理(12) - 泛型

十四、反射

Java&Android 基礎(chǔ)知識梳理(13) - 反射

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窘俺,一起剝皮案震驚了整個濱河市饲帅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘤泪,老刑警劉巖灶泵,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異对途,居然都是意外死亡赦邻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門实檀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惶洲,“玉大人按声,你說我怎么就攤上這事√衤溃” “怎么了签则?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铐料。 經(jīng)常有香客問我渐裂,道長,這世上最難降的妖魔是什么钠惩? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任柒凉,我火速辦了婚禮,結(jié)果婚禮上妻柒,老公的妹妹穿的比我還像新娘扛拨。我一直安慰自己,他們只是感情好举塔,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著求泰,像睡著了一般央渣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渴频,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天芽丹,我揣著相機與錄音,去河邊找鬼卜朗。 笑死拔第,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的场钉。 我是一名探鬼主播蚊俺,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逛万!你這毒婦竟也來了泳猬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宇植,失蹤者是張志新(化名)和其女友劉穎得封,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體指郁,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡忙上,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了闲坎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疫粥。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡洋腮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出手形,到底是詐尸還是另有隱情啥供,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布库糠,位于F島的核電站伙狐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞬欧。R本人自食惡果不足惜贷屎,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艘虎。 院中可真熱鬧唉侄,春花似錦、人聲如沸野建。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽候生。三九已至同眯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唯鸭,已是汗流浹背须蜗。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留目溉,地道東北人明肮。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像缭付,于是被迫代替她去往敵國和親柿估。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355