Android面試題總結一

  1. java中==和equals和hashCode的區別

     ==是值比較,對於基本類型就是指變量的值,對於引用類型,指的是變量對應的地址。

    equals 繼承自Object,底層默認實現是==,各子類可以按需重寫。

    hashCode和equals一般配合使用,基本規範equals相等,則hashCode一定要相等。反之不一定。hashCode算法默認會調用native方法實現。

     hashCode()方法返回的就是一個數值,從方法的名稱上就可以看出,其目的是生成一個hash碼。hash碼的主要用途就是在對對象進行散列的時候作爲key輸入,據此很容易推斷出,我們需要每個對象的hash碼儘可能不同,這樣才能保證散列的存取性能。事實上,Object類提供的默認實現確實保證每個對象的hash碼不同(在對象的內存地址基礎上經過特定算法返回一個hash碼)。Java採用了哈希表的原理。哈希(Hash)實際上是個人名,由於他提出一哈希算法的概念,所以就以他的名字命名了。 哈希算法也稱爲散列算法,是將數據依特定算法直接指定到一個地址上。初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能並不是)。 https://www.cnblogs.com/kexianting/p/8508207.html 

  • int、char、long各佔多少字節數?

  • int與integer的區別

    8種基本類型:8位:Byte(字節型);  16位:short(短整型)、char(字符型) ; 32位:int(整型)、float(單精度型/浮點型)   64位:long(長整型)、double(雙精度型)   boolean(布爾類型);

    int是基本類型,Integer是包裝類,Integer有緩存[-128-127],另外127是緩存的默認值,可以屬性"java.lang.Integer.IntegerCache.high" 配置的。在進行比較時int 和Integer直接比較的是值;Integer變量直接用數字賦值時,若值範圍在[-128-127]內,則值一樣兩個對象就想等,如不在這個範圍,則值一樣也不相等。用new 創建的不同對象肯定不相等。

   public static void main(String[] args) {
        //Integer緩存[-128,127]
        Integer a = new Integer(-128);
        Integer b = new Integer(-128);

        Integer c = -128;
        Integer d = -128;

        Integer e = -129;
        Integer f = -129;

        int g = -128;

        System.out.println("a==b:" + (a == b));//false
        System.out.println("c==d:" + (c == d));//true
        System.out.println("a==c:" + (a == c));//false
        System.out.println("e==f:" + (e == f));//false
        System.out.println("a==g:" + (a == g));//true
        System.out.println("c==g:" + (c == g));//true
    }

 

  • 探探對java多態的理解

       重載和覆寫。

  • String、StringBuffer、StringBuilder區別

    String不可變,在使用+進行拼接時會創建中間變量。

    StringBuffer可變,線程安全。效率低

    StringBuilder可變、線程不安全,更常用。

特殊情況:

    String a="123"+"abe"+"deb";這種並不會產生中間變量

  • 什麼是內部類?內部類的作用

    在別的類內部定義的類叫內部類,又分爲匿名內部類、內部類(這兩種會持有外部類的引用,可能造成內存泄漏)、靜態內部類不會持有外部類的引用。

  • 抽象類和接口區別

    抽象類可以包含方法的實現,普通的變量,而接口只能有方法的聲明,不能實現(可以用default來實現方法的實現);

抽象類單重繼承,而接口可以實現多個。

  • 泛型中extends和super的區別

    extends 通配符上邊界;super通配符的下邊界。<? extends T>或是<? super T>代表的是範圍內的某個特定的類,而不是範圍內的所有類。

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

<? super T> 限定參數類型的下界:參數類型必須是T或T的超類型

  1. <? extends T> 只能用於方法返回,告訴編譯器此返參的類型的最小繼承邊界爲T,T和T的父類都能接收,但是入參類型無法確定,只能接受null的傳入
  2. <? super T>只能用於限定方法入參,告訴編譯器入參只能是T或其子類型,而返參只能用Object類接收
  3. ? 既不能用於入參也不能用於返參
   public static void main(String[] args) {
        List<? extends Person> people = new ArrayList<Man>();

        people.add(null);//可以
        //people.add(new Man());//不可以,錯誤
        //Man m = people.get(0);//不可以,錯誤
        Person n = people.get(0);
        
        List<? super Man> persons = new ArrayList<Man>();

        Man mm = new Man();
        persons.add(mm);
        persons.add(null);

        Man m1 = (Man) persons.get(0);
        Person person = (Person) persons.get(0);
    }
  • 父類的靜態方法能否被子類重寫

       靜態方法能夠被繼承,但是不能被重寫。
java中,static修飾符修飾的方法就是靜態方法。所謂靜態就是指:在編譯之後所分配的內存會一直存在(不會被回收),直到程序退出內存纔會釋放這個空間;實例方法是在創建對象時才分配相應的內存。在外部調用靜態方法時,可以使用”類名.方法名”的方式,也可以使用”對象名.方法名”的方式。而實例方法只有後面這種方式。 
對於父類引用指向子類對象,可以調用二者共同的方法、變量。 因此,即便是在子類對象中定義一個於父類一模一樣的靜態方法,但是這個靜態方法屬於子類本身,在內存中會分配兩塊控件去存放這兩個靜態變量,因此靜態方法不存在重寫

  • 進程和線程的區別

    進程是操作系統資源分配的基本單位,而線程是任務調度和執行的基本單位。進程是系統資源分配的最小單元,每個進程默認都會開啓一個線程;進程可以包含多個線程,線程共享進程的資源(也有自己的自由資源,比如運行棧和程序計數器(PC))。沒有線程的進程可以看做是單線程的,如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱爲輕權進程或者輕量級進程

  • final,finally,finalize的區別

    final不可變,修飾類,類不能被繼承;方法,方法不能被覆寫;變量,之不能被修改;

    finally異常捕獲時,最後要執行的語句,和try...catch..一起用;不一定一定會執行,比如try...catch調用了System.exit()時;

    finalize()是在java.lang.Object裏定義的,也就是說每一個對象都有這麼個方法。這個方法在gc啓動,該對象被回收的時候被調用。在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。

  • String 轉換成 Integer的方式及原理

  • 哪些情況下的對象會被垃圾回收機制處理掉?

     闡述下java內存模型,對可回收內存的判定方法,垃圾回收算法。

  • 講一下常見編碼方式? ASCII UTF-8 UTF-16  GBK

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章