Java基礎面試題


 

1. 列出JAVA中所有基本數據類型,並說明這些數據類型占用的字節數??

  java的原始數據類型,也可以叫java的基本數據類型,一共就8個,分別是:byte、short、int、long、boolean、char、float、double

    byte 1個字節

    boolean 1個字節

    char 2個字節

    short 2個字節

    int 4個字節

    long 8個字節

    float 4個字節

    double 8個字節

2.continue和 break有什么區別?

break和continue都是用來控制循環結構的。

  1. break:提前終止循環可以使用break來完成。break完全結束一個循環,跳出循環體執行循環后面的語句。
  2. continue:理解為continue是跳過當次循環中剩下的語句,執行下一次循環。
  3. 區別:continue只終止本次循環,break則完全終止循環

3.i++和++i的區別?

  1. i++ 理解為:先用i值后加1, 比如int j=i++; 如果i的初值是1,那么表達式i++的整體值就是1,然后,i的值就變成了2,最后執行賦值運算,將i++整體的值1,賦值給j,j為1。
  2. ++i 理解為:先加1后用i值,比如int j=++i;如果i的初值是1,首先i增加1為2,然后用i的值2最為++i整體表達式的值,最后進行賦值運算,將++i表達式的值2賦值給j,j為2。

注意:這兩個表達式在計算時,=號賦值計算,都是最后發生的,是非常常見的考點。

4.面向對象的特征有哪些方面?

  三大特性是:封裝,繼承,多態

  1. 所謂封裝,也就是把客觀事物抽象封裝成類。封裝是面向對象的特征之一。
    1. 簡單的說,一個類就是一個封裝了數據以及操作這些數據的算法。
    2. 對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。
  2. 所謂繼承是指可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。
    1. 通過繼承創建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。
    2. 子類是對父類功能的擴展
    3. 實際開發中父類往往是從子類泛化而來,父類中的屬性和方法是從子類中抽象來的。
  3. 所謂多態就是指一個父類具體子類實例的相同方法執行出不同表現。
    1. 多態機制使具有不同對象可以共享相同的外部接口方法。
    2. 這意味着,可以通過相同的方式調用具體對象功能不同方法。

5.靜態變量和實例變量的區別?

  1. 在語法定義上的區別:
    • 靜態變量前要加static 關鍵字,而實例變量前則不加。
  2. 在程序運行時的區別:
    1. 實例變量屬於某個對象的屬性,必須創建了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量。
    2. 靜態變量不屬於某個實例對象,而是屬於類,所以也稱為類變量。
    3. 實例變量必須創建對象后才可以通過這個對象來使用,靜態變量則可以直接使用類名來引用。

6.Overload(重載)和Override(重寫)的區別?

  1. 重寫必須繼承,重載不用。
  2. 重寫的方法名,參數數目相同,參數類型兼容,重載的方法名相同,參數列表不同。
  3. 重寫的方法修飾符大於等於父類的方法,重載和修飾符無關。
  4. 重寫不可以拋出父類沒有拋出的一般異常,可以拋出運行時異常

7.多態的表現形式有哪些?

  重寫和重載。向上造型

5.abstract class和interface有什么區別?

  1. 含有abstract修飾符的class即為抽象類,abstract類不能創建的實例對象。
  2. abstract class類中定義抽象方法必須在具體子類中實現。
  3. 如果的子類沒有實現抽象父類中的所有抽象方法,那么子類也必須定義為abstract類型。
  4. 接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認為public abstract類型,接口中的成員變量類型默認為public static final。

6.接口是否可以繼承接口?抽象類是否可以實現(implements)接口? 抽象類是否可以繼承具體類?

  1. 接口可以繼承接口,可以繼承多個接口
  2. 抽象類可以實現接口,可以實現多個接口
  3. 抽象類可以繼承具體類,但只能繼承一個類

7.GC是什么?GC的作用

  1. GC是垃圾收集的意思
  2. Java提供的GC功能可以自動監測回收不被引用的對象,釋放其占用的內存,
  3. 垃圾收集器會自動進行管理。
  4. 如果要請求垃圾收集,可以調用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),這些方法會通知GC盡快進行內存垃圾回收。
  5. 在對象使用以后要及時釋放其引用,有利於垃圾回收,可以有效的防止內存泄露。

8.說出ArrayList,LinkedList的儲存性能和特性?

  1. ArrayList 采用的是數組形式來保存對象的,這種方式將對象放在連續的位置中,優點是索引讀取快,從最后插入和刪除元素速度快,但是頭部插入和刪除慢。
  2. LinkedList使用雙向循環鏈表方式存儲數據,所以頭尾插入或讀取插入的速度快,而中部插入和讀取慢.

9.HashMap 和 Hashtable 的區別

  1. 歷史原因:Hashtable 是陳舊API,HashMap 是Java 1.2 引進的Map 接口的一個實現
  2. 同步性:Hashtable 是線程安全的,也就是說是同步的,而HashMap 是線程序不安全的,不是同步的。由於同步檢查所以Hashtable性能稍慢。
  3. 值:HashMap 可以插入一個null的key-value

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

  1. List特點:元素有順序,元素可重復
  2. Set特點:元素無順序,元素不可重復(注意:元素雖然無順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的)
  3. Map特點:元素按鍵值對存儲,無順序

11.隊列和棧是什么,列出它們的區別?

  1. 隊列(Queue)是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。
  2. 棧(Stack)是限定只能在表的一端進行插入和刪除操作的線性表。
  3. 隊列先進先出(FIFO),棧先進后出(FILO)。

12.String與StringBuffer的區別,StringBuffer和StringBuilder的區別是什么?

  1. String是不可變的,StringBuffer是可變的;StringBuffer是線程安全的,StringBuilder是非線程安全的。
  2. 由於字符串鏈接會自動創建StringBuilder對象,為了避免復雜字符串拼接時候大量創建StringBuilder對象,可以利用StringBuilder優化字符串鏈接操作。
  3. StringBuilder是jdk5之后新增的,其用法與StringBuffer完全一致,但它是線程不安全的,在單線程中最佳,因為其不需要維護線程的安全,因此是最快的。

  標簽: String StringBuffer StringBuilder

13.String類能不能被繼承,為什么?

  不能被繼承,因為String類是final類,final修飾的類是不能被繼承

14.“==”和“equals”的區別

  1. ==是值比較,對於引用類型變量==是判斷引用的值是否是同一個對象地址值,如果是相同對象其內容也一定是相同的
  2. equals方法判斷的是對象的內容是否相同,由於其默認方法采用的==進行引用比較,所以需要重寫為按照對象內容比較是否相同。

15.HashSet 和 HashMap 區別?

  1. HashMap :實現Map接口;使用hash算法,里面的數據是無序的;並且存儲的是鍵值對;
  2. HashSet :實現了Set接口;內部封裝了HashMap,故也是無序的;HashSet本質就是HashMap,數據存儲到HashSet的Key部分,Value部分被屏蔽不使用了。

16.描述棧,隊列中元素的出入順序。

  1. 棧的數據結構是,先進后出(FILO),也可以說是后進先出
  2. 隊列的數據結構是,先進先出(FIFO)

17.Comparable和Comparator接口是干什么的?列出它們的區別。

  1. Comparable接口
    1. 實現Comparable接口類表示這個類型的對象可以進行比較大小的。 這種可以比較大小的對象可以進行自然排序。
  2. Comparator接口
    1. 比較器用於實現對象任意屬性進行比較大小。
    2. 在排序時候可以通過指定屬性比較器實現任意屬性排序。
  3. 在排序時候Comparable接口用於進行自然排序,而Comparator接口進行自定義排序,自定義排序更加靈活方便而常用。
  4. 設計上Comparable不推薦使用,因為對程序本身具有侵入性。

18.Java中異常處理機制?

  1. Java異常是一個消息傳播機制,如果不被處理將繼續傳播並且打斷當前程序的執行。
  2. Java使用面向對象的方式來傳播異常消息,發生的每個異常被封裝到一個異常對象,該對象中包含有異常的信息。
  3. Java中使用try catch finally 語法捕獲處理異常消息。

19.創建線程有幾種不同的方式?

  在應用開發中有三種方式可以用來創建線程:

  1. 繼承Thread類,並且創建對象。
  2. 實現Runnable接口,將Runnable接口的具體對象作為參數創建Thread對象。
  3. 另外也可以使用Executer創建並重用線程

20.當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?

  可以進入其他非synchronized的方法,synchronized的方法不可以的!

  1. Java中的每個對象都有一個鎖(lock)或者叫做監視器(monitor)
  2. 當一個線程訪問對象的synchronized方法時,將在對象上鎖,方法不能並發執行。
  3. 此時其他任何線程都得阻塞等待到當前線程方法執行結束后,才能有機會執行方法。
  4. 也就是說線程排到一個接着一個執行 synchronized的方法。

21.請描述TCP。

  TCP是傳送控制協議

  1. 是面向連接的可靠數據傳輸協議,TCP會確保數據會可靠的傳輸到對方.
  2. 使用步驟:先建立可靠連接---利用連接中的雙向通訊流傳輸數據-----通訊結束以后,需要關閉連接.
  3. java利用Socket和ServerSocketAPI封裝了TCP通訊過程,利用這兩個類即可實現TCP通訊。
  4. HTTP通訊的底層是TCP協議。

22.java中多線程是什么?

  1. Java中並發運行多個流程的能力。每一個流程稱為一個線程。
  2. Java的Thread API封裝了線程控制過程。
  3. 創建線程對象后調用start方法就可以將線程提交到操作系統執行。
  4. 線程最終是由操作系統調度執行的。

23.線程進程的基本概念、線程的基本狀態以及狀態之間的關系

  1. 一個線程是進程的一個順序執行流程。一個進程中的全部線程共享同一個堆空間。線程本身有一個供程序執行時的棧,一個進程中可以包含多個線程。
  2. 新建、就緒、運行狀態、阻塞狀態、死亡狀態
  3. 新建狀態:利用NEW運算創建了線程對象,此時線程狀態為新建狀態,調用了新建狀態線程的start()方法,將線程提交給操作系統,准備執行,線程將進入到就緒狀態。
  4. 就緒狀態:由操作系統調度的一個線程,沒有被系統分配到處理器上執行,一旦處理器有空閑,操作系統會將它放入處理器中執行,此時線程從就緒狀態切換到運行時狀態。
  5. 運行狀態:線程正在運行的過程中,碰到調用Sleep()方法,或者等待IO完成,或等待其他同步方法完成時,線程將會從運行狀態,進入到阻塞狀態。
  6. 死亡狀態:線程一旦脫離阻塞狀態時,將重新回到就緒狀態,重新向下執行,最終進入到死亡狀態。一旦線程對象是死亡狀態,就只能被GC回收,不能再被調用。

24.XML解析技術有哪些?它們的區別是什么?

  常見的有SAX,DOM,DOM4J

  1. SAX:SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。
  2. DOM:DOM的利用SAX進行讀取的,讀取以后緩存到內存中成為DOM對象,處理大型文件時內存耗用較高。
  3. DOM4J:由於DOM API使用過於繁瑣,JAVA的開源組織開發了DOM4J,底層封裝了DOM,提供JAVA Bean風格的API,使用非常簡潔。

25.什么是節點流,什么是過濾流,並且說出常用的節點流和過濾流?

  1. 節點流:有明確的數據源,從數據源讀取基礎的字節數據,或向數據源寫入字節數據。
  2. 過濾流:依賴於其他流,不能單獨使用,並且都提供了高級功能,使用起來更加方便。
  3. FileInputStream FileOutputStram
  4. BufferedInputStream BufferedOutputStream
  5. ObjectInputStream ObjectOutputStream

26.BufferedReader屬於哪種流,它主要是用來做什么的,它里面有那些經典的方法?

  1. BufferedReader只能連接在其他字符流上,所以屬於字符流,其底層需要依賴於其他的字符流,或者字節流。
  2. BufferedReader提供了字符緩沖功能,能夠一定程度上的提升IO性能。
  3. 提供了經典的方法readLine()方法,可以從目標流中,讀取一行文本。

27.字符流和字節流的區別?並且他們的父類叫什么?

  1. JAVA中最基本的流是字節流,任何流的底層都是字節流。
  2. 字符流是以字符為單位進行讀寫的流,大部分的實現類是高級流,其底層一定基於字節流,字符流在字節流基礎之上,擴展了字符編碼解碼功能。
  3. 字節流的抽象父類:InputStream OutputStream
  4. 字符流的抽象父類:Reader Writer

28.什么叫對象序列化,什么是反序列化,實現對象序列化需要做哪些工作?

  1. 對象序列化,將對象中的數據編碼為字節序列的過程。
  2. 反序列化;將對象的編碼字節重新反向解碼為對象的過程。
  3. JAVA提供了API實現了對象的序列化和反序列化的功能,使用這些API時需要遵守如下約定。
    1. 被序列化的對象類型需要實現序列化接口,此接口是標志接口,沒有聲明任何的抽象方法,JAVA編譯器識別這個接口,自動的為這個類添加序列化和反序列化方法。
    2. 為了保持序列化過程的穩定,建議在類中添加序列化版本號。
    3. 不想讓字段放在硬盤上就加transient

29.簡述HashMap的工作原理?

  1. HashMap是面向查詢優化的數據結構,查詢性能優異。
  2. 在其內部利用數組存儲數據。
  3. 插入數據時,先根據Key的HashCode計算出數組的下標位置,再利用Key的equals()方法檢查是否以存在重復的Key,如果不重復直接存儲到數組中,如果重復就作為鏈表存儲到散列桶中。
  4. 插入的數據和數組容量的比值大於加載因子則進行數組擴容,並重新散列,默認的加載因子為“0.75”。
  5. 查詢時,先根據Key的HashCode計算出數組的下標位置,再利用Key的equals()方法檢查到Key的位置,如果找到返回Key對應的Value,否則返回Null。
  6. 由於利用Key的HashCode直接計算出數據的存儲位置,由於直接確定數據的存儲位置,相對於其他查找方式,查詢效率非常高。

30.什么是反射機制?

  Java 動態執行機制,可以實現動態執行功能:

  1. 反射提供了在運行時判斷任意一個對象所屬的類型,並可以檢查解析類型的內部結構。
  2. 反射可以動態加載類型,並能夠動態創建對象
  3. 反射可以動態訪問對象的屬性。
  4. 反射可以動態執行對象的方法。
  5. 利用反射API還可以動態的訪問,不可見的屬性和方法

31.哪里用到反射機制?

  1. JDBC中,利用反射動態加載了數據庫驅動程序。
  2. Web服務器中利用反射調用了Sevlet的服務方法。
  3. Eclispe等開發工具利用反射動態刨析對象的類型與結構,動態提示對象的屬性和方法。
  4. 很多框架都用到反射機制,注入屬性,調用方法,如Hibernate、Struts2、Spring。

32.反射機制的優缺點?

  1. 優點:可以動態執行!在運行期間根據業務功能動態執行方法、訪問屬性,最大限度發揮了java的靈活性。
  2. 缺點:對性能有影響,這類操作總是慢於直接執行java代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM