Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Java重難點面試(一)

Java重難點面試(一)

編輯:關於Android編程

1 . 以下集合對象中哪幾個是線程安全的?(B,C,D )

A: ArrayList
B: Vector
C: Hashtable
D: Stack

解析:下面是這些線程安全的同步的類:
vector:就比arraylist多了個同步化機制(線程安全),因為效率較低,現在已經不太建議使用。在web應用中,特別是前台頁面,往往效率(頁面響應速度)是優先考慮的。
statck:堆棧類,先進後出
hashtable:就比hashmap多了個線程安全
enumeration:枚舉,相當於迭代器
除了這些之外,其他的都是非線程安全的類和接口。

2 . given the following code,what will be the output?

class Value{
    public int i=15;
}
public class Test{
    public static void main(String argv[]){
        Test t=new Test( );
        t.first( );
    }

public void first( ){
    int i=5;
    Value v=new Value( );
    v.i=25;
    second(v,i);
    System.out.println(v.i);
}

public void second(Value v,int i){
    i = 0;
    v.i = 20;
    Value val = new Value( );
    v = val;
    System.out.println(v.i+" "+i);
   }
}

結果:15 0 25

這裡考查的是Java中的值傳遞和引用傳遞的知識點,在Java中基本數據類型和String作為參數時都是值傳遞,不能夠修改傳遞之前的值,形參不會影響實參,在Java中對象類型作為參數時都是引用傳遞,只能夠修改引用指向的內容,而不能修改引用的指向。

3 . 下面代碼的輸出結果是什麼?

public class ZeroTest {
    public static void main(String[] args) {
     try{
       int i = 100 / 0;
       System.out.print(i);
  }catch(Exception e){
       System.out.print(1);
       throw new RuntimeException();
  }finally{
       System.out.print(2);
  }
      System.out.print(3);
 }
 }

輸出的結果是 12

考查的是finally不管是否拋出異常,都會指向finally裡面的語句

4 . Java類Demo中存在方法func0、func1、func2、func3和func4,請問該方法中,哪些是不合法的定義?( )

public class Demo{
  float func0()
  {
    byte i=1;
    return i;
  }
  float func1()
  {
    int i=1;
    return;
  }
  float func2()
  {
    short i=2;
    return i;
  }
  float func3()
  {
    long i=3;
    return i;
  }
  float func4()
  {
    double i=4;
    return i;
  }
}

定義錯誤的是 func1,func4

考查的知識點是自動轉型問題,精度高的轉型成精度低的需要強制轉化申明,精度低的轉化成精度高的隱式轉化即可。
低 ———————————————> 高
byte,short,char-> int -> long -> float -> double
特殊點:long到float不用強轉,因為float表示的范圍確實比long表示的范圍大,雖然它只占4個字節,而long占8個字節

5 . 在java中,下列標識符不合法的有( )

A: new
B: $Usdollars
C: 1234
D: car.taxi

答案:A,C,D

考查命名規則:Java標識符由數字,字母和下劃線(_),美元符號($)組成。在Java中是區分大小寫的,而且還要求首位不能是數字。最重要的是,Java關鍵字 不能當作Java標識符。

6 . java中將ISO8859-1字符串轉成GB2312編碼,語句為 ?

A: new String(String.getBytes(“ISO8859-1”),GB2312)
B: new String(String.getBytes(“GB2312”),ISO8859-1)
C: new String(String.getBytes(“ISO8859-1”))
D: new String(String.getBytes(“GB2312”))

答案 A

7 . 下列哪個選項是Java調試器?如果編譯器返回程序代碼的錯誤,可以用它對程序進行調試。

A: java.exe
B: javadoc.exe
C: jdb.exe
D: javaprof.exe

答案為C

javac.exe是編譯.java文件
java.exe是執行編譯好的.class文件
javadoc.exe是生成Java說明文檔
jdb.exe是Java調試器
javaprof.exe是剖析工具

8 . String與StringBuffer的區別。

String 字符串常量
StringBuffer 字符串變量(線程安全)
StringBuilder 字符串變量(非線程安全)
String 類代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都是String類的對象。字符串是常量;它們的值在創建之後不能改變。所以可以共享它們。StringBuffer是字符串緩存區,它的內容可以被修改,長度也可以改變,StringBuffer類是線程安全的,也就是說多個線程可以安全的訪問StringBuffer對象。StringBuilder與StringBuffer類似,都是字符串緩沖區,但StringBuilder不是線程安全的,如果你只是在單線程中使用字符串緩沖區,那麼StringBuilder的效率會更高些。值得注意的是StringBuilder是在JDK1.5版本中增加的。以前版本的JDK不能使用該類。

9 . 下列說法錯誤的有( )

A: 在類方法中可用this來調用本類的類方法
B: 在類方法中調用本類的類方法時可直接調用
C: 在類方法中只能調用本類中的類方法
D: 在類方法中絕對不能調用實例方法

答案為A,C,D

知識點:this是調用對象方法使用的,在類方法中可以通過類名作用域的方式調用Class::fun();
d,太絕對化了,在類中申請一個類對象或者參數傳遞一個對象或者指針都可以調用;

10 . 下面有關java classloader說法錯誤的是?

A: Java默認提供的三個ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader
B: ClassLoader使用的是雙親委托模型來搜索類的
C: JVM在判定兩個class是否相同時,只用判斷類名相同即可,和類加載器無關
D: ClassLoader就是用來動態加載class文件到內存當中用的

答案為C

知識點:
一個jvm中默認的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分別各司其職:
Bootstrap ClassLoader 負責加載java基礎類,主要是 %JRE_HOME/lib/ 目錄下的rt.jar、resources.jar、charsets.jar和class等

Extension ClassLoader 負責加載java擴展類,主要是 %JRE_HOME/lib/ext 目錄下的jar和class

App ClassLoader 負責加載當前java應用的classpath中的所有類。

classloader 加載類用的是全盤負責委托機制。 所謂全盤負責,即是當一個classloader加載一個Class的時候,這個Class所依賴的和引用的所有 Class也由這個classloader負責載入,除非是顯式的使用另外一個classloader載入。
所以,當我們自定義的classlo ader加載成功了 com.company.MyClass以後,MyClass裡所有依賴的class都由這個classLoader來加載完成。

11 . 選出不正確的敘述。

A: 死鎖是指因相互競爭資源使得系統中有多個阻塞進程的情況
B: 若系統中並發運行的進程和資源之間滿足互斥條件、占有且申請、不可搶占和環路條件,則可判定系統中發生了死鎖
C: 在對付死鎖的策略中,解除死鎖通常都是和檢測死鎖配套使用
D: 產生死鎖的原因可歸結為競爭資源和進程推進順序不當
E: 在死鎖的解決方法中,由於避免死鎖采用靜態分配資源策略,所以對資源的利用率不高

答案為A,B

知識點:
死鎖是指因相互競爭資源使得系統中有多個阻塞進程相互等待的情況。
互斥,占有申請,非剝奪,循環等待只是死鎖的必要條件

12 . 在java中重寫方法應遵循規則的包括()

A: 訪問修飾符的限制一定要大於被重寫方法的訪問修飾符
B: 可以有不同的訪問修飾符
C: 參數列表必須完全與被重寫的方法相同
D: 必須具有不同的參數列表

答案為B,C

知識點:
方法的重寫(override)兩同兩小一大原則:
方法名相同,參數類型相同
子類返回類型小於等於父類方法返回類型,
子類拋出異常小於等於父類方法拋出異常,
子類訪問權限大於等於父類方法訪問權限。

13 . 關於ThreadLocal以下說法正確的是

A: ThreadLocal繼承自Thread
B: ThreadLocal實現了Runnable接口
C: ThreadLocal重要作用在於多線程間的數據共享
D: ThreadLocal是采用哈希表的方式來為每個線程都提供一個變量的副本
E: ThreadLocal保證各個線程間數據安全,每個線程的數據不會被另外線程訪問和破壞

答案為D,E

知識點:
1、ThreadLocal的類聲明:
public class ThreadLocal
可以看出ThreadLocal並沒有繼承自Thread,也沒有實現Runnable接口。所以AB都不對。
2、ThreadLocal類為每一個線程都維護了自己獨有的變量拷貝。每個線程都擁有了自己獨立的一個變量。
所以ThreadLocal重要作用並不在於多線程間的數據共享,而是數據的獨立,C選項錯。
由於每個線程在訪問該變量時,讀取和修改的,都是自己獨有的那一份變量拷貝,不會被其他線程訪問,
變量被徹底封閉在每個訪問的線程中。所以E對。
3、ThreadLocal中定義了一個哈希表用於為每個線程都提供一個變量的副本:

static class ThreadLocalMap {

        static class Entry extends WeakReference {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal k, Object v) {
                super(k);
                value = v;
            }
        }

        /**
         * The table, resized as necessary.
         * table.length MUST always be a power of two.
         */
        private Entry[] table;
}

所以D對。

14 .

public class Test
{
    public int x;
    public static void main(String args[])
    {
        System. out. println("Value is" + x);
    }
}

對於上面這段代碼,以下說法正確的是:

A: 程序會打出 “Value is 0”
B: 程序會拋出 NullPointerException
C: 非靜態變量不能夠被靜態方法引用
D: 編譯器會拋出 “possible reference before assignment”的錯誤

答案為C

知識點:假如變量沒有賦初始值,默認初始值為0,靜態方法不能夠使用靜態變量。

15 .以下方法,哪個不是對add方法的重載?

public class Test
{
public void add( int x,int y,int z){}
}

A: public int add(int x,int y,float z){return 0;}
B: public int add(int x,int y,int z){return 0;}
C: public void add(int x,int y){}
D: 以上都不是

答案為B

知識點:
區分不同重載函數的方法:注意點:返回值不同不能作為區分重載函數的標准

一.方法名一定要相同。
二.方法的參數表必須不同,包括參數的類型或個數,以此區分不同的方法體。
1.如果參數個數不同,就不管它的參數類型了!
2.如果參數個數相同,那麼參數的類型或者參數的順序必須不同。
三.方法的返回類型、修飾符可以相同,也可不同。

16 . class Foo {

final int i;
int j;
public void doSomething() {
    System.out.println(++j + i);
}

}
的輸出是?

A: 0
B: 1
C: 2
D: 不能執行,因為編譯有錯

答案為 D

知識點:final 修改時的i必須要賦初始值。

17 . java用()機制實現了進程之間的異步執行

A: 監視器
B: 虛擬機
C: 多個CPU
D: 異步調用

答案為 A

知識點:首先jvm中沒有進程的概念,但是jvm中的線程映射為操作系統中的進程,對應關系為1:1。那這道題的問的就是jvm中線程如何異步執行 。 在jvm中 是使用監視器鎖來實現不同線程的異步執行, 在語法的表現就是synchronized 。

18 . 關於volatile關鍵字,下列描述不正確的是?

A: 用volatile修飾的變量,每次更新對其他線程都是立即可見的。
B: 對volatile變量的操作是原子性的。
C: 對volatile變量的操作不會造成阻塞。
D: 不依賴其他鎖機制,多線程環境下的計數器可用volatile實現。

答案為:B,

知識點:
一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾之後,那麼就具備了兩層語義:
1)保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。
2)禁止進行指令重排序。
volatile只提供了保證訪問該變量時,每次都是從內存中讀取最新值,並不會使用寄存器緩存該值——每次都會從內存中讀取。
而對該變量的修改,volatile並不提供原子性的保證。
由於及時更新,很可能導致另一線程訪問最新變量值,無法跳出循環的情況
多線程下計數器必須使用鎖保護。

19 . What will be printed when you execute the following code?

class C {
C() {
System.out.print(“C”);
}
}

class A {
C c = new C();

A() {
    this("A");
    System.out.print("A");
}

A(String s) {
    System.out.print(s);
}

}

class Test extends A {
Test() {
super(“B”);
System.out.print(“B”);
}

public static void main(String[] args) {
    new Test();
}

}

答案為 CBB

知識點:考查類的執行順序

父類的靜態變量-父類的靜態塊-子類的靜態變量-子類的靜態塊-父類的普通變量,代碼塊,構造函數-子類的普通變量,代碼塊,構造函數

20 . Which statement declares a variable a which is suitable for referring to an array of 50 string objects?

A: char a[][];
B: String a[];
C: String[]a;
D: Object a[50];
E: String a[50];
F: Object a[];

答案為 B,C,F

知識點:

在java 中,聲明一個數組時,不能直接限定數組長度,只有在創建實例化對象時,才能對給定數組長度.。
如下,1,2,3可以通過編譯,4,5不行。而String是Object的子類,所以上述BCF均可定義一個存放50個String類型對象的數組。
1. String a[]=new String[50];
2. String b[];
3. char c[];
4. String d[50];
5. char e[50];

21 . 下面哪個不對?

A: RuntimeException is the superclass of those exceptions that can be thrown during the normal operation of the Java Virtual Machine.

B: A method is not required to declare in its throws clause any subclasses of RuntimeExeption that might be thrown during the execution of the method but not caught

C: An RuntimeException is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.

D: NullPointerException is one kind of RuntimeException

答案為 C

知識點:
這裡寫圖片描述

運行時錯誤一般是邏輯錯誤,數據越界,空指針等。

運行時異常: 都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。

非運行時異常 (編譯異常): 是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

22 . 下面代碼運行結果是()

public class Test{ 
    public int add(int a,int b){   
         try {
             return a+b;      
         } 
        catch (Exception e) {  
            System.out.println("catch語句塊");
         }
         finally{ 
             System.out.println("finally語句塊");
         }
         return 0;
    } 
     public static void main(String argv[]){ 
         Test test =new Test(); 
         System.out.println("和是:"+test.add(9, 34)); 
     }
}

A: catch語句塊
和是:43

B: 編譯異常

C: finally語句塊
和是:43

D: 和是:43
finally語句塊

答案為 C

知識點:不管trycatch是否拋出異常,finally必定會在return 退出函數前,調用。

23 . 以下哪個不是Collection的子接口?

A: List
B: Set
C: SortedSet
D: Map

答案為D

知識點:考查集合的接口分類

list裡面可以存放相同的元素,並且有序

set裡面不可以存放相同的元素,通過hashcode和equal來區別

vector是線程安全的,hashtable,stack也是線程安全的

這裡寫圖片描述

這裡寫圖片描述

24 . 下面有關 JAVA 異常類的描述,說法正確的有()

A: 異常的繼承結構:基類為 Throwable,Error 和 Exception 繼承 Throwable,RuntimeException 和 IOException 等繼承 Exception

B: 非 RuntimeException 一般是外部錯誤,其必須被 try{}catch 語句塊所捕獲

C: Error 類體系描述了 Java 運行系統中的內部錯誤以及資源耗盡的情形,Error 不需要捕捉

D: RuntimeException 體系包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等,必須 被 try{}catch 語句塊所捕獲

答案為 A,C

知識點:

這裡寫圖片描述

都是Throwable的子類:
1.Exception(異常) :是程序本身可以處理的異常。
2.Error(錯誤): 是程序無法處理的錯誤。這些錯誤表示故障發生於虛擬機自身、或者發生在虛擬機試圖執行應用時,一般不需要程序處理。
3.檢查異常(編譯器要求必須處置的異常) : 除了Error,RuntimeException及其子類以外,其他的Exception類及其子類都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句聲明拋出它,否則編譯不會通過。
4.非檢查異常(編譯器不要求處置的異常): 包括運行時異常(RuntimeException與其子類)和錯誤(Error)。

25 . 如下代碼,執行test()函數後,屏幕打印結果為()

public class Test2
{
    public void add(Byte b)
    {
        b = b++;
    }
    public void test()
    {
        Byte a = 127;
        Byte b = 127;
        add(++a);
        System.out.print(a + " ");
        add(b);
        System.out.print(b + "");
    }
}

A: 127 127
B: 128 127
C: 129 128
D: 以上都不對

答案為D

正確的答案為,-128,127

知識點:byte是八位,最高位為符號位,數據范圍為-128~127,當127++是數值溢出,變為-128,在Java中使用補碼表示負數,補碼就是將正數的所有二進制取反,最後加1

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved