作為一名程序猿,你不可不知的Java基礎知識的三十個經典問答

java架構師丨蘇先生 發佈 2020-03-08T11:21:48+00:00

1. 面向對象的特點抽象:抽象是或略一個主題中與當前目標的無關的因素,一邊充分考慮有關的內容。抽象並不能解決目標中所有的問題,只能選擇其中的一部分,忽略其他的部分。抽象包含兩個方面:一是過程抽象;一是數據抽象。


1. 面向對象的特點

抽象

抽象是或略一個主題中與當前目標的無關的因素,一邊充分考慮有關的內容。抽象並不能解決目標中所有的問題,只能選擇其中的一部分,忽略其他的部分。抽象包含兩個方面:一是過程抽象;一是數據抽象。

繼承

繼承是一種聯接類的層次模型,允許和鼓勵類的重用,提供了一種明確的共性的方法。對象的一個新類可以從現有的類中派生,這叫做類的繼承。心累繼承了原始類的特性,新類稱為原始類的派生類或者是子類,原始類稱為新類的基類或者父類。子類可以從父類那裡繼承父類的方法和實現變量,並卻允許新類增加和修改新的方法使之滿足需求。

封裝

封裝就是把過程和數據包圍起來。對數據的訪問只是允許通過已經定義好的介面。面向對象就是基於這個概念,即現實世界可以描述為一系列完全自治,封裝的對象,這些對象通過固定受保護的接口訪問其他對象。

多態

多態性是指不同類的對象對同一個請求作出相應。多態性包括參數多態和包含多態。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢。很好的解決了應用程式中同名的問題。

2. int 和 Integer 有什麼區別

java提供了兩種類型:引用類型和原始類型(內置類型)。int是java的原始數據類型,Integer是java為int提供的封裝類。

java為每一種數據類型提供了自己的封裝類:

引用類型和原始類型的行為完全不同,並且他們具有不同的語義,引用類型和原始類型具有不同的特徵和用法,他們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型有用作某個類的實例數據時制定的預設值。對象應用實例變量的預設值為null,而原始類型實例變量的預設值與它們的類型有關。

3. final、finally、finalize的區別

  • final是一種聲明屬性,作用與類、方法和變量;final修飾的變量的值不能夠再改變,final修飾的方面不能被覆蓋,final修飾的類不能被繼承。
  • finally是異常處理語句的一部分,表示總是執行。
  • finalize是object類的一個子方法,在垃圾回收器執行是調用回收對象的此方法,此方法可以被覆蓋提供資源回收時的其他資源回收。如文件關閉等。

4. heap和stack的區別

棧是一種現行結構,其添加和刪除元素應在同一段完成,棧按照先進後出的方式進行處理。

堆是棧的一個組成元素。

5. 基本的數據類型

byte,int,long,double,char,boolean,float,short

String不是基本數據類型,java.util.String是final類,因此不能修改這個類,不能繼承這個類。

為了節省空間,提高效率我們應該用StringBuffer。

6. assert什麼時候使用?

assertion(斷言)在軟體開發中使用中常見的調試方式,很多程式語言中都支持這種機制,在實現中,assertion就是在程序中的一條語句,他對一個boolean表達式進行檢查,一個正確的程序必須保證這個boolean表達式的值是true。如果該值為false,說迷宮程序已經處於不正確的狀態了,系統將給出警告或者退出。一般來說assertion用來保證程序最基本、關鍵的正確性,assertion檢查通常在開發和測試時啟動,為了提高效率,在軟體發布後,assertion檢查通常是關閉的。

7. GC是什麼?為什麼要有GC?

GC是垃圾回收的意思(gabage collection),內存處理器是編程人員容易出現問題的地方,忘記或者錯誤的內存回收導致程序或者系統的不穩定甚至崩潰,java的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,java語言沒有提供釋放已分配內存的俄顯示操作方法。

8. 啟動線程使用run()還是start()?

啟動一個線程用start()方法,使線程所代表的虛擬處理機處於可運行的狀態,這意味著它可以有JVM(java虛擬機)來調度和執行,這並不意味著線程就會立即執行。run()方法可以產生必須退出的標誌來停止一個線程。

9. 構造器Constructor是否可以被override?

構造器(override)不能被繼承,因此不能重寫overriding,但是可以被重載overloading。

10. 當一個對象作為參數傳遞給一個方法後,此方法可以給便這個對象的屬性,並可以返回變化後的結果,那麼這裡到底是值的傳遞還是引用傳遞?

是值得傳遞。java語言中只有值傳遞參數,對一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用,對象的內容可以在被調用的方法中改變,但對象的引用是永遠改變不了的。

11. 垃圾回收機制的優點,並考慮2種回收機制。

java語言中一個顯著的特點就是引入了垃圾回收機制,使C++程式設計師最頭痛的內存管理問題迎刃而解,他使得java程式設計師在編寫承學的哦時候不用再考慮內潤管理問題了,由於有了垃圾回收機制,java中的對象不再有「作用域」的概念,只是在對象引用的時候才有「作用域」,垃圾回收可以有效的防止內存泄漏,有效的使用可以使用的內存。

垃圾回收器通常作為一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚的哦回收,承諾過許願程式設計師不能實時的調用來幾回收器對某個對象或所有對象進行垃圾回收,回收機制有分帶複製來幾回收和標記垃圾回收,增量垃圾回收。

12. char型變量中能不能存儲一個中文漢字?為什麼?

能夠存儲一個漢字。

因為java中以unicode編碼,一個char占16個字節,多億放一個中文是沒有問題的。

13. jsp中的內置對象

  • request——表示HttpServletRequest對象,它包含了有關瀏覽器請求的信息,並且提供了幾個用於獲取cookie,header和session數據的游泳的方法。
  • response——表示HttpServletResponse對象,提供了幾個用於設置送回瀏覽器響應的方法(如cookie頭信息等)。
  • out——對象是java.jsp.JspWriter的一個實例,提供了幾種方法使你能用於想瀏覽器返回輸出結果。
  • pageContext——表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各種範圍的名字空間、servlet相關的對象的API,並且包裝了通用的servlet相關的功能的方法。
  • session——表示一個請求的javax.servlet.http.HttpSession對象,session可以村相互用戶的狀態信息。
  • application——表示一個javax.servlet.ServletContext對象,這有助於查找有關servlet引擎和servlet環境的信息。
  • config——表示一個javax.servlet.ServletConfig對象,該對象用於存取servlet實例的初始化數據。
  • page——表示從該頁面產生的一個servlet實例。

14. jsp和servlet有奶俄相同點和不同點?他們之間的聯繫是什麼?

jsp是servlet技術的擴展,本質上是servlet的簡易方式,強調應用的表現和表達,jsp編譯後是「類servlet」,servlet和jsp最主要的不同點在於,servlet的應用邏輯是在java文件中,並且完全從表示層中的html里分離出來,而jsp的情況但是java和html可以組合成一個擴展名為.jsp的文件,jsp側重於視圖,servlet主要用於控制邏輯。

15. 匿名內部類(Anonymous Inner Class)是否可繼承其他類,是否可以實現接口?

可以繼承其他類或完成其他接口,在swing編程中常用此方式。

16. HashMap和HashTable的區別

HashMap是HashTable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空鍵值(key),鬱郁非線程安全,效率上可能高於HashTable。

17. String s=new String("abc");創建了幾個對象?

創建了兩個 一個是「abc」 一個是指向「abc」對象的 S 對象。

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

Math.round(11.5)==12,Math.round(-11.5)==-11,

return方法返回與參數最接近的長整數,參數加1/2後求其floor。

19. sleep()和wait()的區別?

sleep是線程類(thread)的方法。導致此線程暫停執行之地昂時間,給執行的機會給其他線程,但是監控狀態依然保持,到時候後自動回復,調用sleep不會釋放對象鎖。

wait是object類的方法,對此對象發出wait方法導致本線程放棄對象鎖,進入等待此對象的的呢古代鎖定池,只有針對此對象發出notify方法(或者notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

20. 數組有沒有length()這個方法?String有沒有length()這個方法?

數組沒有length()這個方法,有length方法。

String有length()方法。

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

方法的重寫OVerriding和重載Overloading是Java多態的不同表現,

重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現,

如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫(Voerriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被屏蔽了,如果在一個類中定義了多個同名的方法,他們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overriding),Overriding的方法是可以改變返回值的類型。

22. Set里的元素是不是能夠重複的,那麼用什麼方法來區分重複與否呢?使用==還是用equals()?他們有什麼區別?

Set里的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()方法是判斷兩個Set是否相等。

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

23. error和exception 的區別

  • error表示恢復不是不可能但是很困難的情況下的一種嚴重問題。比如說內存溢出,不可能指望程序能處理之中情況。
  • exception表示一種設計或實現問題。也就是說,他表示如果程序運行正常,從不會發生的情況。

24. abstract class和interface有什麼區別?(抽象類與接口的區別)

聲明方法的存在不去實現他的類被叫做抽象類(abstrct class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在類終中實現該類的情況,不能創建abstract類的實例。然而可以創建一個變量,其類型就是一個抽象類,並讓他指向具體的子類的一個實例。不能有抽象構造函數或抽象靜態方法,abstract類的子類為他們的父類中的所有抽象方法提供實現,否則他們也是抽象類為,取而代之,在子類中是實現該方法。知道其行為的其他類可以在類中實現這些方法。

接口(interface)是抽象類的變體,在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體,接口只可以定義static final成員變量,接口的實現與子類相似,除了個實現類不能從從接口定義中繼承行為,當類實現特殊的接口時,他定義(即將程序給予)多有這種接口的犯法,然後,它可以在實現了該接口的類的任何對象上調用接口的方法,由於抽象類,它允許使用接口名作為應用變量的類型。通常的動態聯編將生效,引用可以轉換到接口類型或從接口類型轉換,instanceof運算符可以用來決定某對象的類是實現了接口。

25. abstract的method是否可同時是static,是否可以是同時是native,是否同時是synchronized?

都不可以

26. jsp頁面中的跳轉方式分別是什麼?有什麼區別?

有兩種,分別是

< JSP:INCLUDE page="jjj.jsp" fresh="true">

< JSP:FORWARD page="nextpage.jsp">

區別:

前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面,執行完後就會回來,相當於函數調用,並且可以帶有參數,後指完全轉向新的頁面,不會再回來。相當於個goto語句。

27. java servlet API中的forward()和redirect()的區別?

前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向的地址,後者則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求連結,這樣,從瀏覽器的地址欄中就可以看到跳轉以後的連結地址,多億,牽制更為高效。在前者可以滿足需要的同時,儘量使用forward()方法,並且這樣有助於隱藏實際的連結,在有些情況下,比如需要跳轉到其他瀏覽器的資源,則必須用sendRedeirct()方法。

28. xml有哪些解析技術?區別是什麼?

有DOM,SAX,STAX等

  • DOM:處理大型文件是其性能下降的非常厲害,這個問題是由DOM的樹結構造成的,這種結構占用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內存,適合對xml的隨機訪問,sax:不現於,DOM,SAX是事件驅動型的xml解析方式,他順序的讀取xml文件,不需要自已全部裝載正文件,當遇到文檔開頭,文檔結束,或者標籤開都與標籤結束時,他會觸發一個事件,用於通過在其回調事件中寫入處理代碼來處理xml文件,適合對xml的順序訪問。
  • Stax:Streaming API for xml(Stax)。

29. jsp中有哪些內置對象?他們的作用是什麼?

jsp中共9中內置組件:

  • request:用戶端請求,此請求會包含來自GET/Post請求的參數;
  • response:網頁傳回用戶端的回應。
  • pageContext:頁面的屬性是在這裡管理
  • session:與請求有關的回話期
  • application :Servlet正在執行的內容
  • out :用來傳遞迴應的輸出
  • config :servlet的構架部件
  • page jsp網頁本身
  • exception :針對錯誤的網頁。未捕捉的例外。

30. 編程用java解析xml的方式

用sax方式解析xml,xml如下:

< ? xml version=1.0 encoding=gb2312? >
小黑
信息學院
6210798
男,1965,博士,94年調入清華大學

事件回調類SAXHandler.java

import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
{
    private Hashtable table = new Hashtable();
    private String currentElement = null;
    private String currentValue = null;
    public void setTable(Hashtable table)
        {
        this.table = table;
    }
    public Hashtable getTable()
        {
        return table;
    }
    public void startElement(String tag, AttributeList attrs)
        throws SAXException
        {
        currentElement = tag;
    }
    public void characters(char[] ch, int start, int length)
        throws SAXException
        {
        currentValue = new String(ch, start, length);
    }
    public void endElement(String name) throws SAXException
        {
        if (currentElement.equals(name))
                table.put(currentElement, currentValue);
    }
}

JSP內容顯示源碼,SaxXml.jsp:

< %@page errorPage=ErrPage.jsp contentType=text/html;
charset=GB2312 %> >
< %@page import=java.io.*%>
< %@page import=java.util.Hashtable %>
< %@page import=org.w3c.dom.*% >
< %@page import=org.xml.sax.* %>
< %@page import=javax.xml.parsers.SAXParserFactory %>
< %@page import=javax.xml.parsers.SAXParser %>
< %@page import=SAXHandler %>
< %@
File file = new File(c:people.xml);
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println( );
out.println(
+ );
out.println(
+ );
out.println(
+ );
out.println(
+ );
out.println(
教師信息表 姓名    +
(String)hashTable.get(new String(name)) +
學院  +
(String)hashTable.get(new String(college))+
電話  +
(String)hashTable.get(new String(telephone)) +
備註  +
(String)hashTable.get(new String(notes)) +
);
>

31. EJB與JavaBean的區別

JavaBean是可重複用的組件,對JavaBean並沒有嚴格的規範,理論上講,任何一個Java類都可以是一個Bean,但是通常情況下,由於JavaBean是被容器所建(如tomcat等)的。所以JavaBean應具有一個參數的構造器,另外通常JavaBean還要實現serializable接口用於實現Bean的持久性,JavaBean實際上相當於微軟Com模型中的本地進程中com組件,踏實不能被誇進程訪問的,enterorise JavaBean相當於DCOM,即分布式組件,踏實基於java的與阿成方法的調用(RMI)技術的,所以EJB可以被遠程訪問(跨進成,跨計算機)但是EJB必須被部署在諸如websoere、weblogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問,EJB容器是EJB組建的代理,EJB組件由容器創建和管理。客戶通過容器訪問真正的EJB組件。

Java程式設計師福利:金三銀四,我把最近一年經歷過的Java崗位面試,和一些刷過的面試題都做成了PDF,PDF都是可以免費分享給大家的,關注私信我:【101】,免費領取!

關鍵字: