程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java就業面試題大全

Java就業面試題大全

編輯:JAVA綜合教程

Java就業面試題大全


  有些題來自網上搜集整理,有些題來自我面試經常遇到的,抽空全部整理一下,希望對有需要者給予幫助和解答,說真的,很多所謂的面試題,我真懷疑其是否還有存在價值!

  1、一個".java"源文件中是否可以包括多個類(不是內部類)?有什麼限制?

  可以有多個類,但只能有一個public的類,並且public的類名必須與文件名相一致。

  2、Java有沒有goto?

  java中的保留字,現在沒有在java中使用。

  3、說說&和&&的區別?

  &和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。

  &&還具有短路的功能,即如果第一個表達式為false,則不再計算第二個表達式,例如,對於if(str != null && !str.equals(“”))表達式,當str為null時,後面的表達式不會執行,

  所以不會出現NullPointerException如果將&&改為&,則會拋出NullPointerException異常。If(x==33 & ++y>0) y會增長,If(x==33 && ++y>0)不會增長

  &還可以用作位運算符,當&操作符兩邊的表達式不是boolean類型時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,

  例如,0x31 & 0x0f的結果為0x01。備注:這道題先說兩者的共同點,再說出&&和&的特殊之處,並列舉一些經典的例子來表明自己理解透徹深入、實際經驗豐富。

  4、在JAVA中如何跳出當前的多重嵌套循環?

  在Java中,要想跳出多重循環,可以在外面的循環語句前定義一個標號,然後在裡層循環體的代碼中使用帶有標號的break語句,即可跳出外層循環。

  5、switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

  在switch(expr1)中,expr1只能是一個整數表達式或者枚舉常量(更大字體),整數表達式可以是int基本類型或Integer包裝類型,由於

  byte,short,char都可以隱含轉換為int,所以,這些類型以及這些類型的包裝類型也是可以的。顯然,long和String類型都不符合switch的語法規定,

  並且不能被隱式轉換成int類 型,所以,它們不能作用於swtich語句中。

  6、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

  對於short s1 = 1; s1 = s1 + 1;由於s1+1運算時會自動提升表達式的類型,所以結果是int型,再賦值給short類型s1時,編譯器將報告需要強制轉換類型的錯誤。

  對於short s1 = 1; s1 += 1;由於 +=是java語言規定的運算符,java編譯器會對它進行特殊處理,因此可以正確編譯。

  7、char型變量中能不能存貯一個中文漢字?為什麼?

  char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變量中當然可以存儲漢字啦。

  不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變量中就不能存儲這個特殊漢字。

  補充說明:unicode編碼占用兩個字節,所以,char類型的變量也是占用兩個字節。

  備注:後面一部分回答雖然不是在正面回答題目,但是,為了展現自己的學識和表現自己對問題理解的透徹深入,可以回答一些相關的知識,做到知無不言,言無不盡。

  8、用最有效率的方法算出2乘以8等於幾?

  2 << 3,

  因為將一個數左移n位,就相當於乘以了2的n次方,那麼,一個數乘以8只要將其左移3位即可,而位運算cpu直接支持的,效率最高,

  所以,2乘以8等於幾的最效率的方法是2 << 3。

  9、請設計一個一百億的計算器

  首先,計算機中用固定數量的幾個字節來存儲的數值,所以計算機中能夠表示的數值是有一定的范圍的,為了便於講解和理解,我們先以byte類型的整數為例,

  它用1個字節進行存儲,表示的最大數值范圍為-128到+127。-1在內存中對應的二進制數據為11111111,如果兩個-1相加,不考慮Java運算時的類型提升,

  運算後會產生進位,二進制結果為1,11111110,由於進位後超過了byte類型的存儲空間,所以進位部分被捨棄,即最終的結果為11111110,也就是-2,

  這正好利用溢位的方式實現了負數的運算。-128在內存中對應的二進制數據為10000000,如果兩個-128相加,不考慮Java運算時的類型提升,運算後會產生進位,

  二進制結果為1,00000000,由於進位後超過了byte類型的存儲空間,所以進位部分被捨棄,即最終的結果為00000000,也就是0,這樣的結果顯然不是我們期望的,

  這說明計算機中的算術運算是會發生越界情況的,兩個數值的運算結果不能超過計算機中的該類型的數值范圍。由於Java中涉及表達式運算時的類型自動提升,

  我們無法用byte類型來做演示這種問題和現象的實驗,大家可以用下面一個使用整數做實驗的例子程序體驗一下:

  inta = Integer.MAX_VALUE;

  intb = Integer.MAX_VALUE;

  intsum = a + b;

  System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);

  10、使用final關鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變?

  使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容還是可以改變的。例如,對於如下語句:

  finalStringBuffera=newStringBuffer("immutable");

  執行如下語句將報告編譯期錯誤:a=newStringBuffer("");

  但是,執行如下語句則可以通過編譯:a.append("broken!");

  有人在定義方法的參數時,可能想采用如下形式來阻止方法內部修改傳進來的參數對象:

  publicvoid method(final StringBuffer param)

  {

  }

  實際上,這是辦不到的,在該方法內部仍然可以增加如下代碼來修改參數對象:param.append("a");

  11、"=="和equals方法究竟有什麼區別?

  ==操作符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,

  只能用==操作符。

  equals方法是用於比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。

  12、靜態變量和實例變量的區別?

  在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。

  在程序運行時的區別:實例變量屬於某個對象的屬性,必須創建了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對象,

  而是屬於類,所以也稱為類變量,只要程序加載了類的字節碼,不用創建任何實例對象,靜態變量就會被分配空間,靜態變量就可以被使用了。

  總之,實例變量必須創建對象後才可以通過這個對象來使用,靜態變量則可以直接使用類名來引用。

  13、是否可以從一個static方法內部發出對非static方法的調用?

  不可以。因為非static方法是要與對象關聯在一起的,必須創建一個對象後,才可以在該對象上進行方法調用,而static方法調用時不需要創建對象,可以直接調用。

  也就是說,當一個static方法被調用時,可能還沒有創建任何實例對象,如果從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪個對象上的呢?

  這個邏輯無法成立,所以,一個static方法內部發出對非static方法的調用。

  14、Integer與int的區別?

  int是java提供的8種原始數據類型之一。Java為每個原始類型提供了封裝類,Integer是java為int提供的封裝類。int的默認值為0,而Integer的默認值為null,

  即Integer可以區分出未賦值和值為0的區別,int則無法表達出未賦值的情況。

  15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

  Math類中提供了三個與取整有關的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應,

  例如,ceil的英文意義是天花板,該方法就表示向上取整,所以,Math.ceil(11.3)的結果為12,Math.ceil(-11.3)的結果是-11;

  floor的英文意義是地板,該方法就表示向下取整,所以,Math.floor(11.6)的結果為11,Math.floor(-11.6)的結果是-12;

  最難掌握的是round方法,它表示“四捨五入”,算法為Math.floor(x+0.5),

  即將原來的數字加上0.5後再向下取整,所以,Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11。

  16、請說出作用域public,private,protected,以及不寫時的區別?

  這四個作用域的可見范圍如下表所示。說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly。

  作用域 當前類同一package子孫類其他package

  public√√√√

  protected√√√×

  friendly√√××

  private√×××

  備注:只要記住了有4種訪問權限,4個訪問范圍,然後將全選和范圍在水平和垂直方向上分別按排從小到大或從大到小的順序排列,就很容易畫出上面的圖了。

  17、Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

  Overload是重載的意思,Override是覆蓋的意思,也就是重寫。

  重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。

  重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,

  這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,

  或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。

  如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。

  至於Overloaded的方法是否可以改變返回值的類型這個問題,要看你倒底想問什麼呢?這個題目很模糊。如果幾個Overloaded的方法的參數列表不一樣,

  它們的返回者類型當然也可以不一樣。

  18、構造器Constructor是否可被override?

  構造器Constructor不能被繼承,因此不能重寫Override,但可以被重載Overload。

  19、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承具體類(concrete class)? 抽象類中是否可以有靜態的main方法?

  接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是可以繼承實體類,但前提是實體類必須有明確的構造函數。抽象類中可以有靜態的main方法。

  只有記住抽象類與普通類的唯一區別就是不能創建實例對象和允許有abstract方法。

  20、寫clone()方法時,通常都有一行代碼,是什麼?

  clone 有缺省行為,super.clone();因為首先要把父類中的成員復制到位,然後才是復制自己的成員。

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

  靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,

  也就是內存裡正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。

  22、abstract class和interface有什麼區別?

  含有abstract修飾符的class即為抽象類,abstract類不能創建的實例對象。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。

  abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,

  那麼子類也必須定義為abstract類型。

  接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認為public abstract類型,

  接口中的成員變量類型默認為public static final。

  下面比較一下兩者的語法區別:

  1.抽象類可以有構造方法,接口中不能有構造方法。

  2.抽象類中可以有普通成員變量,接口中沒有普通成員變量

  3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。

  4. 抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,

  並且默認即為public abstract類型。

  5. 抽象類中可以包含靜態方法,接口中不能包含靜態方法

  6. 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,

  並且默認即為public static final類型。

  7. 一個類可以實現多個接口,但只能繼承一個抽象類。

  23、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

  abstract的method不可以是static的,因為抽象的方法是要被子類實現的,而static與子類扯不上關系!

  native方法表示該方法要用另外一種依賴平台的編程語言實現的,不存在著被子類實現的問題,所以,它也不能是抽象的,不能與abstract混用。

  關於synchronized與abstract合用的問題,我覺得也不行,因為在我幾年的學習和開發中,從來沒見到過這種情況,並且我覺得synchronized應該是作用在一個

  具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this是什麼。

  24、什麼是內部類?StaticNested Class 和 Inner Class的不同。

  內部類就是在一個類的內部定義的類,內部類中不能定義靜態成員(靜態成員不是對象的特性,只是為了找一個容身之處,所以需要放到一個類中而已,

  這麼一點小事,你還要把它放到類內部的一個類中,過分了啊!提供內部類,不是為讓你干這種事情,無聊,不讓你干。

  我想可能是既然靜態成員類似c語言的全局變量,而內部類通常是用於創建內部對象用的,所以,把“全局變量”放在內部類中就是毫無意義的事情,

  既然是毫無意義的事情,就應該被禁止),內部類可以直接訪問外部類中的成員變量,內部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中。

  25、內部類可以引用它的包含類的成員嗎?有沒有什麼限制?

  完全可以。如果不是靜態內部類,那沒有什麼限制!

  26、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?

  可以繼承其他類或實現其他接口。不僅是可以,而是必須!

  27、jdk中哪些類是不能繼承的?

  不能繼承的是類是那些用final關鍵字修飾的類。一般比較基本的類型或防止擴展類無意間破壞原來方法的實現的類型都應該是final的,

  在jdk中System,String,StringBuffer等都是基本類型。

  28、String是最基本的數據類型嗎?

  基本數據類型包括byte、int、char、long、float、double、boolean和short。

  java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer類

  29、Strings="Hello";s=s+"world!";這兩行代碼執行後,原始的String對象中的內容到底變了沒有?

  沒有。因為String被設計成不可變(immutable)類,所以它的所有對象都是不可變對象。

  30、是否可以繼承String類?

  String類是final類故不可以繼承。

  31、String s = new String("xyz");創建了幾個String Object? 二者之間有什麼區別?

  兩個,”xyz”對應一個對象,這個對象放在字符串常量緩沖區,常量”xyz”不管出現多少遍,都是緩沖區中的那一個。New String每寫一遍,就創建一個新的對象,

  它一句那個常量”xyz”對象的內容來創建出一個新String對象。如果以前就用過’xyz’,這句代表就不會創建”xyz”自己了,直接從緩沖區拿。

  32、String 和StringBuffer的區別?

  JAVA平台提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。String類表示內容不可改變的字符串。

  而StringBuffer類表示內容可以被修改的字符串。當你知道字符數據要改變的時候你就可以使用StringBuffer

  33、StringBuffer與StringBuilder的區別

  StringBuffer和StringBuilder類都表示內容可以被修改的字符串,StringBuilder是線程不安全的,運行效率高,如果一個字符串變量是在方法裡面定義,

  這種情況只可能有一個線程訪問它,不存在不安全的因素了,則用StringBuilder。如果要在類裡面定義成員變量,並且這個類的實例對象會在多線程環境下使用,

  那麼最好用StringBuffer。

  34、如何把一段逗號分割的字符串轉換成一個數組?

  如果不查jdk api,我很難寫出來!我可以說說我的思路:

  用正則表達式,代碼大概為:String [] result = orgStr.split(“,”);

  用StingTokenizer ,代碼為:StringTokenizertokener = StringTokenizer(orgStr,”,”);

  String [] result = newString[tokener .countTokens()];

  Int i=0;

  while(tokener.hasNext(){result[i++]=toker.nextToken();}

  35、數組有沒有length()這個方法? String有沒有length()這個方法?

  數據沒有length()這個方法,有length這個屬性,String有length()這個方法。

  36、try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?

  會執行,return之前執行。

  37、final, finally, finalize的區別?

  final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

  finally是異常處理語句結構的一部分,表示總是執行。

  finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,

  例如關閉文件等。JVM不保證此方法總被調用

  38、運行時異常與一般異常有何異同?

  異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。

  java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。

  39、error和exception有什麼區別?

  error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。

  exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。

  40、請寫出你最常見到的5個runtime exception。

  這道題主要考你的代碼量到底多大,如果你長期寫代碼的,應該經常都看到過一些系統方面的異常,你不一定真要回答出5個具體的系統異常,

  但你要能夠說出什麼是系統異常,以及幾個系統異常就可以了,當然,這些異常完全用其英文名稱來寫是最好的,如果實在寫不出,那就用中文吧,有總比沒有強!

  所謂系統異常,就是…..,它們都是RuntimeException的子類,在jdk doc中查RuntimeException類,就可以看到其所有的子類列表,也就是看到了所有的系統異常。

  我比較有印象的系統異常有:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。

  41、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?

  throws捕獲並向外拋出異常

  throw拋出異常

  try catch是內部捕獲異常並做自定義處理

  finally是無論是否有異常都會被處理的語句,除非在finally前存在被執行的System.exit(int i)時除外

  42、java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?

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

  synchronized關鍵字修飾同步方法

  反對使用stop(),是因為它不安全。suspend()方法容易發生死鎖。

  43、sleep() 和 wait() 有什麼區別?

  sleep()是讓線程指定休眠時間,然後繼續工作,

  wait()是等待,直到有線程通知notify()喚醒他才會重新工作。

  44、同步和異步有何異同,在什麼情況下分別使用他們?舉例說明?

  如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,

  必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,

  在很多情況下采用異步途徑往往更有效率。

  45、啟動一個線程是用run()還是start()?

  啟動一個線程是調用start()方法,使線程就緒狀態,以後可以被調度為運行狀態,一個線程必須關聯一些具體的執行代碼,run()方法是該線程所關聯的執行代碼。

  46、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

  分幾種情況: 1.其他方法前是否加了synchronized關鍵字,如果沒加,則能。

  2.如果這個方法內部調用了wait,則可以進入其他synchronized方法。

  3.如果其他個方法都加了synchronized關鍵字,並且內部沒有調用wait,則不能。

  4.如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因為非靜態的方法用的是this。

  47、簡述synchronized和java.util.concurrent.locks.Lock的異同 ?

  主要相同點:Lock能完成synchronized所實現的所有功能

  主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,並且必須在finally從句中釋放。

  Lock還有更強大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。

  48、ArrayList和Vector的區別?

  (1)同步性: Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。

  (2)數據增長:即Vector增長原來的一倍,ArrayList增加原來的0.5倍。

  49、HashMap和Hashtable的區別?

  就HashMap與HashTable主要從三方面來說:

  (1)、歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現;

  (2)、同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的;

  (3)、值:只有HashMap可以讓你將空值作為一個表的條目的key或valu。

  50、List 和 Map 區別?

  一個是存儲單列數據的集合,另一個是存儲鍵和值這樣的雙列數據的集合,List中存儲的數據是有順序,並且允許重復;

  Map中存儲的數據是沒有順序的,其鍵是不能重復的,它的值是可以有重復的。

  51、List, Set, Map是否繼承自Collection接口?

  List、Set是,Map不是。

  52、List、Map、Set三個接口,存取元素時,各有什麼特點?

  List與Set具有相似性,它們都是單列元素的集合,所以,它們有一個功共同的父接口,叫Collection。Set裡面不允許有重復的元素,所謂重復,即不能有兩個相等。

  List 以特定次序來持有元素,可有重復元素。Set 無法擁有重復元素,內部排序。Map 保存key-value值,value可多值。

  53、說出ArrayList,Vector,LinkedList的存儲性能和特性?

  ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,

  但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,

  而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。

  LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作堆棧和隊列來使用。

  54、Collection 和 Collections的區別?

  Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.

  Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

  55、Set裡的元素是不能重復的,那麼用什麼方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?

  Set裡的元素是不能重復的,元素重復與否是使用equals()方法進行判斷的。

  equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。

  56、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

  不對,他們hash code必須相同。

  57、說出一些常用的類,包,接口,請各舉5個 ?

  常用的類:BufferedReader,BufferedWriter,FileReader,FileWirter,String Integer,java.util.Date,System,Class,List,HashMap

  常用的包:java.lang,java.io,java.util,java.sql,javax.servlet,org.apache.strtuts.action,org.hibernate

  常用的接口:Remote,List,Map,Document,NodeList,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession

  58、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?

  字節流,字符流。字節流繼承於InputStreamOutputStream,字符流繼承於InputStreamReaderOutputStreamWriter。

  在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。

  59、什麼是java序列化,如何實現java序列化?或者請解釋Serializable接口的作用?

  我們有時候將一個java對象變成字節流的形式傳出去或者從一個字節流中恢復成一個java對象,例如,要將java對象存儲到硬盤或者傳送給網絡上的其他計算機,

  這個過程我們可以自己寫代碼去把一個java對象變成某個格式的字節流再傳輸,但是,jre本身就提供了這種支持,我們可以調用OutputStream的writeObject方法來做,

  如果要讓java 幫我們做,要被傳輸的對象必須實現serializable接口,這樣,javac編譯時就會進行特殊處理,編譯的類才可以被writeObject方法操作,

  這就是所謂的序列化。需要被序列化的類必須實現Serializable接口,該接口是一個mini接口,其中沒有需要實現的方法,

  implements Serializable只是為了標注該對象是可被序列化的。

  60、描述一下JVM加載class文件的原理機制?

  JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。

  61、heap和stack有什麼區別?

  java的內存分為兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,

  當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。堆是與棧作用不同的內存,一般用於存放不放在當前方法棧中的那些數據,

  例如,使用new創建的對象都放在堆裡,所以,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。

  62、GC是什麼? 為什麼要有GC?

  GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,

  Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。

  63、什麼時候用assert?

  assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,

  它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值為true;如果該值為false,說明程序已經處於不正確的狀態下,

  assert將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高性能,

  在軟件發布後,assertion檢查通常是關閉的。

  64、Tomcat的優化經驗?

  去掉對web.xml的監視,把jsp提前編輯成Servlet。有富余物理內存的情況,加大tomcat使用的jvm的內存

  65、HTTP請求的GET與POST方式的區別?

  post傳遞數據量較大,較安全,用request.form("")取值。

  get傳遞數據量較小,沒有post安全性強,用request.querystring("取值") 。

  66、解釋一下什麼是servlet?

  servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達

  67、說一說Servlet的生命周期?

  Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,

  當服務器決定將實例銷毀的時候調用其destroy方法。

  web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。

  結束服務,web容器調用servlet的destroy()方法。

  68、forward() 與redirect()的區別?

  forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給浏覽器,

  浏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。

  redirect就是服務端根據邏輯,發送一個狀態碼,告訴浏覽器重新去請求那個地址,一般來說浏覽器會用剛才請求的所有參數重新請求,

  所以session,request參數都可以獲取。

  69、什麼情況下調用doGet()和doPost()?

  Jsp頁面中的FORM標簽裡的method屬性為get時調用doGet(),為post時調用doPost()。

  70、jsp有哪些內置對象?作用分別是什麼? 分別有什麼方法?

  JSP共有以下9個內置的對象:

  request 用戶端請求,此請求會包含來自GET/POST請求的參數

  response 網頁傳回用戶端的回應

  pageContext 網頁的屬性是在這裡管理

  session 與請求有關的會話期

  application servlet 正在執行的內容

  out 用來傳送回應的輸出

  config servlet的構架部件

  page JSP網頁本身

  exception 針對錯誤網頁,未捕捉的例外

  71、jsp有哪些動作?作用分別是什麼?

  JSP共有以下6種基本動作

  jsp:include:在頁面被請求的時候引入一個文件。

  jsp:useBean:尋找或者實例化一個JavaBean。

  jsp:setProperty:設置JavaBean的屬性。

  jsp:getProperty:輸出某個JavaBean的屬性。

  jsp:forward:把請求轉到一個新的頁面。

  jsp:plugin:根據浏覽器類型為Java插件生成OBJECT或EMBED標記

  72、JSP中動態INCLUDE與靜態INCLUDE的區別?

  動態INCLUDE用jsp:include動作實現

  它總是會檢查所含文件中的變化,適合用於包含動態頁面,並且可以帶參數靜態INCLUDE用include偽碼實現,定

  不會檢查所含文件的變化,適用於包含靜態頁面

<%@ file="included.htm" include="">

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved