天天看點

java面試

1. java語言的特點

  Java是一種簡單的,面向對象的,分布式的,解釋型的,健壯安全的,結構中立的,可移植的,性能優異、多線程的靜态語言。

2. hashmap和treemap、hashset和treeset、hashmap和hashset

  2.1 hashmap和treemap

  HashMap通過hashcode對其内容進行快速查找,而 TreeMap中所有的元素都保持着某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。

  HashMap:基于哈希表實作。使用HashMap要求添加的鍵類明确定義了hashCode()和equals()[可以重寫hashCode()和equals()].

  TreeMap:基于紅黑樹實作。TreeMap沒有調優選項,因為該樹總處于平衡狀态。

  HashMap:适用于在Map中插入、删除和定位元素。

  Treemap:适用于按自然順序或自定義順序周遊鍵(key)。

  2.2 hashset和treeset

  1 HashSet底層采用的是HashMap進行實作的,但是沒有key-value,隻有HashMap的key set的視圖,HashSet不容許重複的對象

  2 HashMap可以将空值作為一個表的條目的key或者value,HashMap中由于鍵不能重複,是以隻有一條記錄的Key可以是空值,而value可以有多個為空,但HashTable不允許null值(鍵與值均不行)

  3 Hashtable是基于Dictionary類的,而HashMap是基于Map接口的一個實作

  4 Hashtable裡預設的方法是同步的,而HashMap則是非同步的,是以Hashtable是多線程安全的

3. int和Integer的差別

4. 單例模式

  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裡主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。

  單例模式有以下特點:

  1、單例類隻能有一個執行個體。

  2、單例類必須自己建立自己的唯一執行個體。

  3、單例類必須給所有其他對象提供這一執行個體。

  單例模式確定某個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。在計算機系統中,線程池、緩存、日志對象、對話框、列印機、顯示卡的驅動程式對象常被設計成單例。這些應用都或多或少具有資料總管的功能。每台計算機可以有若幹個列印機,但隻能有一個Printer Spooler,以避免兩個列印作業同時輸出到列印機中。每台計算機可以有若幹通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一緻狀态,避免政出多頭。

5. Collection和Collections

  1、java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實作。Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式。

 Collection   

├List   

│├LinkedList   

│├ArrayList   

│└Vector   

│ └Stack   

└Set 

  2、java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜态多态方法。此類不能執行個體化,就像一個工具類,服務于Java的Collection架構。

6. 支援排序的集合

7. java泛型

8. final、finally、finalized

9. native

  Java不是完美的,Java的不足除了展現在運作速度上要比傳統的C++慢許多之外,Java無法直接通路到作業系統底層(如系統硬體等),為此Java使用native方法來擴充Java程式的功能。

  可以将native方法比作Java程式同C程式的接口,其實作步驟:

  1、在Java中聲明native()方法,然後編譯。

  2、用javah産生一個.h檔案。

  3、寫一個.cpp檔案實作native導出方法,其中需要包含第二步産生的.h檔案(注意其中又包含了JDK帶的jni.h檔案)。

  4、将第三步的.cpp檔案編譯成動态連結庫檔案。

  5、在Java中用System.loadLibrary()方法加載第四步産生的動态連結庫檔案,這個native()方法就可以在Java中被通路了。

  JAVA的native方法适用的情況:

  1、為了使用底層的主機平台的某個特性,而這個特性不能通過JAVA API通路。

  2、為了通路一個老的系統或者使用一個已有的庫,而這個系統或這個庫不是用JAVA編寫的。

  3、為了加快程式的性能,而将一段時間敏感的代碼作為本地方法實作。

10. 多線程

  JAVA多線程實作方式主要有三種:繼承Thread類、實作Runnable接口、使用ExecutorService、Callable、Future實作有傳回結果的多線程。其中前兩種方式線程執行完後都沒有傳回值,隻有最後一種是帶傳回值的。

繼承Thread類

實作Runnable接口

應用程式可以使用Executor架構來建立線程池

  實作Runnable接口這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了别的對象的情況下,這需要多繼承(而Java不支援多繼承),隻能實作接口。同時,線程池也是非常高效的,很容易實作和使用。

11. java中實作同步(線程安全的方法)

  在Java語言中,每一個對象有一把鎖。線程可以使用synchronized關鍵字來擷取對象上的鎖。synchronized關鍵字可應用在方法級别(粗粒度鎖)或者是代碼塊級别(細粒度鎖)。

   (1)同步方法 

    即有synchronized關鍵字修飾的方法。 

    由于java的每個對象都有一個内置鎖,當用此關鍵字修飾方法時, 

    内置鎖會保護整個方法。在調用該方法前,需要獲得内置鎖,否則就處于阻塞狀态。

    代碼如: 

    public synchronized void save(){}

   注: synchronized關鍵字也可以修飾靜态方法,此時如果調用該靜态方法,将會鎖住整個類

  (2)同步代碼塊 

    即有synchronized關鍵字修飾的語句塊。 

    被該關鍵字修飾的語句塊會自動被加上内置鎖,進而實作同步

    synchronized(object){ 

    }

    注:同步是一種高開銷的操作,是以應該盡量減少同步的内容。 

    通常沒有必要同步整個方法,使用synchronized代碼塊同步關鍵代碼即可。 

  (3)使用特殊域變量(volatile)實作線程同步 

    a.volatile關鍵字為域變量的通路提供了一種免鎖機制, 

    c.是以每次使用該域就要重新計算,而不是使用寄存器中的值 

    d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變量 

  (4)使用局部變量實作線程同步 

    如果使用ThreadLocal管理變量,則每一個使用該變量的線程都獲得該變量的副本, 

    副本之間互相獨立,這樣每一個線程都可以随意修改自己的變量副本,而不會對其他線程産生影響。

    ThreadLocal 類的常用方法

    ThreadLocal() : 建立一個線程本地變量 

    get() : 傳回此線程局部變量的目前線程副本中的值 

    initialValue() : 傳回此線程局部變量的目前線程的"初始值" 

    set(T value) : 将此線程局部變量的目前線程副本中的值設定為value

12.java中實作PV操作