2018.03.12、Android知識點-Java篇

Traning發表於2018-03-15

1、闡述下物件的自動裝箱和拆箱 2

基本資料型別的自動裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開始提供的功能。
自動裝箱是java編譯器在java原生型別和對應的物件包裝型別上做的自動轉換。

 自動裝箱:
        Integer i = 1;
 其實編譯器為你自動實現了:
        Integer i = Integer.valueOf(1);
 自動拆箱:
        Integer i = 1;
        int a = i;
 實際上執行了:
        int a = i.intValue(); 
複製程式碼

int與integer的區別:

int 是基本型別,直接存數值,進行初始化時int類的變數初始為0。 
integer是物件,用一個引用指向這個物件,Integer的變數則初始化為null。
複製程式碼

2、switch支援的資料型別

包括byte、short、char、int 和 enum ,及包裝型別Character、Byte、Short和Integer,
    java7後又加入了對String的支援。
    闡述下支援String的原理:
    使用字串的hash值作為表示式的值,而由於相同雜湊值的情況下仍存在衝突的可能,
    所有在case語句塊時仍需要通過equals方法來判斷相等。
複製程式碼

3、equals、==、hashCode:

== : 比較引用地址的相等或基本資料型別/列舉型別的相等
  Equal:物件的值情況的相等
  hashCode:返回物件的儲存地址
  關係:
     兩物件比較:euqals返回true時,hashCode也相等。
              hashCode相等時,equals返回不一定相等。

     instanceof: 判斷物件型別5是否相等,當父、子類判斷時存在單向情況。                     
     物件判斷equals方法:
             1、 == 判斷引用地址  2、instanceof 判斷型別  3、屬性匹配
             4、自反性、對稱性、傳遞性、一致性  5、重寫hashcode
複製程式碼

甲學生的年齡 :16 ,學號: 12345 乙學生的年齡 :16, 學號: 54321 這樣甲和乙的hashcode 重寫方式一樣的 1 + 2+ 3+ 4+ 5 +(16*1 )= 31 但是 12345 不equals 54321

4、建立物件:

主要有以下四種物件建立方式:
1、new  2、反射  (這倆要呼叫建構函式)  3、clone  4、 反序列化
其中:
克隆:通過實現Cloneable、Serializable(序列化、反序列化實現)來實現物件的克隆

反射:
   該方式的表現主要有:
   1、執行時取得欄位與方法和修改(包括常量) 
   2、建立物件
   原理:jvm通過位元組碼檔案生成相應的物件或獲取其資訊
   優缺點:增加了程式設計的靈活性;效能消耗較大
複製程式碼

5、簡述下多型,Java多型的實現原理?動態繫結的理解?:

1、物件導向的三大特性:封裝、繼承、多型。
2、多型的定義:同一訊息可以根據函式呼叫的不同而採用多種不同的行為方式。(傳送訊息就是函式呼叫)
3、多型的作用:消除型別之間的耦合關係(解耦)。
4、三個必要條件: 一、要有繼承; 二、要有重寫; 三、父類引用指向子類物件。

 過載:同一類中,同名函式不同的引數形式,基於物件實際的型別來選擇所呼叫的方法,達到動態繫結的目的。
 重寫:父類、子類中,同名同參方法,重新定義方法實現。
 區別: 前者編譯時多型性、後者執行時多型性
 (靜態方法除外,多型是針對例項方法) 
複製程式碼

將一個方法呼叫同一個方法主體關聯起來被稱作繫結,JAVA中分為 前期繫結和後期繫結(動態繫結或執行時繫結)
前期繫結: 在程式執行之前進行繫結(由編譯器和連線程式實現)叫做前期繫結,因為在編譯階段被呼叫方法的直接地址就已經儲存在方法所屬類的常量池中了,程式執行時直接呼叫。

後期繫結: 含義就是在程式執行時根據物件的型別進行繫結,想實現後期繫結,就必須具有某種機制,以便在執行時能判斷物件的型別,從而找到對應的方法,簡言之就是必須在物件中安置某種“型別信”,JAVA中除了static方法、final方法(private方法屬於)之外,其他的方法都是後期繫結。

Java技術----多型的實現原理

6、簡述下抽象類和介面區別:

1、介面是對動作的抽象(實現),抽象類是對根源的抽象。(繼承)
2、介面是抽象類的變體,介面中所有的方法都是抽象的。而抽象類是宣告方法的存在而不去實現它的類。
3、抽象類要被子類繼承,介面要被類實現。
4、介面裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。
5、抽象類裡的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類。
6、抽象類裡可以沒有抽象方法
7、如果一個類裡有抽象方法,那麼這個類只能是抽象類

 抽象類:區別與普通的類,不能直接被例項化,可以有建構函式,並且子類可不實現其抽象方法。
 介面:修飾符為public、變數為final,沒有實際的方法,可實現多繼承。
 
複製程式碼

抽象類的意義:

抽象方法:由abstract修飾的方法為抽象方法,抽象方法只有方法的定義,沒有方法的實現。
抽象類:一個類中如果包含抽象方法,該類應該用abstract關鍵字宣告為抽象類。
抽象類不可以例項化,即使一個類中沒有抽象方法,也可以將其定義為抽象類

意義:
a.為子類提供公共的方法
b.封裝子類中重複內容(成員變數和方法)
c.定義有抽象方法,子類有不同的實現,
複製程式碼

7、簡述public、protected、private、default 的區別:2

也叫 作用域修飾詞

public 作用範圍:當前類、同一個包、子類、其他包;
protected 作用範圍:當前類、同一個包、子類;
default 作用範圍:當前類、同一個包;
private 作用範圍:當前類;
複製程式碼

8、簡述下建立執行緒的方式:

 1、直接通過new thread 的方式;
 2、實現runnable介面;
 3、通過介面callable  (callable能拿到返回值和丟擲異常);
 4、通過執行緒池來生成執行緒;          
複製程式碼

9、sleep、wait、yield、notify、notifyall:

 sleep和yield區別:
           sleep 給予執行緒的執行機會 不考慮優先順序,then 阻塞  
           yield:給優先順序高的執行緒執行,然後進入就緒狀態
   wait和sleep區別:
           wait:釋放物件鎖 object的方法   —> notify
          sleep:不釋放鎖  thread的方法
      兩者都可通過interrupted 打斷暫   
   notify和notifyall區別:
         notify:喚醒的某一執行緒去得到鎖
         notifyall:喚醒所有等待執行緒去競爭鎖
   wait/notify/notifyall : 它們都需在同步塊中呼叫 ,均可釋放物件鎖;
     wait:立即釋放控制權 然阻塞(需notify)     
     notify:執行完再釋放

複製程式碼

10、synchronized 、Lock區別:

synchronized:關鍵字   
Lock:物件   可控制獲取鎖的時間與獲取鎖的資訊
手動釋放鎖、讓執行緒響應中斷、可知獲得鎖與否 
多執行緒競爭較激烈時,Lock較優

上下文切換:cpu控制權由一個正在執行的執行緒切換到另一個就緒狀態的執行緒
複製程式碼

11、異常處理:

Error、Exception:
父類:Throwable :含異常出現時的log
Error:系統級錯誤,如OOM
Exception:
          需程式捕捉和處理的程式設計性錯誤
          被檢查異常(throw、try catch)、執行時異常

Throw:方法中丟擲異常
Throws:申明異常
try catch finally:
    try中有return 會記錄返回值 待finally執行完  返回值不變
    如finally中有return 則值會變
    finally:釋放外部資源 
複製程式碼

12、簡述下JVM記憶體模型: 2

JVM的記憶體模型主要可以分為執行緒共享區和執行緒私有區,
執行緒共享區:java堆(放物件和陣列、GC)、方法區(類資訊、常量、靜態變數等,永久代);
執行緒私有區:程式計數器(指示程式碼執行、無oom)、Java虛擬機器棧(java方法呼叫)、native方法棧;
而每個執行緒都有自己的棧記憶體, 堆是共享的,執行緒會快取物件到棧中使用,而volatile則可要求執行緒從記憶體中讀取
複製程式碼

13、簡述下GC機制:2

判斷物件記憶體是否該被回收:JVM根據可達性分析(引用計數會出現互相引用的情況)
java記憶體回收演算法大概可分為:
        分年代回收:年輕代(建立)、老年代(呆的久)、永久代
    標記-複製演算法:區域分兩塊 一塊使用另一塊回收 交替使用
                     空閒區滿時  就被複制到老年代區
    標記-清除、標記-整理演算法
複製程式碼

14、演算法

排序(必須手寫會)

//冒泡 排序
public static void BubbleSort(int [] arr){
        
        int temp;//臨時變數
        for(int i=0; i<arr.length-1; i++){   //表示趟數,一共arr.length-1次。
            for(int j=arr.length-1; j>i; j--){
                
                if(arr[j] < arr[j-1]){
                    temp = arr[j];
                    arr[j] = arr[j-1];
                    arr[j-1] = temp;
                }
            }
        }
    }

複製程式碼

排序演算法總結

查詢()

複製程式碼

15、java中的基本資料型別?各佔多少位?多少位元組?取值範圍?String是基本型別還是引用型別?

基本資料型別(8種):
1.Int          32   4     -2,147,483,648 ~ 2,147,483,647
2.Short     16   2     -32768 ~ 32678
3.long       64   8     -9,223,372,036,854,775,808~+9,223,372,036,854,775,807
4.float       32   4     -3,40292347E+38 ~ +3,40292347E+38
5.double   64   8       -1.79769313486231576E+308 ~ 1.79769313486231576E+308
6.char       16   2          ‘\u0000′ ~ ‘\uFFFF’
7.boolean 1     0.125   true/false
8.byte 8    1    -128 ~ 127

String是引用型別,
複製程式碼

16、Java什麼時候是值傳遞什麼時候是引用傳遞?

值傳遞的時候,將實參的值,copy一份給形參;
引用傳遞的時候,將實參的地址值,copy一份給形參。
不管是值傳遞還是引用傳遞,形參拿到的僅僅是實參的副本,而不是實參本身。
複製程式碼

Java到底是值傳遞?還是引用傳遞?

17、String相關的。String常量池,StringBuffer,StringBuilder。String不可變的理解。String的intern方法不同版本的實現原理的區別。

String常量池:
JVM為了提高效能和減少記憶體開銷,在例項化字串常量的時候進行了一些優化。為了減少在JVM中建立的字串的數量,字串類維護了一個字串池,每當程式碼建立字串常量時,JVM會首先檢查字串常量池。如果字串已經存在池中,就返回池中的例項引用。如果字串不在池中,就會例項化一個字串並放到池中。 Java能夠進行這樣的優化是因為字串是不可變的,可以不用擔心資料衝突進行共享.

留意文章中的面試題: (貌似被虐過!!!) String之常量池小結

String常量池,StringBuffer,StringBuilder, CharSequence的區別:
1、執行效率 :StringBuilder > StingBuffer > String
2、String 字串常量 不可變,(通過不斷的建立新的物件修改長度)
StringBuffer 字串變數(執行緒安全)
StringBuilder 字串變數(非執行緒安全)
3、String 、StringBuffer 、StringBuilder 都實現了:CharSequence介面。

a++與++a的區別,如果單獨使用沒有任何區別,如果在運算中就有區別了,
a++是先運算在賦值,
而++a是先賦值在運算!!

String不可變的理解:

舉個例子:String str = "aa";  str = "aa"+"bb";
此時str的值為"aabb",但是"aabb"不是在開始的字串"aa"後面直接連線的"bb",而是又新生成了字串"aabb",字串"aa"一旦被初始化,那麼它的值不可能再改變了。
StringBuffer strb = StringBuffer("aa");  strb.append("bb");
此時的strb的值也為"aabb",但是"aabb"是直接在開始的字串"aa"後面連線的“bb”,並沒有生成新的字串。

String物件的底層實際上是一個char[]陣列:
private final char value[];  
用final修飾的物件值可變,但是引用不變,

