天天看點

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

1.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

String s1=new String( ” xyz ” );            建立了String類型的内容為xyz的s1對象

String s2=new String( ” xyz ” );            建立了String類型的内容為xyz的s2對象

Boolean b1=s1.equals(s2);                       比較s1對象和s2對象的内容相等,傳回true。

Boolean b2=(s1==s2);                              比較s1和s2兩個對象的存儲位址是否相等,明顯兩者分别存儲在不同的位址,是以傳回:false。

故答案為:true  false

2.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

關于try catch 知識:程式運作到 try塊,b=20;并沒有發生異常,不運作catch塊,運作到return b;因為finally塊無論如何都要運作,是以并不發生傳回動作,進行運作finally塊,b=30;進行程式傳回輸出;

3.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

floor : 意為地闆,指向下取整,傳回不大于它的最大整數

ceil : 意為天花闆,指向上取整,傳回不小于它的最小整數

round : 意為大約,表示“四舍五入”,而四舍五入是往大數方向入。

Math.round(11.5)的結果為12,Math.round(-11.5)的結果為-11而不是-12。 

4.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

 解析:

length() 方法傳回的就是字元串的長度,一個 char 可以存下漢字,剩下的數數就完事了。

如果想獲得占用位元組數的話,可以用 s.getBytes(“GBK”).length,結果就是 16 

5.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

1、建立泛型對象的時候,一定要指出類型變量T的具體類型。争取讓編譯器檢查出錯誤,而不是留給JVM運作的時候抛出類不比對的異常。

2、JVM如何了解泛型概念 —— 類型擦除。事實上,JVM并不知道泛型,所有的泛型在編譯階段就已經被處理成了普通類和方法。 處理方法很簡單,我們叫做類型變量T的擦除(erased) 。

總結:泛型代碼與JVM

  • ① 虛拟機中沒有泛型,隻有普通類和方法。
  • ② 在編譯階段,所有泛型類的類型參數都會被Object或者它們的限定邊界來替換。(類型擦除)
  • ③ 在繼承泛型類型的時候,橋方法的合成是為了避免類型變量擦除所帶來的多态災難。 無論我們如何定義一個泛型類型,相應的都會有一個原始類型被自動提供。原始類型的名字就是擦除類型參數的泛型類型的名字。 

6.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

在一個子類被建立的時候,首先會在記憶體中建立一個父類對象,然後在父類對象外部放上子類獨有的屬性,兩者合起來形成一個子類的對象。是以所謂的繼承使子類擁有父類所有的屬性和方法其實可以這樣了解,子類對象确實擁有父類對象中所有的屬性和方法,但是父類對象中的私有屬性和方法,子類是無法通路到的,隻是擁有,但不能使用。就像有些東西你可能擁有,但是你并不能使用。是以子類對象是絕對大于父類對象的,所謂的子類對象隻能繼承父類非私有的屬性及方法的說法是錯誤的。可以繼承,隻是無法通路到而已。

7.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

ResultSet跟普通的數組不同,索引從1開始而不是從0開始 

8.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

1. 一個子類隻能繼承一個抽象類,但能實作多個接口

2. 抽象類可以有構造方法,接口沒有構造方法

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

4. 抽象類和接口都可有靜态成員變量,抽象類中靜态成員變量通路類型任意,接口隻能public static default(預設)

5. 抽象類可以沒有抽象方法,抽象類可以有普通方法,接口中都是抽象方法

6. 抽象類可以有靜态方法,接口不能有靜态方法

9.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

 解析:

A: HashSet 它不是線程安全的,屬于Set接口下的實作類,Set下的實作類特征就是無序,不允許存儲相同的對象

B: ConcurrentHashMap 它是線程安全的HashMap實作,特征也相似,其中存儲的值對象可以重複,鍵對象不能重複

C: Collection接口是List接口和Set接口的父接口,通常情況下不被直接使用

D: ArrayList線程不安全的,底層是數組實作,允許存放重複對象

10.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

 解析:

A,“任何對象”鎖定,太絕對了,你能鎖住你沒有權限通路的對象嗎?

B,前半句話講的是建立線程的方式,後半句講的是鎖定,驢頭不對馬嘴。

C,正确。

D,線程排程分為協同式排程和搶占式排程,Java使用的是搶占式排程,也就是每個線程将由作業系統來配置設定執行時間,線程的切換不由線程本身來決定(協同式排程)。這就是平台獨立的原因。

11.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

A,Thread可以被繼承,用于建立新的線程

B,Number類可以被繼承,Integer,Float,Double等都繼承自Number類

C,Double類的聲明為,final聲明的類不能被繼承

public final class Doubleextends Numberimplements Comparable<Double>
           

D,Math類的聲明為  final聲明的類不能被繼承

public final class Mathextends Object
           

E,ClassLoader可以被繼承,使用者可以自定義類加載器

12.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

 Servlet的生命周期一般可以用三個方法來表示:

  1. init():僅執行一次,負責在裝載Servlet時初始化Servlet對象
  2. service() :核心方法,一般HttpServlet中會有get,post兩種處理方式。在調用doGet和doPost方法時會構造servletRequest和servletResponse請求和響應對象作為參數。
  3. destory():在停止并且解除安裝Servlet時執行,負責釋放資源

初始化階段:Servlet啟動,會讀取配置檔案中的資訊,構造指定的Servlet對象,建立ServletConfig對象,将ServletConfig作為參數來調用init()方法。是以選ACD。B是在調用service方法時才構造的

13.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

兩個最基本的java回收算法:複制算法和标記清理算法

  • 複制算法:兩個區域A和B,初始對象在A,繼續存活的對象被轉移到B。此為新生代最常用的算法
  • 标記清理:一塊區域,标記可達對象(可達性分析),然後回收不可達對象,會出現碎片,那麼引出
  • 标記-整理算法:多了碎片整理,整理出更大的記憶體放更大的對象

兩個概念:新生代和年老代

  • 新生代:初始對象,生命周期短的
  • 永久代:長時間存在的對象

整個java的垃圾回收是新生代和年老代的協作,這種叫做分代回收。

Serial New收集器是針對新生代的收集器,采用的是複制算法

Parallel New(并行)收集器,新生代采用複制算法,老年代采用标記整理

Parallel Scavenge(并行)收集器,針對新生代,采用複制收集算法

Serial Old(串行)收集器,新生代采用複制,老年代采用标記整理

Parallel Old(并行)收集器,針對老年代,标記整理

CMS收集器,基于标記清理

G1收集器:整體上是基于标記 整理 ,局部采用複制

綜上:新生代基本采用複制算法,老年代采用标記整理算法。cms采用标記清理。

14.

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.

解析:

常見的代碼優化技術有:複寫傳播,删除死代碼, 強度削弱,歸納變量删除

複寫傳播:

java面試題(四)1.2.3.4.5.6.7.8.9.10.11.12.13.14.
  • 複寫語句:形式為f = g 的指派
    • 優化過程中會大量引入複寫
    • 複寫傳播變換的做法是在複寫語句f = g後,盡可能用g代表f
    • 複寫傳播變換本身并不是優化,但它給其他優化帶來機會
      • 常量合并(編譯時可完成的計算)
      • 死代碼删除

死代碼删除:

  • 死代碼是指計算的結果決不被引用的語句
  • 一些優化變換可能會引起死代碼

代碼外提:

  • 代碼外提是循環優化的一種
  • 循環優化的其它重要技術
    • 歸納變量删除
    • 強度削弱

例:

1

2

3

4

while

(i <= limit - 

2

) ...

// 代碼外提後變成

t = limit - 

2

;

while

(i <= t) ...

歸納變量删除:

1

2

3

4

j = j - 

1

t4 = 

4

* j

t5 = a[t4]

if

t5 > value 

goto

B3

  • j和t4的值步伐一緻地變化,這樣的變量叫作歸納變量
  • 在循環中有多個歸納變量時,也許隻需要留下一個
  • 這個操作由歸納變量删除過程來完成
  • 對本例可以先做強度削弱,它給删除歸納變量創造機會

強度削弱

  • 強度削弱的本質是把強度大的運算換算成強度小的運算,例如将乘法換成加法運算。

參考資料:

編譯原理之代碼優化