Java基礎筆試練習(二)

Java基礎筆試練習(二)

1. HashMap的數據結構是怎樣的?

A.數組 B.鏈表 C.數組+鏈表 D.二叉樹java

答案: Cgit

解析:程序員

JDK8之後,HashMap的數據結構是數組+鏈表+紅黑樹github

2. 在 JAVA 編程中,Java 編譯器會將 Java 程序轉換爲( )?

A.字節碼 B.可執行代碼 C.機器代碼 D.以上都不對面試

答案:
Asql

解析:編程

  • 編譯器將Java源代碼編譯成字節碼class文件
  • 類加載到JVM裏面後,執行引擎把字節碼轉爲可執行代碼
  • 執行的過程,再把可執行代碼轉爲機器碼,由底層的操做系統完成執行。

3.下面有關JVM內存,說法錯誤的是?

A.程序計數器是一個比較小的內存區域,用於指示當前線程所執行的字節碼執行到了第幾行,是線程隔離的 B.Java方法執行內存模型,用於存儲局部變量,操做數棧,動態連接,方法出口等信息,是線程隔離的 C.方法區用於存儲JVM加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據,是線程隔離的 D.原則上講,全部的對象都在堆區上分配內存,是線程之間共享的數組

答案: C瀏覽器

解析: 運行時數據區包括:虛擬機棧區,堆區,方法區,本地方法棧,程序計數器安全

  • 虛擬機棧區:也就是咱們常說的棧區,線程私有,存放基本類型,對象的引用和 returnAddress ,在編譯期間完成分配。
  • 堆區:JAVA 堆,也稱 GC 堆,全部線程共享,存放對象的實例和數組, JAVA 堆是垃圾收集器管理的主要區域。 -方法區:全部線程共享,存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據。這個區域的內存回收目標主要是針對常量池的對象的回收和對類型的卸載。
  • 程序計數器:線程私有,每一個線程都有本身獨立的程序計數器,用來指示下一條指令的地址。
  1. JAVA中,下列語句哪個正確()

A.class中的constructor不可省略 B.constructor必須與class同名,但方法不能與class同名 C.constructor在一個對象被new時執行 D.一個class只能定義一個constructor

答案: C

解析: A 省略構造函數,編譯器會自動生成。 D 構造函數能夠重載 B 方法是能夠和類名同名的,和構造方法惟一的區別就是,構造方法沒有返回值。

5.在JAVA中,假設A有構造方法A(int a),則在類A的其餘構造方法中調用該構造方法和語句格式應該爲()

A.this.A(x) B.this(x) C.super(x) D.A(x)

答案: B

解析: this的做用其中一個就是在一個構造方法中調用另外一個構造方法,格式爲this(參數); super是調用父類的方法; A(a)這種形式是在new一個類時使用。

6.下列選項中屬於面向對象程序設計語言特徵的是()

A.繼承性 B.多態性 C.類似性 D.封裝性

答案: A B D

解析: 面對對象三大特徵:封裝,繼承,多態

7.如下哪一個正確?

A.abstract類只能用來派生子類,不能用來建立abstract類的對象。 B.final類不但能夠用來派生子類,也能夠用來建立final類的對象。 C.abstract不能與final同時修飾一個類。 D.abstract類定義中能夠沒有abstract方法。

答案: A C D

解析: 一、abstract類不能用來建立abstract類的對象; 二、final類不能用來派生子類,由於用final修飾的類不能被繼承; 三、如2所述,final不能與abstract同時修飾一個類,abstract類就是被用來繼承的; 四、類中有abstract方法必須用abstract修飾,但abstract類中能夠沒有抽象方法,接口中也能夠有abstract方法。

8. JAVA反射機制主要提供瞭如下哪些功能?

A.在運行時判斷一個對象所屬的類 B.在運行時構造一個類的對象 C.在運行時判斷一個類所具備的成員變量和方法 D.在運行時調用一個對象的方法

答案: A B C D

解析: Java反射機制主要提供瞭如下功能: 在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具備的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。 所以,答案爲:ABCD

9.如下關於Histroy對象的屬性或方法描述正確的是()

A.bcak回到瀏覽器載入歷史URL地址列表的當前URL的前一個URL B.go表示刷新當前頁面 C.length保存歷史URL地址列表的長度信息 D.forward轉到瀏覽器載入歷史URL地址列表的當前URL的下一個URL。

答案: A D

解析:

選A、D。考察的是瀏覽器的內置對象管理模型,簡稱BOM(Browser Object Model)中的Histroy屬性和方法。

  • length 返回瀏覽器歷史列表中的URL數量。因此C中表述的長度信息是錯誤的。
  • back() 加載 history列表中的前一個URL。
  • forward() 加載 history 列表中的下一個URL。
  • go() 加載history列表中的某個具體頁面。因此B的表述刷新當前頁面是錯誤的。

10.

public class NameList
{
    private List names = new ArrayList();
    public synchronized void add(String name)
    {
        names.add(name);
    }
    public synchronized void printAll()     {
        for (int i = 0; i < names.size(); i++)
        {
            System.out.print(names.get(i) + 」」);
        }
    }
 
    public static void main(String[]args)
    {
        final NameList sl = new NameList();
        for (int i = 0; i < 2; i++)
        {
            new Thread()
            {
                public void run()
                {
                    sl.add(「A」);
                    sl.add(「B」);
                    sl.add(「C」);
                    sl.printAll();
                }
            } .start();
        }
    }
}

複製代碼

Which two statements are true if this class is compiled and run?

A.An exception may be thrown at runtime. B.The code may run with no output, without exiting. C.The code may run with no output, exiting normally(正常地). D.The code may rum with output 「A B A B C C 「, then exit. E.The code may rum with output 「A B C A B C A B C 「, then exit. F.The code may ruin with output 「A A A B C A B C C 「, then exit. G.The code may ruin with output 「A B C A A B C A B C 「, then exit.

答案: E G

解析:

在每一個線程中都是順序執行的,因此sl.printAll();必須在前三句執行以後執行,也就是輸出的內容必有(連續或非連續的)ABC。而線程之間是穿插執行的,因此一個線程執行 sl.printAll();以前可能有另外一個線程執行了前三句的前幾句。 E答案至關於線程1順序執行完而後線程2順序執行完。 G答案則是線程1執行完前三句add以後線程2插一腳執行了一句add而後線程1再執行 sl.printAll();輸出ABCA。接着線程2順序執行完輸出ABCABC 輸出加起來即爲ABCAABCABC。

11. 關於容器下面說法正確的是? ( )

A.列表(List)和集合(Set)存放的元素都是可重複的。 B.列表(List)和集合(Set)存放的元素都是不可重複的。 C.映射(Map)<key,value>中key是能夠重複的。 D.映射(Map)<key,value>中value是能夠重複的。

答案: D

解析: 列表(List)的元素是有序、可重複的; 集合(Set)的元素是無序、不可重複的。

12.如下說法錯誤的是?()

A.數組是一個對象 B.數組不是一種原生類 C.數組的大小能夠任意改變 D.在Java中,數組存儲在堆中連續內存空間裏

答案: C

解析: 在java中,數組是一個對象,不是一種原生類,對象因此存放在堆中,又由於數組特性,是連續的,只有C不對

13.下列哪一個修飾符可使在一個類中定義的成員變量只能被同一包中的類訪問?

A.private B.無修飾符 C.public D.protected

答案: B

解析:

解析

14.關於如下程序代碼的說明正確的是?

public class HasStatic {
	private static int x = 100;

	public static void main(String args[]) {
		HasStatic hs1 = new HasStatic();
		hs1.x++;
		HasStatic hs2 = new HasStatic();
		hs2.x++;
		hs1 = new HasStatic();
		;
		hs1.x++;
		HasStatic.x--;
		System.out.println("x=" + x);
	}
}

複製代碼

A.程序經過編譯,輸出結果爲:x=103 B.10行不能經過編譯,由於x是私有靜態變量 C.5行不能經過編譯,由於引用了私有靜態變量 D.程序經過編譯,輸出結果爲:x=102

答案: D

解析: 此題選擇D。 首先要了解static的意思。

static表示「全局」或者「靜態」的意思,用來修飾成員變量和成員方法,也能夠造成靜態static代碼塊,可是Java語言中沒有全局變量的概念。 static變量在第一次使用的時候初始化,但只會有一份成員對象。 因此這裏不只能夠調用,並且每一次調用都確實修改了x的值,也就是變化狀況是這樣的: x=101 x=102 x=103 x=102

15.如何放掉一個指定佔據的內存空間?()

A.調用free()方法 B.代用system.gc()方法 C.賦值給該項對象的引用爲null D.程序員沒法明確強制垃圾回收器運行

答案: D

解析: 在《java虛擬機》一書中明確講了,釋放掉佔據的內存空間是由gc完成,可是程序員沒法明確強制其運行,該空間在不被引用的時候不必定會當即被釋放,這取決於GC自己,沒法由程序員經過代碼控制。

16.通常狀況下,如下哪一個選項不是關係數據模型與對象模型之間匹配關係?

A.表對應類 B.記錄對應對象 C.表的字段對應類的屬性 D.表之間的參考關係對應類之間的依賴關係

答案: D

解析: 通常關係數據模型和對象數據模型之間有如下對應關係:表對應類,記錄對應對象,表的字段對應類的屬性

17.下列關於Java併發的說法中正確的是()

A.CopyOnWriteArrayList適用於寫多讀少的併發場景 B.ReadWriteLock適用於讀多寫少的併發場景 C.ConcurrentHashMap的寫操做不須要加鎖,讀操做須要加鎖 D.只要在定義int類型的成員變量i的時候加上volatile關鍵字,那麼多線程併發執行i++這樣的操做的時候就是線程安全的了

答案: B

解析: A,CopyOnWriteArrayList適用於寫少讀多的併發場景 B,ReadWriteLock即爲讀寫鎖,他要求寫與寫之間互斥,讀與寫之間互斥,讀與讀之間能夠併發執行。在讀多寫少的狀況下能夠提升效率 C,ConcurrentHashMap是同步的HashMap,讀寫都加鎖 D,volatile只保證多線程操做的可見性,不保證原子性

18.如下代碼執行後輸出結果爲( )

public class Test
{
    public static Test t1 = new Test();
    {
         System.out.println("blockA");
    }
    static
    {
        System.out.println("blockB");
    }
    public static void main(String[] args)
    {
        Test t2 = new Test();
    }
 }

複製代碼

A.blockAblockBblockA B.blockAblockAblockB C.blockBblockBblockA D.blockBblockAblockB

答案: A

解析: 靜態塊:用static申明,JVM加載類時執行,僅執行一次 構造塊:類中直接用{}定義,每一次建立對象時執行 執行順序優先級:靜態塊>main()>構造塊>構造方法 靜態塊按照申明順序執行,先執行Test t1 = new Test(); 全部先輸出blockA,而後執行靜態塊,輸出blockB,最後執行main 方法中的Test t2 = new Test();輸出blockA。

19.有關hashMap跟hashTable的區別,說法正確的是?

A.HashMap和Hashtable都實現了Map接口 B.HashMap是非synchronized,而Hashtable是synchronized C.HashTable使用Enumeration,HashMap使用Iterator D.HashMap容許將 null 做爲一個 entry 的 key 或者 value,而 Hashtable 不容許。

答案: ABCD

解析:

A正確。Map是一個接口,hashtable,hashmap都是它的實現。 B正確。因爲Hashtable是線程安全的也是synchronized,因此在單線程環境下它比HashMap要慢。若是你不須要同步,只須要單一線程,那麼使用HashMap性能要好過Hashtable。 C正確。HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。因此當有其它線程改變了HashMap的結構(增長或者移除元素),將會拋出ConcurrentModificationException,但迭代器自己的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並非一個必定發生的行爲,要看JVM。這條一樣也是Enumeration和Iterator的區別。 D正確。 哈希值的使用不一樣,HashTable直接使用對象的hashCode,代碼是這樣的:

int hash = key.hashCode();
      int index = (hash & 0x7FFFFFFF) % tab.length;
複製代碼

而HashMap從新計算hash值,並且用與代替求模: int hash = hash(k); int i = indexFor(hash, table.length);

20.如下能夠正確獲取結果集的有?

A.Statement sta=con.createStatement(); ResultSet rst=sta.executeQuery(「select * from book」);

B.Statement sta=con.createStatement(「select * from book」); ResultSet rst=sta.executeQuery();

C.PreparedStatement pst=con.prepareStatement(); ResultSet rst=pst.executeQuery(「select * from book」);

D.PreparedStatement pst=con.prepareStatement(「select * from book」); ResultSet rst=pst.executeQuery();

答案: A D

解析: A,D是正確的;建立Statement是不傳參的,PreparedStatement是須要傳入sql語句 說一下preparedStatement和statement的區別與聯繫:在JDBC應用中,若是你已是稍有水平開發者,你就應該始終以PreparedStatement代替Statement.也就是說,在任什麼時候候都不要使用Statement。
PreparedStatement 接口繼承 Statement,PreparedStatement 實例包含已編譯的 SQL 語句,因此其執行速度要快於Statement對象。Statement爲一條Sql語句生成執行計劃,若是要執行兩條sql語句select colume from table where colume=1;select colume from table where colume=2; 會生成兩個執行計劃一千個查詢就生成一千個執行計劃! PreparedStatement用於使用綁定變量重用執行計劃 select colume from table where colume=:x; 經過set不一樣數據只須要生成一次執行計劃,能夠重用

推薦

Java筆試內容集合 持續更新中....

文末

歡迎關注我的微信公衆號:Coder編程 獲取最新原創技術文章和免費學習資料,更有大量精品思惟導圖、面試資料、PMP備考資料等你來領,方便你隨時隨地學習技術知識!

文章收錄至

Github: github.com/CoderMerlin…

Gitee: gitee.com/573059382/c… 歡迎關注並star~

微信公衆號
相關文章
相關標籤/搜索