面試(三)

  • method:發送數據的方式; action:發給誰java

  • 單選框和複選框,name值必須相同,value值能夠不一樣 單選:type=radio 複選:type=checkboxweb

常見瀏覽器的內核:

  1. Trident內核:IE瀏覽器,360,搜狗瀏覽器等算法

  2. Gecko內核:Firefox瀏覽器數據庫

  3. Presto內核:Opera(原爲Presto內核,如今爲Blink)編程

  4. Webkit內核:Google Chrome數組

http常見的狀態碼有那些?

  • 200 - 請求成功瀏覽器

  • 301 - 資源(網頁等)被永久轉移到其它URL緩存

  • 404 - 請求的資源(網頁等)不存在tomcat

  • 500 - 內部服務器錯誤安全

Integer與int的區別

int是java提供的8種原始數據類型之一。Java爲每一個原始類型提供了封裝類,Integer是java爲int提供的封裝類。int的默認值爲0,而Integer的默認值爲null即Integer能夠區分出未賦值和值爲0的區別,int則沒法表達出未賦值的狀況,例如,要想表達出沒有參加考試和考試成績爲0的區別,則只能使用Integer。在JSP開發中,Integer的默認爲null,因此用el表達式在文本框中顯示時,值爲空白字符串,而int默認的默認值爲0,因此用el表達式在文本框中顯示時,結果爲0,因此,int不適合做爲web層的表單數據的類型。

②在Hibernate中,若是將OID定義爲Integer類型,那麼Hibernate就能夠根據其值是否爲null而判斷一個對象是不是臨時的,若是將OID定義爲了int類型,還須要在hbm映射文件中設置其unsaved-value屬性爲0。

③另外,Integer提供了多個與整數相關的操做方法,例如,將一個字符串轉換成整數,Integer中還定義了表示整數的最大值和最小值的常量。

Iterator和ListIterator的區別是什麼?

  • Iterator可用來遍歷Set和List集合,可是ListIterator只能用來遍歷List。

  • Iterator對集合只能是前向遍歷,ListIterator既能夠前向也能夠後向

  • ListIterator實現了Iterator接口,幷包含其餘的功能,好比:增長元素,替換元素,獲取前一個和後一個元素的索引,等等。

Jar包的做用是什麼

一、用於發佈和使用類庫 二、做爲應用程序和擴展的構建單元 三、做爲組件、applet 或者插件程序的部署單位 四、用於打包與組件相關聯的輔助資源

Java 的信號燈

  • Semaphore:

Semaphore也叫信號量,在JDK1.5被引入,用來控制同時訪問某個特定資源的操做數量,或者同時執行某個指定操做的數量。還能夠用來實現某種資源池,或者對容器施加邊界。

Semaphore能夠維護當前訪問自身的線程個數,並提供了同步機制。使用Semaphore能夠控制同時訪問資源的線程個數,例如,實現一個文件容許的併發訪問數。

Semaphore實現的功能就相似廁全部5個坑,假若有十我的要上廁所,那麼同時能有多少我的去上廁所呢?同時只能有5我的可以佔用,當5我的中的任何一我的讓開後,其中在等待的另外5我的中又有一個能夠佔用了。另外等待的5我的中能夠是隨機得到優先機會,也能夠是按照先來後到的順序得到機會,這取決於構造Semaphore對象時傳入的參數選項。

單個信號量的Semaphore對象能夠實現互斥鎖的功能,而且能夠是由一個線程得到了「鎖」,再由另外一個線程釋放「鎖」,這可應用於死鎖恢復的一些場合。

 

JAVA 語言如何進行異常處理,關鍵字throws,throw,try,catch,finally 分別表明什麼意義?在try 塊中能夠拋出異常嗎?

Java 經過面向對象的方法進行異常處理,把各類不一樣的異常進行分類,並提供了良好的接口。在Java 中,每一個異常都是一個對象,它是Throwable 類或其它子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法能夠捕獲到這個異常並進行處理。Java 的異常處理是經過5 個關鍵詞來實現的:try、catch、throw、throws和finally。通常狀況下是用try來執行一段程序,若是出現異常,系統會拋出(throws)一個異常,這時候你能夠經過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理。

  • try:用 try來指定一塊預防全部"異常"的程序。緊跟在try程序後面,應包含一個catch子句來指定你想要捕捉的"異常"的類型。

  • throw:明確地拋出一個"異常"。

  • throws :標明一個成員函數可能拋出的各類"異常"。

  • Finally:一段無論發生什麼"異常"都被執行一段代碼。

類java.lang.ThreadLocal的做用和原理。

  • ThreadLocal隸屬java.lang包,表示線程私有變量,也可叫作線程本地變量。它爲單個線程單首創立了一個副本,每一個線程只可訪問屬於本身的變量,不可訪問和修改別的線程所屬的變量。

  • ThreadLocal屬於一個泛型類,泛型參數爲變量的類型,能夠經過重寫initialValue方法來實現對該變量初始值的設置。

ThreadLocal的原理

ThreadLocal是如何作到爲每個線程維護變量的副本的呢?其實實現的思路很簡單,在ThreadLocal類中有一個Map,用於存儲每個線程的變量的副本。

Java.util.Map的實現類

一、HashMap

二、Hashtable

三、LinkedHashMap

四、TreeMap

JavaScript的數據類型都有什麼?

基本數據類型:String,boolean,Number,Undefined, Null

引用數據類型:Object(Array,Date,RegExp,Function)

Java三大版本

Java2平臺包括標準版(J2SE)、企業版(J2EE)和微縮版(J2ME)三個版本:

  • Standard Edition(標準版) J2SE 包含那些構成Java語言核心的類。

好比:數據庫鏈接、接口定義、輸入/輸出、網絡編程

  • Enterprise Edition(企業版) J2EE 包含J2SE 中的類,而且還包含用於開發企業級應用的類。

好比servlet、JSP、XML、事務控制

  • Micro Edition(微縮版) J2ME 包含J2SE中一部分類,用於消費類電子產品的軟件開發。

好比:呼機、智能卡、手機、PDA、機頂盒

他們的範圍是:J2SE包含於J2EE中,J2ME包含了J2SE的核心類,但新添加了一些專有類

應用場合,API的覆蓋範圍各不相同。

Java三種註釋類型說明

共有單行註釋、多行註釋、文檔註釋3種註釋類型。

  • 單行註釋,採用「//」方式.只能註釋一行代碼。如://類成員變量

  • 多行註釋,採用「/.../」方式,可註釋多行代碼,其中不容許出現嵌套。

  • 文檔註釋,採用「/*.../」方式。如:

/**

* 子類 Dog

* @author www.wuliaokankan.cn

**/

java中final和abstract關鍵字的做用

  • abstract能夠用來修飾類和方法,不能用來修飾屬性和構造方法;使用abstract修飾的類是抽象類,須要被繼承,使用abstract修飾的方法是抽象方法,須要子類被重寫。

  • final能夠用來修飾類、方法和屬性,不能修飾構造方法。使用final修飾的類不能被繼承,使用final修飾的方法不能被重寫,使用final修飾的變量的值不能被修改,因此就成了常量。

特別注意:final修飾基本類型變量,其值不能改變,由原來的變量變爲常量;可是final修飾引用類型變量,棧內存中的引用不能改變,可是所指向的堆內存中的對象的屬性值仍舊能夠改變

java中i++和++i的異同之處

共同點: 一、i++和++i都是變量自增1,都等價於i=i+1

               二、若是i++,++i是一條單獨的語句,二者沒有任何區別

               三、i++和++i的使用僅僅針對變量。 5++和++5會報錯,由於5不是變量。

不一樣點: 若是i++,++i不是一條單獨的語句,他們就有區別:

            i++ :先運算後增1。

如: int x=5; int y=x++; System.out.println("x="+x+", y="+y); //以上代碼運行後輸出結果爲:x=6, y=5

            ++i : 先增1後運算。

如: int x=5; int y=++x; System.out.println("x="+x+", y="+y); //以上代碼運行後輸出結果爲:x=6, y=6

下面程序的運行結果是()(選擇一項) String str1="hello";

                                                                  String str2=new String("hello");

                                                                  System.out.println(str1==str2);

                                                                 A. true B. false C. hello D. he

答案:B 分析:str1沒有使用new關鍵字,在堆中沒有開闢空間,其值」hello」在常量池中,str2使用new關鍵字建立了一個對象,在堆中開闢了空間,」==」比較的是對象的引用,即內存地址,因此str1與str2兩個對象的內存地址是不相同的

Java語言中,String類中的indexOf()方法返回值的類型是int

給定如下代碼,程序的運行結果是 ()(選擇一項)

public class Example { String str=new String("good");

     char [] ch={'a','b','c'};

public static void main(String[] args) {

    Example ex=new Example();

    ex.change(ex.str, ex.ch);

    System.out.print(ex.str+"and");

    System.out.print(ex.ch); }

public void change(String str,char ch[]){

    str="test ok";

    ch[0]='g';

    }

}

 

 A. goodandabc B. goodandgbc C. test okandabc D. test okandgbc

答案:B 分析:在方法調用時,在change方法中對str的值進行修改,是將str指向了常量江池中的」test ok」,而主方法中的ex.str仍然指向的是常量池中的」good」。字符型數組在方法調用時,將主方法中ex.ch的引用傳遞給change方法中的ch,指向是堆中的同一堆空間,因此修改ch[0]的時候,ex.ch能夠看到相同的修改後的結果。

是否能夠繼承String類?

答:不能夠,由於String類有final修飾符,而final修飾的類是不能被繼承的,實現細節不容許改變。                         

                                   String str1=「hello」;

                                   Sring str2=「he」+new String(「llo」);

                                   Sysem.out.println(str1==str2)); //false

                                   Sysem.out.println(str.equal(str2)); //true

下面哪一個是正確的()

A. String temp[ ] = new String{「a」,」b」,」c」};

B. String temp[ ] = {「a」,」b」,」c」};

C. String temp= {「a」,」b」,」c」};

D. String[ ] temp = {「a」,」b」,」c」}; 答案:BD

 

已知以下代碼:執行結果是什麼()

public class Test {

   public static void main(String[] args) {

         String s1 = new String("Hello");

         String s2 = new String("Hello");

         System.out.print(s1 == s2);

         String s3 = "Hello";

         String s4 = "Hello";

   System.out.print(s3 == s4); s1 = s3; s2 = s4;

   System.out.print(s1 == s2);

    }

}

 

A. false true true B. true false true C. true true false D. true true false

答案:A

java中this和super關鍵字的做用

  • this是對象內部指代自身的引用,同時也是解決成員變量和局部變量同名問題;this能夠調用成員變量,不能調用局部變量;this也能夠調用成員方法,可是在普通方法中能夠省略this,在構造方法中不容許省略,必須是構造方法的第一條語句,並且在靜態方法當中不容許出現this關鍵字。

  • super表明對當前對象的直接父類對象的引用,super能夠調用直接父類的成員變量(注意權限修飾符的影響,好比不能訪問private成員),super能夠調用直接父類的成員方法(注意權限修飾符的影響,好比不能訪問private成員);super能夠調用直接父類的構造方法,只限構造方法中使用,且必須是第一條語句。

java中while和do-while循環的區別

  • while先判斷後執行,第一次判斷爲false,循環體一次都不執行

  • do while先執行 後判斷,最少執行1次。

若是while循環第一次判斷爲true, 則兩種循環沒有區別。

Java中會存在內存泄漏嗎,請簡單描述

理論上Java由於有垃圾回收機制(GC)不會存在內存泄露問題(這也是Java被普遍使用於服務器端編程的一個重要緣由);然而在實際開發中,可能會存在無用但可達的對象,這些對象不能被GC回收,所以也會致使內存泄露的發生。例如Hibernate的Session(一級緩存)中的對象屬於持久態,垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象,若是不及時關閉(close)或清空(flush)一級緩存就可能致使內存泄露。

Java中垃圾回收(GC)有什麼目的?有哪些GC?何時進行垃圾回收?

  • 垃圾回收(GC)的目的是識別而且丟棄應用再也不使用的對象來釋放和重用資源。

  • System.gc()和Runtime.gc()這兩個方法用來提示JVM要進行垃圾回收。可是,當即開始仍是延遲進行垃圾回收是取決於JVM的。

  • 在釋放對象佔用的內存以前,垃圾收集器會調用對象的finalize()方法。通常建議在該方法中釋放對象持有的資源。

  • 若是對象的引用被置爲null,垃圾收集器是不會當即釋放對象佔用的內存,在下一個垃圾回收週期中,這個對象將是可被回收的。

