Java面試知識點總結(1)

來源:互聯網
上載者:User

標籤:dex   exit   多個   中斷   出錯   before   請求   集合類   selector   

1、Java中的未經處理資料類型都有哪些,它們的大小及對應的封裝類是什嗎?未經處理資料類型大小(byte)對應封裝類型boolean1或4Booleanbyte1Byteshort2Shortint4Integerlong8Longfloat4Floatdouble8Doublechar2Char2、“==”與“equals()”區別對於枚舉類型和未經處理資料類型的相等性比較,應該使用"==";對於參考型別的相等性比較,應該使用equals方法。 //“==”對於基礎資料型別 (Elementary Data Type),判斷兩個變數的值是否相等。 //“equal”不能用於基礎資料型別 (Elementary Data Type)。只能用於類變數。對於基礎資料型別 (Elementary Data Type)要用其封裝類。 總之: “==”比較的是值【變數(棧)記憶體中存放的對象的(堆)記憶體位址】 equal用於比較兩個對象的值是否相同【不是比地址】 【特別注意】Object類中的equals方法和“==”是一樣的,沒有區別,而String類,Integer類等等一些類,是重寫了equals方法,才使得equals和“==不同”,所以,當自己建立類時,自動繼承了Object的equals方法,要想實現不同的等於比較,必須重寫equals方法。"=="比"equal"運行速度快,因為"=="只是比較引用.3、 Java中的四種引用及其應用情境是什嗎?強引用: 通常我們使用new操作符建立一個對象時所返回的引用即為強引用軟引用: 若一個對象只能通過軟引用到達,那麼這個對象在記憶體不足時會被回收,可用於圖片緩衝中,記憶體不足時系統會自動回收不再使用的Bitmap弱引用: 若一個對象只能通過弱引用到達,那麼它就會被回收(即使記憶體充足),同樣可用於圖片緩衝中,這時候只要Bitmap不再使用就會被回收虛引用: 虛引用是Java中最“弱”的引用,通過它甚至無法擷取被引用的對象,它存在的唯一作用就是當它指向的對象回收時,它本身會被加入到引用隊列中,這樣我們可以知道它指向的對象何時被銷毀。4、object中定義了哪些方法?clone();equals();hashCode();toString();notify();notifyAll();wait();finalize();getClass();5、hashCode的作用?關於HashCode的官方文檔定義:hashcode方法返回該對象的雜湊碼值。支援該方法是為雜湊表提供一些優點,例如,java.util.Hashtable 提供的雜湊表。   hashCode 的常規協定是:   在 Java 應用程式執行期間,在同一對象上多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是對象上 equals 比較中所用的資訊沒有被修改。從某一應用程式的一次執行到同一應用程式的另一次執行,該整數無需保持一致。   如果根據 equals(Object) 方法,兩個對象是相等的,那麼在兩個對象中的每個對象上調用 hashCode 方法都必鬚生成相同的整數結果。   以下情況不 是必需的:如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼在兩個對象中的任一對象上調用 hashCode 方法必定會產生不同的整數結果。但是,程式員應該知道,為不相等的對象產生不同整數結果可以提高雜湊表的效能。   實際上,由 Object 類定義的 hashCode 方法確實會針對不同的對象返回不同的整數。(這一般是通過將該對象的內部地址轉換成一個整數來實現的,但是 JavaTM 程式設計語言不需要這種實現技巧。)   當equals方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的雜湊碼。  以上這段官方文檔的定義,我們可以抽出成以下幾個關鍵點:1)、hashCode的存在主要是用於尋找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列儲存結構中確定對象的儲存地址的;2)、如果兩個對象相同,就是適用於equals(Java.lang.Object) 方法,那麼這兩個對象的hashCode一定要相同;3)、如果對象的equals方法被重寫,那麼對象的hashCode也盡量重寫,並且產生hashCode使用的對象,一定要和equals方法中使用的一致,否則就會違反上面提到的第2點;4)、兩個對象的hashCode相同,並不一定表示兩個對象就相同,也就是不一定適用於equals(java.lang.Object) 方法,只能夠說明這兩個對象在散列儲存結構中,如Hashtable,他們“存放在同一個籃子裡”。==》hashCode是用於尋找使用的,而equals是用於比較兩個對象的是否相等的。6、ArrayList,LinkedList,Vector的區別?ArrayList: 內部採用數組儲存元素,支援高效隨機訪問,支援動態調整大小LinkedList: 內部採用鏈表來儲存元素,支援快速插入/刪除元素,但不支援高效地隨機訪問Vector: 可以看作安全執行緒版的ArrayList7、String,StringBuilder,StringBuffer區別String: 不可變的字元序列,若要向其中添加新字元需要建立一個新的String對象StringBuilder: 可變字元序列,支援向其中添加新字元(無需建立新對象)StringBuffer: 可以看作安全執行緒版的StringBuilder8、Map,Set,List,Queue,Stack特點及用法Map<K, V>:  Java中儲存索引值對的資料類型都實現了這個介面,表示“映射表”。支援的兩個核心操作是get(Object key)以及put(K key, V value),分別用來擷取鍵對應的值以及向映射表中插入索引值對。Set<E>: 實現了這個介面的集合類型中不允許存在重複的元素,代表數學意義上的“集合”。它所支援的核心操作有add(E e),remove(Object o), contains(Object o),分別用於添加元素,刪除元素以及判斷給定元素是否存在於集中。List<E>: Java中集合架構中的清單類型都實現了這個介面,表示一種有序序列。支援get(int index), add(E e)等操作。Queue<E>: Java集合架構中的隊列介面,代表了“先進先出”隊列。支援add(E element), remove()等操作。Stack<E>: Java集合架構中表示堆棧的資料類型,堆棧是一種“後進先出”的資料結構。支援push(E item), pop()等操作。9、HashMap與HashTable區別HashTable是安全執行緒的,而HashMap不是HashMap中允許存在null鍵和null值,而HashTable中不允許10、HashMap實現原理HashMap的底層實現是“基於拉鏈法的散列表”。11、ConcurrentHashMap的實現原理 ConcurrentHashMap是支援並發讀寫的HashMap,它的特點是讀取資料時無需加鎖,寫資料時可以保證加鎖粒度儘可能的小。由於其內部採用“分段儲存”,只需對要進行寫操作的資料所在的“段”進行加鎖。12、TreeMap,LinkedHashMap,HashMap區別HashMap的底層實現是散列表,因此它內部儲存的元素是無序的;TreeMap的底層實現是紅/黑樹狀結構,所以它內部的元素的有序的。排序的依據是自然序或者是建立TreeMap時所提供的比較子(Comparator)對象。LinkedHashMap能夠記住插入元素的順序。13、Collection與Collections區別Collection<E>是Java集合架構中的基本介面;Collections是Java集合架構提供的一個工具類,其中包含了大量用於操作或返回集合的靜態方法。14、對於“try-catch-finally”,若try語句塊中包含“return”語句,finally語句塊會執行嗎?答案是會執行。只有兩種情況finally塊中的語句不會被執行:調用了System.exit()方法;JVM“崩潰”了。15、Override,Overload區別Override表示“重寫”,是子類對父類中同一方法的重新定義Overload表示“重載”,也就是定義一個與已定義方法名稱相同但簽名不同的新方法16、介面與抽象類別的區別介面是一種約定,實現介面的類要遵循這個約定;抽象類別本質上是一個類,使用抽象類別的代價要比介面大。介面與抽象類別的對比如下:抽象類別中可以包含屬性,方法(包含抽象方法與有著具體實現的方法),常量;介面只能包含常量和方法聲明。抽象類別中的方法和成員變數可以定義可見度(比如public、private等);而介面中的方法只能為public(預設為public)。一個子類只能有一個父類(具體類或抽象類別);而一個介面可以繼承一個多個介面,一個類也可以實現多個介面。子類中實現父類中的抽象方法時,可見度可以大於等於父類中的;而介面實作類別中的介面 方法的可見度只能與介面中相同(public)。17、靜態內部類與非靜態內部類的區別靜態內部類不會持有外部類的引用,而非靜態內部類會隱式持有外部類的一個引用。18、java中的多態原理指父類的引用指向子類對象時,調用方法時會調用子類的實現而不是父類的實現。其關鍵在於“動態綁定”。19、簡述java中線程同步方法volatile: Java Memory Model保證了對同一個volatile變數的寫happens before對它的讀;synchronized: 可以來對一個代碼塊或是對一個方法上鎖,被“鎖住”的地方稱為臨界區,進入臨界區的線程會擷取對象的monitor,這樣其他嘗試進入臨界區的線程會因無法擷取monitor而被阻塞。由於等待另一個線程釋放monitor而被阻塞的線程無法被中斷。ReentrantLock:  嘗試擷取鎖的線程可以被中斷並可以設定逾時參數。20、wait(),sleep()區別wait():  Object類中定義的執行個體方法。在指定對象上調用wait方法會讓當前線程進入等待狀態(前提是當前線程持有該對象的monitor),此時當前線程會釋放相應對象的monitor,這樣一來其它線程便有機會擷取這個對象的monitor了。當其它線程擷取了這個對象的monitor並進行了所需操作時,便可以調用notify方法喚醒之前進入等待狀態的線程。sleep():  Thread類中的靜態方法,作用是讓當前線程進入休眠狀態,以便讓其他線程有機會執行。進入休眠狀態的線程不會釋放它所持有的鎖。21、線程池的用法與優勢優勢:  實現對線程的複用,避免了反覆建立及銷毀線程的開銷;使用線程池統一管理線程可以減少並發線程的數目,而線程數過多往往會線上程環境切換上以及線程同步上浪費過多時間。用法:  我們可以調用ThreadPoolExecutor的某個構造方法來自己建立一個線程池。但通常情況下我們可以使用Executors類提供給我們的靜態Factory 方法來更方便的建立一個線程池對象。建立了線程池對象後,我們就可以調用submit方法提交任務到線程池中去執行了;線程池使用完畢後我們要記得調用shutdown方法來關閉它。22、for-each與普通for迴圈效率對比for-each能夠讓代碼更加清晰,並且減少了出錯的機會。下面的慣用代碼適用於集合與數群組類型: for (Element e : elements) {    doSomething(e);}使用for-each迴圈與常規的for迴圈相比,並不存在效能損失,即使對數組進行迭代也是如此。實際上,在有些場合下它還能帶來微小的效能提升,因為它只計算一次數組索引的上限。23、java IO與NIO區別Java IO是面向流的,這意味著我們需要每次從流中讀取一個或多個位元組,直到讀取完所有位元組;NIO是面向緩衝的,也就是說會把資料讀取到一個緩衝區中,然後對緩衝區中的資料進行相應處理。Java IO是阻塞IO,而NIO是非阻塞IO。Java NIO中存在一個稱為選取器(selector)的東西,它允許你把多個通道(channel)註冊到一個選取器上,然後使用一個線程來監視這些通道:若這些通道裡有某個準備好可以開始進行讀或寫操作了,則開始對相應的通道進行讀寫。而在等待某通道變為可讀/寫期間,請求對通道進行讀寫操作的線程可以去幹別的事情。24、反射作用與原理反射的作用概括地說是運行時擷取類的各種定義資訊,比如定義了哪些屬性與方法。原理是通過類的class對象來擷取它的各種資訊。

  

Java面試知識點總結(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.