Java研發方向如何準備BAT技術面試答案

1.面向對象和麪向過程的區別 面向過程 優勢:性能比面向對象高,由於類調用時須要實例化,開銷比較大,比較消耗資源;好比單片機、嵌入式開發、Linux/Unix等通常採用面向過程開發,性能是最重要的因素。 缺點:沒有面向對象易維護、易複用、易擴展html

面向對象 優勢:易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統,使系統更加靈活、更加易於維護 缺點:性能比面向過程低java

2.Java的四個基本特性(抽象、封裝、繼承,多態) 抽象:就是把現實生活中的某一類東西提取出來,用程序代碼表示,咱們一般叫作類或者接口。抽象包括兩個方面:一個是數據抽象,一個是過程抽象。數據抽象也就是對象的屬性。過程抽象是對象的行爲特徵。 封裝:把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行封裝隱藏。封裝分爲屬性的封裝和方法的封裝。 繼承:是對有着共同特性的多類事物,進行再抽象成一個類。這個類就是多類事物的父類。父類的意義在於抽取多類事物的共性。 多態:容許不一樣類的對象對同一消息作出響應。方法的重載、類的覆蓋正體現了多態。程序員

3.重載和重寫的區別 重載:發生在同一個類中,方法名必須相同,參數類型不一樣、個數不一樣、順序不一樣,方法返回值和訪問修飾符能夠不一樣,發生在編譯時。 重寫:發生在父子類中,方法名、參數列表必須相同,返回值小於等於父類,拋出的異常小於等於父類,訪問修飾符大於等於父類;若是父類方法訪問修飾符爲private則子類中就不是重寫。算法

4.構造器Constructor是否可被override 構造器不能被重寫,不能用static修飾構造器,只能用 public private protected這三個權限修飾符,且不能有返回語句。sql

5.訪問控制符public,protected,private,以及默認的區別 private只有在本類中才能訪問; public在任何地方都能訪問; protected在同包內的類及包外的子類能訪問; 默認不寫在同包內能訪問。數據庫

6.是否能夠繼承String類 String類是final類故不能夠繼承,一切由final修飾過的都不能繼承編程

7.String和StringBuffer、StringBuilder的區別 可變性: String類中使用字符數組保存字符串,private final char value[],因此string對象是不可變的。 StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,char[] value,這兩種對象都是可變的。 線程安全性: String中的對象是不可變的,也就能夠理解爲常量,線程安全。 AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操做,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,因此是線程安全的。StringBuilder並無對方法進行加同步鎖,因此是非線程安全的。 性能: 每次對String 類型進行改變的時候,都會生成一個新的 String 對象,而後將指針指向新的 String 對象。StringBuffer每次都會對 StringBuffer 對象自己進行操做,而不是生成新的對象並改變對象引用。相同狀況下使用 StirngBuilder 相比使用 StringBuffer 僅能得到 10%~15% 左右的性能提高,但卻要冒多線程不安全的風險。跨域

8.hashCode和equals方法的關係 equals相等,hashcode必相等;hashcode相等,equals可能不相等。數組

9.抽象類和接口的區別 語法層次: 抽象類和接口分別給出了不一樣的語法定義 設計層次: 抽象層次不一樣,抽象類是對類抽象,而接口是對行爲的抽象。抽象類是對整個類總體進行抽象,包括屬性、行爲,可是接口倒是對類局部(行爲)進行抽象。 跨域不一樣,抽象類所體現的是一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在"is-a" 關係,即父類和派生類在概念本質上應該是相同的。對於接口則否則,並不要求接口的實現者和接口定義在概念本質上是一致的,僅僅是實現了接口定義的契約而已,"like-a"的關係。。 設計層次不一樣,抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。緩存

10.自動裝箱與拆箱 裝箱:將基本類型用它們對應的引用類型包裝起來; 拆箱:將包裝類型轉換爲基本數據類型; Java使用自動裝箱和拆箱機制,節省了經常使用數值的內存開銷和建立對象的開銷,提升了效率,由編譯器來完成,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動做。

11.什麼是泛型、爲何要使用以及泛型擦除 泛型,即「參數化類型」。 建立集合時就指定集合元素的類型,該集合只能保存其指定類型的元素,避免使用強制類型轉換。 Java編譯器生成的字節碼是不包涵泛型信息的,泛型類型信息將在編譯處理是被擦除,這個過程即類型擦除。 泛型擦除能夠簡單的理解爲將泛型java代碼轉換爲普通java代碼,只不過編譯器更直接點,將泛型java代碼直接轉換成普通java字節碼。 類型擦除的主要過程以下: 一.將全部的泛型參數用其最左邊界(最頂級的父類型)類型替換。 二.移除全部的類型參數。

12.Java中的集合類及關係圖 List和Set繼承自Collection接口。 Set無序不容許元素重複。HashSet和TreeSet是兩個主要的實現類。 List有序且容許元素重複。ArrayList、LinkedList和Vector是三個主要的實現類。 Map也屬於集合系統,但和Collection接口不要緊。Map是key對value的映射集合,其中key列就是一個集合。key不能重複,可是value能夠重複。 HashMap、TreeMap和Hashtable是三個主要的實現類。 SortedSet和SortedMap接口對元素按指定規則排序,SortedMap是對key列進行排序。

13.HashMap實現原理 具體原理一句兩句也說不清楚,網絡文章: zhangshixi.iteye.com/blog/672697 www.admin10000.com/document/33…

14.HashTable實現原理 具體原理一句兩句也說不清楚,網絡文章: www.cnblogs.com/skywang1234… blog.csdn.net/chdjj/artic…

15.HashMap和HashTable區別 一.HashTable的方法前面都有synchronized來同步,是線程安全的;HashMap未經同步,是非線程安全的。 二.HashTable不容許null值(key和value都不能夠) ;HashMap容許null值(key和value均可以)。 三.HashTable有一個contains(Object value)功能和containsValue(Object value)功能同樣。 四.HashTable使用Enumeration進行遍歷;HashMap使用Iterator進行遍歷。 五.HashTable中hash數組默認大小是11,增長的方式是 old*2+1;HashMap中hash數組的默認大小是16,並且必定是2的指數。 六.哈希值的使用不一樣,HashTable直接使用對象的hashCode; HashMap從新計算hash值,並且用與代替求模。

16.ArrayList和vector區別 ArrayList和 Vector都實現了List接口, 都是經過數組實現的。 Vector是線程安全的,而ArrayList是非線程安全的。 List第一次建立的時候,會有一個初始大小,隨着不斷向List中增長元素,當 List 認爲容量不夠的時候就會進行擴容。Vector缺省狀況下自動增加原來一倍的數組長度,ArrayList增加原來的50%。

17.ArrayList和LinkedList區別及使用場景 ArrayList底層是用數組實現的,能夠認爲ArrayList是一個可改變大小的數組。隨着愈來愈多的元素被添加到ArrayList中,其規模是動態增長的。 LinkedList底層是經過雙向鏈表實現的, LinkedList和ArrayList相比,增刪的速度較快。可是查詢和修改值的速度較慢。同時,LinkedList還實現了Queue接口,因此他還提供了offer(), peek(), poll()等方法。 LinkedList更適合從中間插入或者刪除(鏈表的特性)。 ArrayList更適合檢索和在末尾插入或刪除(數組的特性)。

18.Collection和Collections的區別 java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操做的通用接口方法。Collection接口在Java 類庫中有不少具體的實現。Collection接口的意義是爲各類具體的集合提供了最大化的統一操做方式。 java.util.Collections 是一個包裝類。它包含有各類有關集合操做的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架。

19.Concurrenthashmap實現原理 具體原理一句兩句也說不清楚,網絡文章: www.cnblogs.com/ITtangtang/… ifeve.com/concurrenth…

20.Error、Exception區別 Error類和Exception類的父類都是throwable類,他們的區別是: Error類通常是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。對於這類錯誤的致使的應用程序中斷,僅靠程序自己沒法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。 Exception類表示程序能夠處理的異常,能夠捕獲且可能恢復。遇到這類異常,應該儘量處理異常,使程序恢復運行,而不該該隨意終止異常。

21.Unchecked Exception和Checked Exception,各列舉幾個 Unchecked Exception: a. 指的是程序的瑕疵或邏輯錯誤,而且在運行時沒法恢復。 b. 包括Error與RuntimeException及其子類,如:OutOfMemoryError, UndeclaredThrowableException, IllegalArgumentException, IllegalMonitorStateException, NullPointerException, IllegalStateException, IndexOutOfBoundsException等。 c. 語法上不須要聲明拋出異常。

Checked Exception: a. 表明程序不能直接控制的無效外界狀況(如用戶輸入,數據庫問題,網絡異常,文件丟失等) b. 除了Error和RuntimeException及其子類以外,如:ClassNotFoundException, NamingException, ServletException, SQLException, IOException等。 c. 須要try catch處理或throws聲明拋出異常。

22.Java中如何實現代理機制(JDK、CGLIB) JDK動態代理:代理類和目標類實現了共同的接口,用到InvocationHandler接口。 CGLIB動態代理:代理類是目標類的子類, 用到MethodInterceptor接口

23.多線程的實現方式 繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。

24.線程的狀態轉換

25.如何中止一個線程 這個問題簡單總結不必定說的清,看一篇網絡文章: www.cnblogs.com/greta/p/562…

26.什麼是線程安全 線程安全就是多線程訪問同一代碼,不會產生不肯定的結果。

27.如何保證線程安全 對非安全的代碼進行加鎖控制; 使用線程安全的類; 多線程併發狀況下,線程共享的變量改成方法級的局部變量。

28.Synchronized如何使用 synchronized是Java中的關鍵字,是一種同步鎖。它修飾的對象有如下幾種: 一. 修飾一個代碼塊,被修飾的代碼塊稱爲同步語句塊,其做用的範圍是大括號{}括起來的代碼,做用的對象是調用這個代碼塊的對象; 二. 修飾一個方法,被修飾的方法稱爲同步方法,其做用的範圍是整個方法,做用的對象是調用這個方法的對象; 三. 修改一個靜態的方法,其做用的範圍是整個靜態方法,做用的對象是這個類的全部對象; 四. 修改一個類,其做用的範圍是synchronized後面括號括起來的部分,做用主的對象是這個類的全部對象。

29.synchronized和Lock的區別 主要相同點:Lock能完成synchronized所實現的全部功能 主要不一樣點:Lock有比synchronized更精確的線程語義和更好的性能。Lock的鎖定是經過代碼實現的,而synchronized是在JVM層面上實現的,synchronized會自動釋放鎖,而Lock必定要求程序員手工釋放,而且必須在finally從句中釋放。Lock還有更強大的功能,例如,它的tryLock方法能夠非阻塞方式去拿鎖。Lock鎖的範圍有侷限性,塊範圍,而synchronized能夠鎖住塊、對象、類。

30.多線程如何進行信息交互 void notify() 喚醒在此對象監視器上等待的單個線程。 void notifyAll() 喚醒在此對象監視器上等待的全部線程。 void wait() 致使當前的線程等待,直到其餘線程調用此對象的notify()方法或notifyAll()方法。 void wait(long timeout) 致使當前的線程等待,直到其餘線程調用此對象的notify()方法或notifyAll()方法,或者超過指定的時間量。 void wait(long timeout, int nanos) 致使當前的線程等待,直到其餘線程調用此對象的notify()方法或notifyAll()方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。

31.sleep和wait的區別(考察的方向是是否會釋放鎖) sleep()方法是Thread類中方法,而wait()方法是Object類中的方法。 sleep()方法致使了程序暫停執行指定的時間,讓出cpu該其餘線程,可是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態,在調用sleep()方法的過程當中,線程不會釋放對象鎖。而當調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法後本線程才進入對象鎖定池準備

32.多線程與死鎖 死鎖是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象,若無外力做用,它們都將沒法推動下去。 產生死鎖的緣由: 一.由於系統資源不足。 二.進程運行推動的順序不合適。 三.資源分配不當。

33.如何才能產生死鎖 產生死鎖的四個必要條件: 一.互斥條件:所謂互斥就是進程在某一時間內獨佔資源。 二.請求與保持條件:一個進程因請求資源而阻塞時,對已得到的資源保持不放。 三.不剝奪條件:進程已得到資源,在末使用完以前,不能強行剝奪。 四.循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。