Java中如何實現序列化,有什麼意義?

  • 序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決對象流讀寫操做時可能引起的問題(若是不進行序列化可能會存在數據亂序的問題)。

  • 要實現序列化,須要讓一個類實現Serializable接口,該接口是一個標識性接口,標註該類對象是可被序列化的,而後使用一個輸出流來構造一個對象輸出流並經過writeObject(Object)方法就能夠將實現對象寫出(即保存其狀態);若是須要反序列化則能夠用一個輸入流創建對象輸入流,而後經過readObject方法從流中讀取對象。

  • 例如,在web開發中,若是對象被保存在了Session中,tomcat在重啓時要把Session對象序列化到硬盤,這個對象就必須實現Serializable接口。若是對象要通過分佈式系統進行網絡傳輸或經過rmi等遠程調用,這就須要在網絡上傳輸對象,被傳輸的對象就必須實現Serializable接口。

Java中如何獲取到線程dump文件

死循環、死鎖、阻塞、頁面打開慢等問題,打線程dump是最好的解決問題的途徑。所謂線程dump也就是線程堆棧,獲取到線程堆棧有兩步:

(1)獲取到線程的pid,能夠經過使用jps命令,在Linux環境下還可使用ps -ef | grep java

(2)打印線程堆棧,能夠經過使用jstack pid命令,在Linux環境下還可使用kill -3 pid

java中實現多態的機制是什麼?

靠的是父類或接口定義的引用變量能夠指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。

java中接口有什麼用

一、經過接口能夠實現不相關類的相同行爲,而不須要了解對象所對應的類。

二、經過接口能夠指明多個類須要實現的方法。

三、經過接口能夠了解對象的交互界面,而不需瞭解對象所對應的類。

另:Java是單繼承,接口可使其實現多繼承的功能。

java中有幾種方法能夠實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法爲什麼不推薦使用?

  • 有兩種實現方法,分別是繼承Thread類與實現Runnable接口

  • 用synchronized關鍵字修飾同步方法

  • 反對使用stop(),是由於它不安全。它會解除由線程獲取的全部鎖定,並且若是對象處於一種不連貫狀態,那麼其餘線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這以前得到的鎖定。此時,其餘任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來講,若是它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會形成死鎖。因此不該該使用suspend(),而應在本身的Thread類中置入一個標誌,指出線程應該活動仍是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()從新啓動線程。

    Java中有幾種類型的流?

(1)字節流 InputStream/OutputStream

①FileInputStream/FileOutputStream:文件字節流,用於文件的讀寫操做

②BufferedInputStream/BufferedFileOutputStream:加緩衝區的字節流,用於提升效率

(2)字符流 Reader/Writer

①FileReader/FileWriter:文件字符流,用於文本文件的讀寫操做

②BufferedReader/BufferedWriter:加緩衝區的字符流,用於提升效率

(3)轉換流 InputStreamReader/OutputStreamWriter

Java中用到的線程調度算法是什麼?

搶佔式。一個線程用完CPU以後,操做系統會根據線程優先級、線程飢餓狀況等數據算出一個總的優先級並分配下一個時間片給某個線程執行。

Exception和Error都是Throwable的子類。Exception用於用戶程序能夠捕獲的異常狀況。Error定義了不指望被用戶程序捕獲的異常。

java中線程的狀態轉換

java中繼承條件下構造方法的執行過程

  • 狀況1:若是子類的構造方法中沒有經過super顯式調用父類的有參構造方法,也沒有經過this顯式調用自身的其餘構造方法,則系統會默認先調用父類的無參構造方法。在這種狀況下,寫不寫「super();」語句,效果是同樣的。

  • 狀況2:若是子類的構造方法中經過super顯式調用父類的有參構造方法,那將執行父類相應構造方法,而不執行父類無參構造方法。

  • 狀況3:若是子類的構造方法中經過this顯式調用自身的其餘構造方法,在相應構造方法中應用以上兩條規則。

Java代碼優化

(1)儘可能指定類、方法的final修飾符

(2)儘可能重用對象

(3)儘量使用局部變量

(4)及時關閉流

(5)慎用異常

(6)當複製大量數據時,使用System.arraycopy()命令

(7)循環內不要不斷建立對象引用

(8)基於效率和類型檢查的考慮,應該儘量使用array,沒法肯定數組大小時才使用ArrayList

(9)儘可能使用HashMap、ArrayList、StringBuilder,除非線程安全須要,不然不推薦使用Hashtable、Vector、StringBuffer,後三者因爲使用同步機制而致使了性能開銷

(10)不要將數組聲明爲public static final

(11)及時清除再也不須要的會話

(12)使用同步代碼塊替代同步方法

(13)將常量聲明爲static final,並以大寫命名

(14)程序運行過程當中避免使用反射

(15)使用數據庫鏈接池和線程池

(16)順序插入和隨機訪問比較多的場景使用ArrayList,元素刪除和中間插入比較多的場景使用LinkedList

(17)字符串變量和字符串常量equals的時候將字符串常量寫在前面

(18)公用的集合類中不使用的數據必定要及時remove掉

(19)使用最有效率的方式去遍歷Map

Java建立線程後,調用start()方法和run()的區別

兩種方法的區別

1) start方法:

用start方法來啓動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。經過調用Thread類的start()方法來啓動一個線程,這時此線程處於就緒(可運行)狀態,並無運行,一旦獲得cpu時間片,就開始執行run()方法,這裏方法run()稱爲線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。

2) run():

run()方法只是類的一個普通方法而已,若是直接調用run方法,程序中依然只有主線程這一個線程,其程序執行路徑仍是隻有一條,仍是要順序執行,仍是要等待,run方法體執行完畢後纔可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。

總結:調用start方法方可啓動線程,而run方法只是thread的一個普通方法調用,仍是在主線程裏執行。這兩個方法應該都比較熟悉,把須要並行處理的代碼放在run()方法中,start()方法啓動線程將自動調用 run()方法,這是由jvm的內存機制規定的。而且run()方法必須是public訪問權限,返回值類型爲void。

兩種方式的比較 :

實際中每每採用實現Runable接口,一方面由於java只支持單繼承,繼承了Thread類就沒法再繼續繼承其它類,並且Runable接口只有一個run方法;另外一方面經過結果能夠看出實現Runable接口才是真正的多線程。

Java反射技術主要實現類有哪些,做用分別是什麼?

在JDK中,主要由如下類來實現Java反射機制,這些類都位於java.lang.reflect包中

1)Class類:表明一個類

2)Field 類:表明類的成員變量(屬性)

3)Method類:表明類的成員方法

4)Constructor 類:表明類的構造方法

5)Array類:提供了動態建立數組,以及訪問數組的元素的靜態方法

java反射的使用場合和做用、及其優缺點

1)使用場合

在編譯時根本沒法知道該對象或類可能屬於哪些類,程序只依靠運行時信息來發現該對象和類的真實信息。

2)主要做用

經過反射可使程序代碼訪問裝載到JVM 中的類的內部信息,獲取已裝載類的屬性信息,獲取已裝載類的方法,獲取已裝載類的構造方法信息

3)反射的優勢

反射提升了Java程序的靈活性和擴展性,下降耦合性,提升自適應能力。它容許程序建立和控制任何類的對象,無需提早硬編碼目標類;反射是其它一些經常使用語言,如C、C++、Fortran 或者Pascal等都不具有的

4) Java反射技術應用領域很廣,如軟件測試等;許多流行的開源框架例如Struts、Hibernate、Spring在實現過程當中都採用了該技術

5)反射的缺點

性能問題:使用反射基本上是一種解釋操做,用於字段和方法接入時要遠慢於直接代碼。所以Java反射機制主要應用在對靈活性和擴展性要求很高的系統框架上,普通程序不建議使用。

使用反射會模糊程序內部邏輯:程序人員但願在源代碼中看到程序的邏輯,反射等繞過了源代碼的技術,於是會帶來維護問題。反射代碼比相應的直接代碼更復雜。

相關文章
相關標籤/搜索