StringBuffer物件的底層也是一個char[]陣列:
char[] value;  

複製程式碼

為什麼String物件不可變,而StringBuffer可變?

18、JAVA集合框架

  • Collection:儲存單個資料或者物件。

    • |-List:列表:
      • |-LinkedList :基於連結串列的List
      • |-ArrayList :基於陣列的List
      • |-SubList:一個List的檢視
      • |-Vector:一個執行緒安全的List
        • |-Stack:棧
    • **|-Queue:佇列 ,通常作為資料儲存結構,不作為操作容器。**集合框架中應用比較少,主要在在併發包(java.util.concurrent)中實現的阻塞佇列(訊息佇列)。
      • |-ArrayDeque:基於陣列實現的尾插佇列(包含head,tail頭尾指標).
      • |-PriorityQueue:基於陣列的自排序優先順序佇列(基於陣列實現儲存的二叉樹堆排)。
    • |-Set:一個不允許重複資料的集合
      • |-HashSet:基於Hash+陣列+連結串列實現的Set。
        • |-LinkedHashSet:一個基於LinkedHashMap實現的Set。
      • |-TreeSet:一個基於TreeMap實現的Set。
      • |-EnumSet:
        • |-JumboEnumSet
        • |-RegularEnumSet
  • Map:儲存一組K-V鍵值對。

    • |-HashMap:基於Hash+陣列+連結串列實現的Map。
      • |-LinkedHashMap:基於HashMap實現的雙向連結串列。LruCache實現基礎
    • |-HashTable:基於Hash+陣列+連結串列實現的執行緒安全(sync)Map。
    • |-TreeMap:基於紅黑樹實現的有序Map。
    • |-WeakHashMap:K為弱引用的HashMap,使用中,若k沒有被引用則會自動回收掉

集合框架中唯一的兩個執行緒安全集合

Vector(Stack是Vector的子類也是安全的)
Hashtable
複製程式碼

ArrayList,LinkedList異同點:

  • 相同點:
    • List是陣列的封裝介面,所有實現類都可與陣列轉換,且進行index(索引下標)獲取,對於ArrayList和LinkedList只不過是不同的實現方式
  • 不同點:
    • ArrayList是對陣列的封裝,使得對陣列的操作更加方便,查詢快,增刪慢。LinkedList是連結串列的實現,增刪快,查詢慢

HashMap,HashTable中的關聯和差異:

HashMap與HashTable最大的區別在於hashtable是執行緒安全的, hashMap K-V都可為null,hashTable K-V都不能夠為null.

ArrayList和Vector的比較:

  • 相同點: 兩個類都實現了List介面(List介面繼承了Collection介面),他們都是有序集合,即儲存在這兩個集合中的元素的位置都是有順序的,相當於一種動態的陣列,
  • 不同點:
    • Vector是執行緒安全的,也就是說是它的方法之間是執行緒同步的,而ArrayList是執行緒序不安全的,它的方法之間是執行緒不同步的
    • ArrayList與Vector都有一個初始的容量大小,當儲存進它們裡面的元素的個數超過了容量時,就需要增加ArrayList與Vector的儲存空間,Vector增長原來的一倍,ArrayList增加原來的0.5倍。

補充: 底部的資料結構?雜湊表衝突的處理方法,雜湊表是一個什麼樣的資料結構?HashMap是採用什麼方法處理衝突的?

HashMap 採用一種所謂的“Hash 演算法”來決定每個元素的儲存位置。
當程式執行 map.put(String,Obect)方法 時,系統將呼叫String的 hashCode() 方法得到其 hashCode 值——每個 Java 物件都有 hashCode() 方法,都可通過該方法獲得它的 hashCode 值。
得到這個物件的 hashCode 值之後,系統會根據該 hashCode 值來決定該元素的儲存位置。
HashMap採用的連結串列法的方式,連結串列是單向連結串列。
連結串列法就是將相同hash值的物件組織成一個連結串列放在hash值對應的槽位;

當建立 HashMap 時,有一個預設的負載因子(load factor),其預設值為 0.75,
增大負載因子可以減少 Hash 表(就是那個 Entry 陣列)所佔用的記憶體空間,但會增加查詢資料的時間開銷,而查詢是最頻繁的的操作(HashMap 的 get() 與 put() 方法都要用到查詢);
減小負載因子會提高資料查詢的效能,但會增加 Hash 表所佔用的記憶體空間。

http://blog.csdn.net/u011202334/article/details/51498893
複製程式碼

集合面試題1 集合面試題2 集合框架 Java容器框架

19、Java容器相關的輔助類Arrays和Collections瞭解一下(看那個傻逼問!)。

  • Array與Arrays的區別:
    • Array :陣列類 ,提供了動態建立和訪問 Java 陣列的方法。
    • Arrays:工具類,該類中包含了一些方法用來直接運算元組,比如可直接實現陣列的排序(sort())、搜尋(binarySearch())等。
  • Collection和Collections的區別:
    • Collection:集合介面(集合類的一個頂級介面)
    • Collections:集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用於對集合中元素進行排序、搜尋以及執行緒安全等各種操作。

20、Java中final,finalize()和finally的區別:

  • final:關鍵字,可以用於類,方法,變數前,用來表示該關鍵字修飾的類,方法,變數具有不可變的特性
    • final關鍵字用於基本資料型別前:這時表明該關鍵字修飾的變數是一個常量,在定義後該變數的值就不能被修改。
    • final關鍵字用於方法宣告前:這時意味著該方法時最終方法,只能被呼叫,不能被覆蓋,但是可以被過載。
    • final關鍵字用於類名前:此時該類被稱為最終類,該類不能被其他類繼承。
  • finalize():finalize方法來自於java.lang.Object,用於回收資源。
    • 可以為任何一個類新增finalize方法。finalize方法將在垃圾回收器清除物件之前呼叫。 在實際應用中,不要依賴使用該方法回收任何短缺的資源,這是因為很難知道這個方法什麼時候被呼叫。
  • finally:當程式碼丟擲一個異常時,就會終止方法中剩餘程式碼的處理,並退出這個方法(程式碼塊)的執行。 finally try catch 順序問題

21、Java怎樣開啟一個執行緒。執行緒池是幹什麼的?有哪些常用的執行緒池?優缺點是什麼?

開啟執行緒的方式:

1、繼承Thread類:

//1):定義一個類A繼承於java.lang.Thread類.  
class MusicThread extends Thread{  
    //2):在A類中覆蓋Thread類中的run方法.  
    public void run() {  
        //3):在run方法中編寫需要執行的操作  
        for(int i = 0; i < 50; i ++){  
            System.out.println("播放音樂"+i);  
        }  
    }  
}  
  
public class ExtendsThreadDemo {  
    public static void main(String[] args) {  
          
        for(int j = 0; j < 50; j ++){  
            System.out.println("執行遊戲"+j);  
            if(j == 10){  
                //4):在main方法(執行緒)中,建立執行緒物件,並啟動執行緒.  
                MusicThread music = new MusicThread();  
                music.start();  
            }  
        }  
    }  
  
} 
複製程式碼

2、實現Runnable介面:

//1):定義一個類A實現於java.lang.Runnable介面,注意A類不是執行緒類.  
class MusicImplements implements Runnable{  
    //2):在A類中覆蓋Runnable介面中的run方法.  
    public void run() {  
        //3):在run方法中編寫需要執行的操作  
        for(int i = 0; i < 50; i ++){  
            System.out.println("播放音樂"+i);  
        }  
          
    }  
}  
  
public class ImplementsRunnableDemo {  
    public static void main(String[] args) {  
        for(int j = 0; j < 50; j ++){  
            System.out.println("執行遊戲"+j);  
            if(j == 10){  
                //4):在main方法(執行緒)中,建立執行緒物件,並啟動執行緒  
                MusicImplements mi = new MusicImplements();  
                Thread t = new Thread(mi);  
                t.start();  
            }  
        }  
    }  
  
}  
複製程式碼

3、直接在函式體使用(特殊的第二種):

void java_thread()  
{  
  
     Thread t = new Thread(new Runnable(){  
            public void run(){  
           // run方法具體重寫
    mSoundPoolMap.put(index, mSoundPool.load(filePath, index));  
            getThis().LoadMediaComplete();  
            }});  
        t.start();  
}  
複製程式碼

補:繼承方式和實現方式的區別?(遇到過)

  • 繼承方式:
    • 從設計上分析,Java中類是單繼承的,如果繼承了Thread了,該類就不能再有其他的直接父類了.
    • 從操作上分析,繼承方式更簡單,獲取執行緒名字也簡單.(操作上,更簡單)
    • 從多執行緒共享同一個資源上分析,繼承方式不能做到.
  • 實現方式:
    • 從設計上分析,Java中類可以多實現介面,此時該類還可以繼承其他類,並且還可以實現其他介面,設計更為合理.
    • 從操作上分析,實現方式稍微複雜點,獲取執行緒名字也比較複雜,得使用Thread.currentThread()來獲取當前執行緒的引用.
    • 從多執行緒共享同一個資源上分析,實現方式可以做到(是否共享同一個資源).

執行緒池構成

  • 執行緒池管理器(ThreadPool):用於建立並管理執行緒池,包括 建立執行緒池,銷燬執行緒池,新增新任務;
  • 工作執行緒(PoolWorker):執行緒池中執行緒,在沒有任務時處於等待狀態,可以迴圈的執行任務;
  • 任務介面(Task):每個任務必須實現的介面,以供工作執行緒排程任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;
  • 任務佇列(taskQueue):用於存放沒有處理的任務。提供一種緩衝機制。

有哪些常用的執行緒池?優缺點是什麼?

常用的執行緒池

執行緒生命週期:

生命週期
生命週期1

幾個方法的比較:

  • Thread.sleep(long millis),thread 方法,一定是當前執行緒呼叫此方法,當前執行緒進入阻塞,但**不釋放物件鎖,millis後執行緒自動甦醒進入可執行狀態。**作用:給其它執行緒執行機會的最佳方式。

  • obj.wait(),obj方法,當前執行緒呼叫物件的wait()方法,當前執行緒釋放物件鎖,進入等待佇列。依靠notify()/notifyAll()喚醒或者wait(long timeout)timeout時間到自動喚醒。

  • Thread.yield(),一定是當前執行緒呼叫此方法,當前執行緒放棄獲取的cpu時間片,**由執行狀態變會可執行狀態,讓OS再次選擇執行緒。**作用:讓相同優先順序的執行緒輪流執行,但並不保證一定會輪流執行。實際中無法保證yield()達到讓步目的,因為讓步的執行緒還有可能被執行緒排程程式再次選中。Thread.yield()不會導致阻塞。

  • t.join()/t.join(long millis),當前執行緒裡呼叫其它執行緒1的join方法,當前執行緒阻塞,但不釋放物件鎖,直到執行緒1執行完畢或者millis時間到,當前執行緒進入可執行狀態。

  • obj.notify() 喚醒在此物件監視器上等待的單個執行緒,選擇是任意性的。notifyAll()喚醒在此物件監視器上等待的所有執行緒。

22、volidate關鍵字的作用?

  • volatile關鍵字不但可以防止指令重排
  • 保證執行緒訪問的變數值是主記憶體中的最新值。

什麼是單例模式? Volidate的原理和指令重排序

23、Java clone的使用。

Person p = new Person(23, "zhang");  
Person p1 = (Person) p.clone();  
  
System.out.println(p);  
System.out.println(p1);  

列印結果:
//com.pansoft.zhangjg.testclone.Person@2f9ee1ac
//com.pansoft.zhangjg.testclone.Person@67f1fba0
複製程式碼

Java中的clone方法

24、Java反射機制

反射機制:是程式在執行時能夠獲取自身的資訊。
在java中,只要給定類的名字,那麼就可以通過反射機制來獲得類的所有資訊。
複製程式碼

提供的功能: 在執行時能夠判斷任意一個物件所屬的類 在執行時構造任意一個類的物件 在執行時判斷任意一個類所具有的成員變數和方法 在執行時呼叫任一物件的方法 在執行時建立新類物件

反射機制的優缺點:

  • 優點:反射機制的優點就是可以實現動態建立物件和編譯,體現出很大的靈活性
  • 缺點:對效能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什麼並且它滿足我們的要求。這類操作總是慢於只直接執行相同的操作。

25、Java靜態代理和動態代理

Java靜態代理和動態代理

26、類的載入過程,Person person = new Person();為例進行說明

類的載入指的是將類的.class檔案中的二進位制資料讀入到記憶體中,將其放在執行時資料區的方法區內,然後在堆區建立一個這個類的java.lang.Class物件,用來封裝類在方法區類的物件。

類從被載入到記憶體開始,到解除安裝出記憶體為止,其整個生命週期: 載入,驗證,準備,解析,初始化,使用,解除安裝

其中:驗證,準備,解析三個階段又統稱為“連線”

類載入的過程:

包括:載入,驗證,準備,解析和初始化等5個階段。

JAVA類載入週期

阿里、百度 都問過 自己看著辦!

27、什麼是內部類?內部類的作用

1、內部類( Inner Class )就是定義在另外一個類裡面的類。與之對應,包含內部類的類被稱為外部類。

2、作用:
    a.內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
    b.內部類的方法可以直接訪問外部類的所有資料,包括私有的資料
    c.內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便
複製程式碼

28、泛型萬用字元extends與super的區別:

<? extends T> 限定引數型別的上界:引數型別必須是T或T的子型別

<? super T> 限定引數型別的下界:引數型別必須是T或T的超型別
複製程式碼

29、程式和執行緒的區別

1、一個程式至少有一個程式,一個程式至少有一個執行緒.
2、程式在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。
3、每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中
複製程式碼

30、序列化的方式,以及Serializable 和Parcelable 的區別:

  • Serializable和Parcelable介面可以完成物件的序列化過程,當我們需要通過Intent和Binder傳輸資料時就需要使用者兩種序列化方式。
  • Serializable 屬於JAVA API,Parcelable 屬於Android SDK,
  • Serializable 序列化和反序列化過程需要大量的I/O操作,Parcelable 不需要。
  • Serializable 開銷大,效率低,Parcelable 反之。
  • Serializable 序列化到本地或者通過網路傳輸, Parcelable 記憶體序列化

31、靜態內部類與非靜態內部類之間區別

非靜態內部類在編譯完成之後會隱含地儲存著一個引用,該引用是指向建立它的外圍內,但是靜態內部類卻沒有。
複製程式碼

java中靜態內部類的設計意圖

32、Thread中start()和run()的區別;

start():作用是啟動一個新執行緒,新執行緒會執行相應的run()方法。start()不能被重複呼叫。
run():和普通的成員方法一樣,可以被重複呼叫。單獨呼叫run()的話,會在當前執行緒中執行run(),
而並不會啟動新執行緒!
複製程式碼

java高階部分:都搞明白 就要30K吧!!!

  • 哪些情況下的物件會被垃圾回收機制處理掉?
  • 講一下常見編碼方式?
  • utf-8編碼中的中文佔幾個位元組;int型幾個位元組?
  • 靜態代理和動態代理的區別,什麼場景使用?
  • Java的異常體系
  • 談談你對解析與分派的認識。
  • 修改物件A的equals方法的簽名,那麼使用HashMap存放這個物件例項的時候,會呼叫哪個equals方法?
  • Java中實現多型的機制是什麼?
  • 如何將一個Java物件序列化到檔案裡?
  • 說說你對Java反射的理解
  • 說說你對Java註解的理解
  • 說說你對依賴注入的理解
  • 說一下泛型原理,並舉例說明
  • Java中String的瞭解
  • String為什麼要設計成不可變的?
  • Object類的equal和hashCode方法重寫,為什麼?

https://www.jianshu.com/p/c70989bd5f29

相關文章