34.死鎖的預防 打破產生死鎖的四個必要條件中的一個或幾個,保證系統不會進入死鎖狀態。 一.打破互斥條件。即容許進程同時訪問某些資源。可是,有的資源是不容許被同時訪問的,像打印機等等,這是由資源自己的屬性所決定的。因此,這種辦法並沒有實用價值。 二.打破不可搶佔條件。即容許進程強行從佔有者那裏奪取某些資源。就是說,當一個進程已佔有了某些資源,它又申請新的資源,但不能當即被知足時,它必須釋放所佔有的所有資源,之後再從新申請。它所釋放的資源能夠分配給其它進程。這就至關於該進程佔有的資源被隱蔽地強佔了。這種預防死鎖的方法實現起來困難,會下降系統性能。 三.打破佔有且申請條件。能夠實行資源預先分配策略。即進程在運行前一次性地向系統申請它所須要的所有資源。若是某個進程所需的所有資源得不到知足,則不分配任何資源,此進程暫不運行。只有當系統可以知足當前進程的所有資源需求時,才一次性地將所申請的資源所有分配給該進程。因爲運行的進程已佔有了它所需的所有資源,因此不會發生佔有資源又申請資源的現象,所以不會發生死鎖。 四.打破循環等待條件,實行資源有序分配策略。採用這種策略,即把資源事先分類編號,按號分配,使進程在申請,佔用資源時不會造成環路。全部進程對資源的請求必須嚴格按資源序號遞增的順序提出。進程佔用了小號資源,才能申請大號資源,就不會產生環路,從而預防了死鎖。

35.什麼叫守護線程,用什麼方法實現守護線程 守護線程是爲其餘線程的運行提供服務的線程。 setDaemon(boolean on)方法能夠方便的設置線程的Daemon模式,true爲守護模式,false爲用戶模式。

36.Java線程池技術及原理 這個有點長,仍是看一篇文章吧: www.importnew.com/19011.html www.cnblogs.com/dolphin0520…

37.java併發包concurrent及經常使用的類 這個內容有點多,須要仔細看: 併發包諸類概覽:www.raychase.net/1912 線程池:www.cnblogs.com/dolphin0520… 鎖:www.cnblogs.com/dolphin0520… 集合:www.cnblogs.com/huangfox/ar…

38.volatile關鍵字 用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改後的最的值。volatile很容易被誤用,用來進行原子性操做。 Java語言中的volatile變量能夠被看做是一種 「程度較輕的 synchronized」;與 synchronized 塊相比,volatile 變量所需的編碼較少,而且運行時開銷也較少,可是它所能實現的功能也僅是synchronized的一部分。鎖提供了兩種主要特性:互斥(mutual exclusion)和可見性(visibility)。互斥即一次只容許一個線程持有某個特定的鎖,所以可以使用該特性實現對共享數據的協調訪問協議,這樣,一次就只有一個線程可以使用該共享數據。可見性必須確保釋放鎖以前對共享數據作出的更改對於隨後得到該鎖的另外一個線程是可見的,若是沒有同步機制提供的這種可見性保證,線程看到的共享變量多是修改前的值或不一致的值,這將引起許多嚴重問題。Volatile變量具備synchronized的可見性特性,可是不具有原子特性。這就是說線程可以自動發現 volatile 變量的最新值。 要使volatile變量提供理想的線程安全,必須同時知足下面兩個條件:對變量的寫操做不依賴於當前值;該變量沒有包含在具備其餘變量的不變式中。 第一個條件的限制使volatile變量不能用做線程安全計數器。雖然增量操做(x++)看上去相似一個單獨操做,實際上它是一個由讀取-修改-寫入操做序列組成的組合操做,必須以原子方式執行,而volatile不能提供必須的原子特性。實現正確的操做須要使 x 的值在操做期間保持不變,而 volatile 變量沒法實現這點。 每個線程運行時都有一個線程棧,線程棧保存了線程運行時候變量值信息。當線程訪問某一個對象時候值的時候,首先經過對象的引用找到對應在堆內存的變量的值,而後把堆內存變量的具體值load到線程本地內存中,創建一個變量副本,以後線程就再也不和對象在堆內存變量值有任何關係,而是直接修改副本變量的值,在修改完以後的某一個時刻(線程退出以前),自動把線程變量副本的值回寫到對象在堆中變量。這樣在堆中的對象的值就產生變化了。

read and load 從主存複製變量到當前工做內存 use and assign 執行代碼,改變共享變量值 store and write 用工做內存數據刷新主存相關內容 其中use and assign 能夠屢次出現,可是這一些操做並非原子性,也就是 在read load以後,若是主內存count變量發生修改以後,線程工做內存中的值因爲已經加載,不會產生對應的變化,因此計算出來的結果會和預期不同。

39.Java中的NIO,BIO,AIO分別是什麼

BIO:同步並阻塞,服務器實現模式爲一個鏈接一個線程,即客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理,若是這個鏈接不作任何事情會形成沒必要要的線程開銷,固然能夠經過線程池機制改善。BIO方式適用於鏈接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4之前的惟一選擇,但程序直觀簡單易理解。 NIO:同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的鏈接請求都會註冊到多路複用器上,多路複用器輪詢到鏈接有I/O請求時才啓動一個線程進行處理。NIO方式適用於鏈接數目多且鏈接比較短(輕操做)的架構,好比聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。 AIO:異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理.AIO方式使用於鏈接數目多且鏈接比較長(重操做)的架構,好比相冊服務器,充分調用OS參與併發操做,編程比較複雜,JDK7開始支持。

40.IO和NIO區別 一.IO是面向流的,NIO是面向緩衝區的。 二.IO的各類流是阻塞的,NIO是非阻塞模式。 三.Java NIO的選擇器容許一個單獨的線程來監視多個輸入通道,你能夠註冊多個通道使用一個選擇器,而後使用一個單獨的線程來「選擇」通道:這些通道里已經有能夠處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。

41.序列化與反序列化 把對象轉換爲字節序列的過程稱爲對象的序列化。 把字節序列恢復爲對象的過程稱爲對象的反序列化。 對象的序列化主要有兩種用途: 一.把對象的字節序列永久地保存到硬盤上,一般存放在一個文件中; 二.在網絡上傳送對象的字節序列。 當兩個進程在進行遠程通訊時,彼此能夠發送各類類型的數據。不管是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方須要把這個Java對象轉換爲字節序列,才能在網絡上傳送;接收方則須要把字節序列再恢復爲Java對象。

42.常見的序列化協議有哪些 Protobuf, Thrift, Hessian, Kryo

43.內存溢出和內存泄漏的區別 內存溢出是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory。 內存泄漏是指分配出去的內存再也不使用,可是沒法回收。

44.Java內存模型及各個區域的OOM,如何重現OOM 這部份內容很重要,詳細閱讀《深刻理解Java虛擬機》,也能夠詳細閱讀這篇網絡文章http://hllvm.group.iteye.com/group/wiki/2857-JVM

45.出現OOM如何解決 一. 可經過命令按期抓取heap dump或者啓動參數OOM時自動抓取heap dump文件。 二. 經過對比多個heap dump,以及heap dump的內容,分析代碼找出內存佔用最多的地方。 三. 分析佔用的內存對象,是不是由於錯誤致使的內存未及時釋放,或者數據過多致使的內存溢出。

46.用什麼工具能夠查出內存泄漏 一. Memory Analyzer-是一款開源的JAVA內存分析軟件,查找內存泄漏,能容易找到大塊內存並驗證誰在一直佔用它,它是基於Eclipse RCP(Rich Client Platform),能夠下載RCP的獨立版本或者Eclipse的插件。 二. JProbe-分析Java的內存泄漏。 三. JProfiler-一個全功能的Java剖析工具,專用於分析J2SE和J2EE應用程序。它把CPU、執行緒和內存的剖析組合在一個強大的應用中,GUI能夠找到效能瓶頸、抓出內存泄漏、並解決執行緒的問題。 四. JRockit-用來診斷Java內存泄漏並指出根本緣由,專門針對Intel平臺並獲得優化,能在Intel硬件上得到最高的性能。 五. YourKit .NET & Java Profiling業界領先的Java和.NET程序性能分析工具。 六. AutomatedQA -AutomatedQA的獲獎產品performance profiling和memory debugging工具集的下一代替換產品,支持Microsoft, Borland, Intel, Compaq 和 GNU編譯器。能夠爲.NET和Windows程序生成全面細緻的報告,從而幫助您輕鬆隔離並排除代碼中含有的性能問題和內存/資源泄露問題。支持.Net 1.0,1.1,2.0,3.0和Windows 32/64位應用程序。 七. Compuware DevPartner Java Edition-包含Java內存檢測,代碼覆蓋率測試,代碼性能測試,線程死鎖,分佈式應用等幾大功能模塊

47.Java內存管理及回收算法 閱讀這篇文章:www.cnblogs.com/hnrainll/ar…

48.Java類加載器及如何加載類(雙親委派) 閱讀文章:www.ibm.com/developerwo… (推薦) 或http://blog.csdn.net/zhoudaxia/article/details/35824249

