Java程序員面試寶典1 ---Java基礎部分(該博文爲原創,轉載請註明出處)

 (該博文爲原創,轉載請註明出處   http://www.cnblogs.com/luyijoy/  by白手伊凡)java

1.    基本概念

1)         Java爲解釋性語言,運行過程:程序源代碼通過Java編譯器編譯成字節碼,而後用JVM解釋執行算法

2)         Java語言提供垃圾回收機制(GC),不須要程序顯式地管理內存分配,引入finalize()方法會在回收前首先調用sql

3)         main是JVM程序識別的入口方法,public、static可互換順序,main()方法可用final、synchronized來修飾數據庫

4)         Java程序初始化代碼塊順序:父類靜態變量 > 父類靜態代碼塊 > 子類靜態變量 > 子類靜態代碼塊 > 父類非靜態變量 > 父類非靜態代碼塊 > 父類構造函數 > 子類非靜態非靜態變量 > 子類非靜態代碼塊 > 子類構造函數express

5)         Java變量類型:成員變量、靜態變量、局部變量編程

6)         成員變量做用域設計模式

做用域與可見性數組

當前類緩存

同package安全

子類

其餘package

public

protected

 

default

 

 

private

 

 

 

7)         Java中經常使用標識接口Cloneable和Serializable,該類接口內沒有任何方法聲明僅做標識做用

8)         clone()方法,淺複製與深複製:

淺複製僅考慮複製對象的值,沒必要考慮引用對象

深複製不只複製了對象的值,並且複製了引用對象

9)         反射機制容許程序運行時自我檢查同時可以對內存成員進行操做。獲取class類的三種方法:class.forName();類名.class;實例.getClass()

10)     Java建立對象的方式四種:new語句實例化對象;反射機制建立;clone()方法複製建立;反序列化建立

2.    面向對象技術

1)         面向對象特性:抽象、封裝、繼承、多態

2)         Java語言支持單繼承

3)         多態實現方式:方法的重載和方法的覆蓋

4)         抽象類和接口的異同:

相同點:

都不能被實例化。

接口的實現類和抽象的子類都只有實現了接口或抽象類中的方法後才能實現實例化。

差別:

接口只能定義其方法不能實現,抽象類能夠定義與實現。

接口須要implement實現,抽象類須要extends繼承

接口成員變量默認public static final其成員方法爲public、abstract,抽象類成員變量默認default可自定義,抽象方法不能用private、synchronized、native修飾。

5)         內部類包括四種:靜態內部類、成員內部類、局部內部類、匿名內部類

6)         使用getClass().getName()獲取父類類名

7)         this指向當前實例對象

class People{

         String name;

         public People(String name){

         //這裏的this.name表示成員變量,name表示形式參數

         this.name=name;

         }

}

3.    關鍵字

1)         命名規則:標識符爲大小寫字母、數字、下劃線及$,且第一個字符必須是字母、下劃線或$。

2)         break、continue及return

3)         final、finally及finalize

final:聲明屬性、方法和類

finally:異常處理中使用

fianlize:是Object類的一個方法,垃圾回收機制中使用

4)         assert斷言,軟件調試方法,表達方式:assert expression1和assert experssion1:experssion2,其中experssion1爲boolean型,experssion2爲基本類型或對象

5)         static做用:分配存儲空間、直接調用方法

使用方式:成員變量、成員方法、代碼塊、內部類

6)         單例模式:

class Singleton{

         private static Singleton instance=null;

         private Singleton(){}

         public static Singleton getInstance(){

         if(instance==null){

                   instance=new Singleton();

                   }

         return instance;

         }

}

7)         switch(expr)中expr能夠是int或Integer及能被隱式轉換爲int類型的枚舉常量或整數表達式

8)         volatile是類型修飾符,它被設計用來修飾被不一樣線程訪問和修改的變量。被volatile定義的變量,系統每次使用它時都直接從對於的內存中提取,不使用緩存。使用volatile修飾成員變量後,因此線程在任什麼時候候所看到的變量值都是相同的。(儘可能不要使用)

9)         instanceof用來判斷引用類型的變量所指對象是不是一個類的實例。經常使用表達方式:result=object instanceof class。

10)     strictfp指精確浮點,用來確保浮點數運算的準確性,如public strictfp class Test

4.    基本類型與運算

1)         八種原始數據類型/基本數據類型:byte,short,int,long,double,float,char,boolea在棧上分配內存,其餘類型都是引用類型僅存儲內存地址不分配內存空間。(void也屬於基本類型,但沒法操做)1字節=8bit

類型

int

short

long

byte

float

double

char

boolean

大小

4

2

8

1

4

8

2

1

2)         不可變類型:全部的基本數據類型及String

3)         Java傳遞方式:值傳遞和引用傳遞

4)         不一樣數據類型轉換:自動轉換(低級->高級)和強制類型轉換

優先級byte < short < char < int < long < float <double

5)         運算符優先級

6)         Math方法中:round是四捨五入,ceil是向上取整,floor是向下取整

7)         >>有符號右移,>>>無符號右移(有符號正數高位補0,負數補1;無符號高位補0)

<<有符號左移,左移n位表示原來的值乘以2的n次方,m<<4表示m*16(低位補0)

8)         Java中使用Unicode編碼,每一個字符佔兩字節。String中英文1個字符,中文2個字符

5.    字符串與數組

1)         String存儲機制,JVM中存在字符串鏈接池,其中保存許多String對象而且能夠共享使用。例如:

String  s1=」abc」;  //在常量區裏面存放一個」abc」字符串

String  s2=」abc」;  //s2引用常量區中的對象,所以不會建立新的對象

String  s3=new String(「abc」); //在堆中建立新的對象

String  s4=new String(「abc」); //在堆中又建立了一個新的對象

其中new String(「abc」);若常量區有」abc」則只建立new String()堆對象,不然建立兩個對象

2)         「==」運算符用例比較兩個變量的值是否相等

equals()是Object提供的方法,比較引用。它能夠被覆蓋,因此可經過覆蓋的方法比較數據內容。

hasCode()方法從Object類中繼承過來,該方法返回對象在內存中地址轉換成int值,若沒有重寫hasCode()方法,任何對象的hasCode()都是不等的。

3)         Character用於單字符操做,String字符串不可變類,StringBuffer字符串可變類,StringBuilser()字符串可變類。其中StringBuffer和StringBuillder()都是字符串緩衝區,StringBuilder線程不安全,單線程效率高。

執行效率:StringBuilder > StringBuffer > String

小型數據量採用String,單線程考慮StringBuilder,多線程大量數據採用StringBuffer。

String s1=」abc」;   String s1=new String(「abc」);

StringBuffer s1=new StringBuffer(「abc」);

4)         length()方法計算字符串長度,length屬性用來獲取數組長度,size()方法針對泛型集合查看泛型中有多少個元素

6.    異常處理

1)         finally塊在Java語言異常處理中必定會被執行,finally塊代碼必定在return以前執行。但,當程序進入try語句塊以前就出現異常時,程序會直接結束從而不執行finally塊;當程序在try塊中強制退出時也不會執行finally塊中的代碼。強制退出:System.exit(0);

2)         Java將異常當作對象處理,並定義一個基類(java.lang.Throwable)做爲因此異常的父類。異常分爲Error(錯誤)和Exception(異常)兩類。

違反語義的異常分爲Java類庫內置語義檢查如:IndexOutOfBoundsException、NullPointerException;開發人員擴展語義檢查,建立本身的異常類,自由選擇合適用throw拋出。

3)         Error表示程序運行期間出現不可恢復的錯誤,屬於JVM級嚴重錯誤,程序終止執行,如OutOfMemoryError、ThreadDeath

Exception可恢復異常,編譯器可捕獲,包含檢查異常(IO異常、SQL異常,發生在編譯階段,編譯器強制捕獲並處理)和運行時異常(編譯器沒有強制捕獲並處理,異常由JVM來處理,NullPointException空指針異常、ClassCastException類型轉換異常、ArrayIndexOutOfBoundsException數組越界異常、ArrayStoreException數組存儲異常、BufferOverflowException緩衝區溢出異常、ArithmeticException算術異常)。

7.    輸入輸出流

1)         流可分爲字符流和字節流,字節流以字節(8bit)爲單位包含InputStream和OutputStream,字符流以字符爲單位(16bit)包括Reader和Writer。

Java IO採用Decorator裝飾者設計模式

2)         Socket套接字,能夠用來實現不一樣虛擬機或不一樣計算機之間的通訊,Socket分爲兩種:面向鏈接的Socket通訊協議(TCP,傳輸控制協議)、面向無鏈接的Socket通訊協議(UDP,用戶數據報協議),任何一個Socket都是由IP地址和端口號惟一肯定的。

Socket生命週期:打開Socket、使用Socket收發數據和關閉Socket。

在Java中,使用ServerSocket做爲服務器端,Socket做爲客戶端來實現網絡通訊。

3)         Java NIO是面向緩衝的非阻塞IO適用於I/O讀寫。NIO經過Selector、Channel和Buffer來實現。NIO非阻塞的實現採用了Reactor反應器設計模式,(該模式與Observer觀察者模式相似,但Observer只能處理一個事件源,Reactor能處理多個事件源)

Channel被看作一個雙向的非阻塞通道,通道兩邊可進行數據讀寫操做;Selector實現用一個線程來管理多個通道,相似觀察者;Buffer用來保存數據。

NIO在網絡編程中相比Socket提升了效率

4)         Java持久化模式:序列化、外部序列化

序列化是一種將對象以一連串的字節描述的過程,用於解決在對對象流進行讀寫操做時所引起的問題。序列化可將對象的狀態寫在流裏進行網絡傳輸,或者保存到文件、數據庫等系統裏,並在須要時把該流讀取出來從新構造一個相同的對象。序列化要實現Serializable接口,該接口位於java.lang包中,裏面不包含任何方法。(反序列化:將流轉化爲對象)

外部序列化:EXternalizable接口中的讀寫方法必須由開發人員實現。

相比較序列化更靈活,編程難度較大

8.    Java平臺與內存管理

1)         .java文件被javac指令編譯爲.class後綴的字節碼文件,再由JVM執行。Java程序被編譯後生成了一個「中間碼」,不一樣硬件平臺上按照不一樣JVM,由JVM負責把「中間碼」翻譯成硬件平臺能執行的代碼。解釋執行過程:代碼裝入、代碼校驗、代碼執行

2)         類的加載方式:隱式和顯式。隱式採用new的方式,顯式調用class.forName()方法加載到JVM中。

3)         垃圾回收GC,它回收程序中再也不使用的內存。經常使用垃圾回收算法:引用計數算法、追蹤回收算法、壓縮回收算法、複製回收算法、按代回收算法。

在Java中開發人員不能實時地調用垃圾回收器對某個對象或全部對象進行垃圾回收,但可經過System.gc()方法「通知」垃圾回收器運行。該方法的執行會中止全部響應,去檢查內存中是否有可回收對象,對程序正常運行和性能形成巨大威脅,不推薦使用。

4)         判斷內存空間是否符合垃圾回收標準:給對象賦予了空值null,之後沒有再使用過;給對象賦予新值,從新分配了內存空間。

5)         內存泄漏:在堆中申請的空間沒有被釋放;對象再也不使用,但仍在內存中保留着。因爲垃圾回收機制能有效解決第一種,因此Java語言中的內存泄漏主要指第2中狀況。

6)         內存泄漏緣由:

靜態集合類,它們的生命週期與程序一致,在程序結束前不能被釋放;

各類鏈接,鏈接在close()關閉後纔會回收對於的對象,若不顯示關閉則沒法回收;

監聽器,應用中用到多個監聽器,打在釋放對象的同時沒有相應地刪除監聽器;

變量不合理的做用域,變量的做用範圍大於實用範圍,沒有及時將對象設置爲null

7)         堆和棧:

棧內存用來存放基本數據類型與引用變量;堆內存用來存放運行時建立的對象(new對象)

棧的存儲速度更快,堆能夠在運行時動態地分配內存。

9.    容器

1)         Java Collections框架提供了List列表、Queue隊列、Set集合、Stack棧、Map映射表,其中List、Queue、Set、Stack繼承自Collection接口

2)         Set:集合內的元素不能重複,每一個元素定義equals確保對象惟一性。實現類:HashSet和TreeSet,其中TreeSet實現了SortedSet接口,該容器元素有序

3)         List按對象進入順序保存,容許重複對象。包括LinkedList、ArrayList、Vector實現類

4)         Map提供了一個從鍵映射到值的數據結構,包括HashMap、TreeMap、LinkedMap、WeakHashMap和IdentityHashMap。

5)         迭代器是一個對象,用來遍歷並選擇序列中的對象。

a.使用容器的iteractor()方法返回一個Iteractor,而後經過Iteractor的next()方法返回第一個元素

b.使用Iteractor的hasNext()方法判斷容器中是否還有元素

c.可經過remove()方法刪除迭代器返回的元素

6)         ArrayList、Vector、LinkedList類均在java.util包中,可動態改變長度的數組。ArrayList和Vector數據存儲連續,可經過下標訪問。ArrayList是非同步的,而Vector的絕大多數(add、insert、remove、set、equals、hascode)都是同步的,所以Vector是線程安全的。LinkedList採用雙向列表實現,對數據的索引要從列表頭開始遍歷,訪問效率低,插入效率高,非線程安全的。

數據主要操做時索引或末端增長刪除數據採用ArrayList;在數據指定位置插入或刪除時選取LinkedList;多線程是選用Vector安全。

7)         java.util.Map中HashMap、HashTable和TreeMap。

HashMap容許空值,HashTable不容許,HashTable線程安全,HashMap不支持線程同步不是線程安全的。HashMap效率高於HashTable,

8)         Collection是集合接口,提供對集合對象進行基本操做的通用接口方法,實現該接口的類主要由List和Set。

Collections是針對集合類的一個包裝類,它提供一系列靜態方法,其中大多數方法是用來處理線性表

10.         多線程

1)         線程四種狀態:運行、就緒、掛起和結束,多線程可減小程序響應時間、開銷小、高效利用CPU資源、簡化程序

2)         Java多線程實現方式:

繼承Thread類,重寫run()方法(不帶返回值)

實現Runnable接口,實現run()方法(不帶返回值):自定義Runnable接口實現run方法,建立Thread對象並實例化,調用Thread的start方法。

實現Callable接口,重寫call()方法(帶返回值)

3)         run()和Start()方法的區別

系統調用線程類的start()方法來啓動一個線程,此時線程處於就緒狀態,能夠被JVM來執行。在調度中JVM經過調用線程類的run()方法完成實際操做。

若是直接調用run()方法,會被當作一個普通的函數調用,程序中仍是僅由主線程一個,即start()方法可以異步地調用run()方法。

4)         多線程同步方式:

synchronized方法;wait()方法與notify()方法(wait等待,notify喚醒);Lock

5)         sleep()和wait()

sleep()是線程用來控制自身的流程,時間一到自動甦醒,wait須要notify喚醒;

sleep()不會釋放鎖,wait()會釋放它所佔用的鎖;

wait必須在同步控制方法或同步語句塊中使用,sleep方法不限制位置

6)         sleep()和yield()

sleep()不考慮優先級所以低優先級有機會,yield會先運行高優先級;

線程執行sleep()後會轉入阻塞狀態,在指定時間內不會被執行,yield方法只是當前線程從新回到可執行狀態,有可能進入到可執行狀態後又立刻被執行。

7)         stop()和suspend()方法。

suspend()方法不會釋放鎖,在鎖恢復前不會被釋放(易發生死鎖)

stop()方法會釋放已鎖定的全部監視資源。

以上終止線程方法均不建議使用。

8)         終止線程方法:採用線程自行結束進入Dead狀態。

9)         synchronize和Lock的區別

synchronize使用Object對象自己的notify、wait、notifyAll機制,Lock使用Condition進行線程調度

用法:synchronize託管JVM執行,Lock須要顯式的代碼

性能:在資源競爭不激烈時synchronize優於ReetrantLock,在競爭激烈時synchronize性能降低過快,RenetrantLock性能不變

鎖機制:synchronize得到和釋放鎖都是在塊結構中,自動解鎖,Lock手動釋放

10)     線程:守護線程(服務線程)和用戶線程,守護線程優先級較低。若是用戶線程已經所有退出運行,只剩下守護線程,那麼JVM也就退出了。

垃圾回收器是典型守護線程,只要JVM啓動,它始終在運行,實施監控和管理系統中能夠被回收的資源

11)     join()方法的做用是讓調用該方法的線程在執行完run()方法後,再執行join方法後的代碼。即兩個線程合併,用於實現同步功能。

11.         Java數據庫操做

1)         JDBC訪問數據庫步驟:

a.加載JDBC驅動器

b.加載JDBC驅動

c.創建數據庫鏈接,取得Connection對象

d.創建Statement對象或PreparedStatement對象

e.執行SQL語句

f.訪問結果集ResultSet對象

g.依次關閉ResultSet、Ststement、PreparedStatement、Connection對象,釋放資源

2)         JDBC事務處理,通常經過commit()方法或rollback()方法結束事務的操做。其中commit()方法表示完成對事務的提交,rollback()方法表示完成事務回滾。兩種方法均位於java.sql.Connection類中。通常事務默認,自動調用commit()方法,不然調用rollback()方法。

3)         class.forName()方法是將類加載到JVM中,它返回一個與帶有給定字符名的類或接口相關的Class對象,而且JVM會加載這個類,同時JVM會執行該類的靜態代碼段。

4)         Statement、PreparedStatement和CallableStatement

Statement用於執行不帶參數的簡單SQL語句,並返回它所生成結果的對象,每次執行SQL語句時都要編譯SQL語句。

PreparedStatement相比Statement效率高(一次解析,再也不被編譯)、代碼可讀性、可維護性好、安全性高(能預防SQL注入)。(SQL注入是指經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器,達到執行惡意SQL命令的目的)

5)         少許數據可採用getString()等方法從ResultSet中獲取,大量數據使用getObject()方法。

6)         JDO是Java數據對象,用於存取某種數據倉庫中的對象的標準化API,開發人員能間接訪問數據庫。

7)         Hibernate是JDBC的封裝

相關文章
相關標籤/搜索