49.xml解析方式 一.DOM(JAXP Crimson解析器) 二.SAX 三.JDOM 四.DOM4J 區別: 一.DOM4J性能最好,連Sun的JAXM也在用DOM4J。目前許多開源項目中大量採用DOM4J,例如大名鼎鼎的hibernate也用DOM4J來讀取XML配置文件。若是不考慮可移植性,那就採用DOM4J. 二.JDOM和DOM在性能測試時表現不佳,在測試10M文檔時內存溢出。在小文檔狀況下還值得考慮使用DOM和JDOM。雖然JDOM的開發者已經說明他們指望在正式發行版前專一性能問題,可是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM還是一個很是好的選擇。DOM實現普遍應用於多種編程語言。它仍是許多其它與XML相關的標準的基礎,由於它正式得到W3C推薦(與基於非標準的Java模型相對),因此在某些類型的項目中可能也須要它(如在JavaScript中使用DOM)。 三.SAX表現較好,這要依賴於它特定的解析方式-事件驅動。一個SAX檢測即將到來的XML流,但並無載入到內存(固然當XML流被讀入時,會有部分文檔暫時隱藏在內存中)。

50.Statement和PreparedStatement之間的區別 一.PreparedStatement是預編譯的,對於批量處理能夠大大提升效率. 也叫JDBC存儲過程 二.使用 Statement 對象。在對數據庫只執行一次性存取的時侯,用 Statement 對象進行處理。PreparedStatement 對象的開銷比Statement大,對於一次性操做並不會帶來額外的好處。 三.statement每次執行sql語句,相關數據庫都要執行sql語句的編譯,preparedstatement是預編譯得, preparedstatement支持批處理 四.代碼片斷1: String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE ′Colombian′"; stmt.executeUpdate(updateString); 代碼片斷2: PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? "); updateSales.setInt(1, 75); updateSales.setString(2, "Colombian"); updateSales.executeUpdate(); 片段2和片段1的區別在於,後者使用了PreparedStatement對象,而前者是普通的Statement對象。PreparedStatement對象不只包含了SQL語句,並且大多數狀況下這個語句已經被預編譯過,於是當其執行時,只需DBMS運行SQL語句,而沒必要先編譯。當你須要執行Statement對象屢次的時候,PreparedStatement對象將會大大下降運行時間,固然也加快了訪問數據庫的速度。 這種轉換也給你帶來很大的便利,沒必要重複SQL語句的句法,而只需更改其中變量的值,即可從新執行SQL語句。選擇PreparedStatement對象與否,在於相同句法的SQL語句是否執行了屢次,並且兩次之間的差異僅僅是變量的不一樣。若是僅僅執行了一次的話,它應該和普通的對象毫無差別,體現不出它預編譯的優越性。 五.執行許多SQL語句的JDBC程序產生大量的Statement和PreparedStatement對象。一般認爲PreparedStatement對象比Statement對象更有效,特別是若是帶有不一樣參數的同一SQL語句被屢次執行的時候。PreparedStatement對象容許數據庫預編譯SQL語句,這樣在隨後的運行中能夠節省時間並增長代碼的可讀性。 然而,在Oracle環境中,開發人員實際上有更大的靈活性。當使用Statement或PreparedStatement對象時,Oracle數據庫會緩存SQL語句以便之後使用。在一些狀況下,因爲驅動器自身須要額外的處理和在Java應用程序和Oracle服務器間增長的網絡活動,執行PreparedStatement對象實際上會花更長的時間。 然而,除了緩衝的問題以外,至少還有一個更好的緣由使咱們在企業應用程序中更喜歡使用PreparedStatement對象,那就是安全性。傳遞給PreparedStatement對象的參數能夠被強制進行類型轉換,使開發人員能夠確保在插入或查詢數據時與底層的數據庫格式匹配。 當處理公共Web站點上的用戶傳來的數據的時候,安全性的問題就變得極爲重要。傳遞給PreparedStatement的字符串參數會自動被驅動器忽略。最簡單的狀況下,這就意味着當你的程序試着將字符串「D'Angelo」插入到VARCHAR2中時,該語句將不會識別第一個「,」,從而致使悲慘的失敗。幾乎不多有必要建立你本身的字符串忽略代碼。 在Web環境中,有惡意的用戶會利用那些設計不完善的、不能正確處理字符串的應用程序。特別是在公共Web站點上,在沒有首先經過PreparedStatement對象處理的狀況下,全部的用戶輸入都不該該傳遞給SQL語句。此外,在用戶有機會修改SQL語句的地方,如HTML的隱藏區域或一個查詢字符串上,SQL語句都不該該被顯示出來。

若是想學習Java工程化、高性能及分佈式、深刻淺出。性能調優、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級程序員羣:180705916,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

相關文章
相關標籤/搜索