大家好呀,小編今天給大家分享一些 Java 常見的基礎知識面試題,為即將要面臨春招,以及正在尋找工作的小伙伴們提前支支招。
推薦好課:Java基礎入門到框架實踐、深入解析Java面向對象
一、八種基本數(shù)據類型的大小,以及他們的封裝類
數(shù)據類型 | 封裝類 | 大小 |
---|---|---|
byte | Byte | 1 字節(jié) |
short | Short | 2 字節(jié) |
int | Integer | 4 字節(jié) |
long | Long | 8 字節(jié) |
float | Float | 4 字節(jié) |
double | Double | 8 字節(jié) |
boolean | Boolean | / |
char | Character | 2 字節(jié) |
二、switch 能否用 string 做參數(shù)?
switch 語句中的變量類型可以使 byte,short,int,char。從 jdk1.7 后可以使用 String 類型,是通過 switch 中的 String.hashcode 將 String 轉換成 int 進行判斷。
三、equals 與 == 的區(qū)別
== 操作符是用來比較兩個變量的值是否相等,即就是比較變量在內存中的存儲地址是否相同,equals()方法時 String 類從 Object 類中繼承的,被用來檢測兩個對象的內容是否相同。
四、String s = new String(‘abc’);創(chuàng)建了幾個 object 對象?
會創(chuàng)建一個 String 類型的變量 s。在類加載到此處之前沒有出現(xiàn)“abc”字面量的話,加載此處會創(chuàng)建一個對應“abc”的 String 常量對象。在符合規(guī)范的 JVM 上,執(zhí)行到此處 new 關鍵字會創(chuàng)建一個 String 對象。
五、 Object有哪些公用方法?
- clone() 創(chuàng)建斌返回此對象的副本
- equals() 判斷
- getclass() 返回 object 的運行類
- hashcode() 返回對象的哈希碼值
- notify() 喚醒正在等待對象監(jiān)聽器的單個進程
- notifyAll() 喚醒正在等待對象監(jiān)聽器的所有進程
- wait() 導致當前線程等待,直到另一個線程調用該對象的 notify() 方法或 notifyAll() 方法
- toString() 返回此對象的字符串表示形式
- finalize() 當垃圾收集確定不需要該對象時,垃圾回收器調用該方法
六、Java的四種引用,用到的場景
- 強引用:垃圾回收器不會回收
- 軟引用:如果內存空間足夠,垃圾回收器就不會進行回收,如果內存空間不足,垃圾回收器就會進行回收
- 弱引用:一旦發(fā)現(xiàn)了只有弱引用的對象,垃圾回收器就會進行回收。
- 虛引用:如果發(fā)現(xiàn)該對象還具有虛引用,就會在回收該對象之前,吧這個虛引用加入到與之關聯(lián)的引用隊列中。
七、靜態(tài)變量和實例變量的區(qū)別
靜態(tài)變量前要加上關鍵字 static,實例變量則不會。
實例變量是屬于某個對象的屬性,必須創(chuàng)建了實例對象,其中的實例變量才會分配空間,才能使用這個實例變量。靜態(tài)變量不屬于任何的實例對象,而是屬于類,也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,就會被分配空間??傊褪牵o態(tài)變量不需要創(chuàng)建任何的對象就可以直接使用,而實例變量需要先創(chuàng)建實例對象才能被使用。
八、 Overload 和 Override 的區(qū)別
重載 Overload 表示的是同一個類中可以有多個相同名稱的方法,但這些方法的參數(shù)列表不同,即就是參數(shù)參數(shù)或參數(shù)類型不同。重載時返回值當然可以不一樣,但是如果參數(shù)列表完全一致時,不能通過返回類型不一致而實現(xiàn)重載,這是不可以的。
重寫 Override 表示子類中的方法可以與父類中的方法名稱和參數(shù)完全相同,通過子類創(chuàng)建的對象來調用這個方法時,將調用子類中定義的方法,即就是子類中的該方法將父類的該方法覆蓋了。子類覆蓋父類方法時只能拋比父類更少或者更小的異常。重寫的方法其返回必須和被覆蓋的方法返回一致。
九、抽象類和接口的區(qū)別
抽象類可以有默認的方法進行實現(xiàn),可以有構造器,可以有 main 方法進行運行,可以直接在該類中添加實現(xiàn)的方法接口沒有默認的方法進行實現(xiàn),沒有構造器,不可以使用 main 方法進行運行,在接口中添加方法時需要在具體實現(xiàn)的類中添加方法。
十、 Java面向對象的特征與含義
- 封裝:封裝的目的在于實現(xiàn)程序的“高內聚,低耦合”,防止程序相互依賴而帶來的變動影響。封裝是保證是把對同一事物進行操作的方法和相關的方法放在同一個類中,把方法和他操作的數(shù)據放在同一個類中;
- 抽象:抽象就是找出事物的相似和共性,然后將這些事物歸為同一類,這個類只考慮這些事物的相似和共性,忽略和當前主題不相關的因素;
- 繼承:子類繼承父類的內容作為自己的內容,可以加入新的內容或者是修改父類的內容而更加適合特殊的需要。提高了額程序的可重用性和可擴張性;
- 多態(tài):多態(tài)是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發(fā)出的方法調用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定。
十一、java多態(tài)的實現(xiàn)
接口實現(xiàn),繼承父類進行方法重寫,
同一個類中進行方法重載。
十二、運行時異常和一般異常的區(qū)別
異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài)。運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見的運行錯誤。java 編譯器要求方法必須聲明拋出可能出現(xiàn)的非運行時異常,但是并不要求必須聲明拋出未被捕獲的異常。
十三、Java語言如何進行異常處理,throws,throw,try catch finally 代表什么意義,try 塊中可以拋出異常嗎?
Java 通過面向對象的方法進行異常處理,把各種不同的異常進行分類,并提供了良好的接口。在 Java 中,每個異常都是一個對象,它是 Throwable 類或其它子類的實例。當一個
方法出現(xiàn)異常后便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常并進行處理。Java 的異常處理是通過 5 個關鍵詞來實現(xiàn)的:try、catch、throw、throws 和 finally。一般情況下是用 try 來執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最后(finally)由缺省處理器來處理。
用try來指定一塊預防所有”異常”的程序。緊跟在 try 程序后面,應包含一個 catch 子句來指定你想要捕捉的”異?!钡念愋?。
throw 語句用來明確地拋出一個”異常”;
throws 用來標明一個成員函數(shù)可能拋出的各種”異?!?;
Finally 為確保一段代碼不管發(fā)生什么”異?!倍急粓?zhí)行一段代碼;
可以在一個成員函數(shù)調用的外面寫一個 try 語句,在這個成員函數(shù)內部寫另一個 try 語句保護其他代碼。每當遇到一個 try 語句,”異?!钡目蚣芫头诺蕉褩I厦?,直到所有的 try 語句都完成;
如果下一級的 try 語句沒有對某種”異?!边M行處理,堆棧就會展開,直到遇到有處理這種”異?!钡?try 語句。
十四、 try catch finally,try里有return,finally還執(zhí)行么?
- finally 語句總會執(zhí)行;
- 如果 try、catch 中有 return 語句,finally 中沒有 return,那么在 finally 中修改除包裝類型和靜態(tài)變量、全局變量以外的數(shù)據都不會對 try、catch 中返回的變量有任何的影響(包裝類型、靜態(tài)變量會改變、全局變量);
- 盡量不要在 finally 中使用 return 語句,如果使用的話,會忽略 try、catch 中的返回語句,也會忽略 try、catch 中的異常,屏蔽了錯誤的發(fā)生;
- finally 中避免再次拋出異常,一旦 finally 中發(fā)生異常,代碼執(zhí)行將會拋出 finally 中的異常信息,try、catch 中的異常將被忽略。
十五、 Java 中 final、finally 和 finalize 的區(qū)別
- final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承;內部類要訪問局部變量,局部變量必須定義成final類型,例如,一段代碼……
- finally 是異常處理語句結構的一部分,表示總是執(zhí)行;
- finalize 是 Object 類的一個方法,在垃圾收集器執(zhí)行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。JVM 不保證此方法總被調用。
十六、String、StringBuffer與StringBuilder的區(qū)別
- String 表示內容不可修改的字符串,StringBuffer 表示內容可以修改的字符串;
- String 覆蓋了 equals()方法和 hashcode()方法,而 StringBuffer 沒有覆蓋兩個方法,,所以 StringBuffer 對象存儲到 java 集合類中時會出現(xiàn)問題;
- StringBulider 也表示內容可以修改的字符串,但是其線程是不安全的,運行效率高。
十七、error和exception區(qū)別
- error 表示有可能恢復但比較困難的的一種嚴重問題,程序是不能進行處理的;
- exception 表示一種設計或者實現(xiàn)問題。
十八、Java 中的異常處理機制和簡單原理和應用
JAVA 程序違反了 JAVA 的語義規(guī)則時,JAVA虛擬機就會將發(fā)生的錯誤表示為一個異常。違反語義規(guī)則包括 2 種情況:
一種是JAVA類庫內置的語義檢查。例如數(shù)組下標越界,會引發(fā) IndexOutOfBoundsException; 訪問 null 的對象時會引發(fā) NullPointerException。
另一種情況就是 JAVA 允許程序員擴展這種語義檢查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時用 throw 關鍵字引發(fā)異常。所有的異常都是 java.lang.Thowable 的子類。
十九、 常見的運行時異常
系統(tǒng)異常是 RuntimeException 的子類,常見的系統(tǒng)異常有:
- ArrayIndexOutOfBoundsException - 數(shù)組越界訪問
- ClassCastException - 類型轉換異常
- NullPointerException - 試圖訪問一空對象的變量、方法或空數(shù)組的元素
- IllegalArgumentException - 方法的參數(shù)無效
- NoClassDefFoundException - JAVA運行時系統(tǒng)找不到所引用的類
二十、 Set 里面的元素不能重復,用什么方法區(qū)分重復與否?
- Set里的元素是唯一不能重復的,元素是否重復使用 equals() 方法進行判斷。
- equals() 方法和 == 方法決定引用值是否指向同一對象 equals() 在類中被覆蓋,為的是兩個分離的對象的內容和類型相匹配的話,返回真值。
二十一、HashMap 和 Hashtable 的區(qū)別
- Hashtable 是基于 Dictionary 類的,HashMap 是 Map 接口的一個實現(xiàn)類;
- Hashtable 是線程安全的,即是同步的;HashMap 線程不是安全的,不是同步的;
- HashMap 可以將空值作為 key 或 value。
二十二、 HashMap、LinkedHashMap、TreeMap的區(qū)別
- HashMap 是根據鍵的 hashcode 值存儲數(shù)據,根據鍵可以直接獲取它的值,具有很快的訪問速度,取得的數(shù)據完全是隨機的;
- LinkedHashMap 保存了記錄的插入順序,在使用 Iterator 進行遍歷的時候,先得到的肯定是先插入的數(shù)據,可以在構造時帶參數(shù),按照應用次數(shù)來進行排序;
- TreeMap 實現(xiàn) SortMap 接口,能夠把它保存的記錄根據鍵排序。默認的是升序排序,也可以指定排序的比較器,進行遍歷的時候得到的是排序過的記錄。
二十三、HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底層實現(xiàn)。
- HashMap 是 java 數(shù)據結構中兩大結構數(shù)組和鏈表的組合。HashMap 底層數(shù)組,數(shù)組中的每一項又是一個鏈表。程序會先根據key的hashcode()方法返回值決定該 Entry 在數(shù)組中的存儲位置,如果該位置上沒有元素,就會將元素放置在此位置上,如果兩個 Entry 的 key 相同,會調用 equals,返回值是 true 則覆蓋原來的value值,返回 false 則會形成 Entry 鏈,位于頭部。
- ArrrayList 的底層實現(xiàn)是數(shù)組,在執(zhí)行 add 操作時,會先檢查數(shù)組大小是否可以容納新的元素,如果不夠就會進行擴容。然后會將原來的數(shù)據拷貝到新的數(shù)組中。
- LinkedList 底層是一個鏈表,其實現(xiàn)增刪改查和數(shù)據結構中的操作完全相同,而且插入是有序的。
- LinkedHashMap 的底層結構式是雙鏈表,其他的邏輯處理與 HashMap 一致,同樣沒有鎖保護,多線程使用時存在風險。
- ConcurrentHashMap 是 segment 數(shù)組結構和 HashEntry 數(shù)組結構組成的,segment 在 ConcurrentHashMap 中充當鎖的角色,HashEntry 用于存儲鍵值對數(shù)據。segment 的結構是數(shù)組和鏈表,一個segment中有一個 HashEntry,每個 HashEntry 是一個鏈表結構的元素。對 HashEntry 中的數(shù)據進行修改時,需要先獲得它所對應的 segment 鎖。每個 ConcurrentHashMap 默認有 16 個 segment。
二十四、迭代器Iterator
Iterator 提供了統(tǒng)一遍歷操作集合元素的統(tǒng)一接口,Collection 接口實現(xiàn) Iterator 接口。每個集合都通過實現(xiàn) Iterator 接口中的iterator() 方法返回實例,然后對元素進行迭代操作,但是在迭代元素的時候不能使用集合的方法刪除元素,否則會拋出異常,可以使用 Iterator 接口中的 remove() 方法進行刪除。
二十五、Map、Set、List、Queue、Stack的特點與用法。
1、Map 是以鍵值對的形式進行存儲的,其中 key 是唯一不可重復的,value 的可以重復,當插入的值是 key 相同,后加入的會將已有的覆蓋。他有幾個具體的實現(xiàn)類,包括 Treemap 和 HashMap,TreeMap 是有序的,HashMap 是無序的。
2、List 有序,可重復
|–ArrayList
底層數(shù)據結構是數(shù)組,查詢快,增刪慢,線程不安全,效率高
|–Vector
底層數(shù)據結構是數(shù)組,查詢快,增刪慢,線程不安全,效率高
|–LinkedList
底層數(shù)據結構是鏈表,查詢慢,增刪塊,線程安全,效率低
3、Set 無序,唯一
|–HashSet
底層數(shù)據結構是哈希表
如何保證元素的唯一性:
依賴兩個方法,hashCode() 和 equals()
|–LinkedHashSet
底層數(shù)據結構是鏈表和哈希表,由鏈表保證元素有序,由哈希表保證元素唯一
|–TreeSet 底層數(shù)據結構是紅黑樹,
如何保證元素的排序:
自然排序:讓元素所屬的類實現(xiàn) Comparable 接口
比較器排序:讓集合接收一個 Comparator 的實現(xiàn)類對象
如何保證元素的唯一性:
根據比較的返回值是否是 0 來決定的
4、Query 隊列遵循先進先出的原則,不允許插入null值,其中提供了相應的進隊和出隊的方法,建議使用offer() 方法來添加元素,使用poll() 方法刪除元素
5、Stack遵從后進先出的原則,繼承自 Vector。他通過 5 個操作對 Vector 類進行擴展,它提供了 push 和 pop 操作,以及去堆棧頂點的peek() 方法,測試堆棧是否為空的 empty 方法
6、使用方法:
如果涉及到堆棧,隊列等操作,建議使用 List
對于快速插入和刪除元素建議使 用LinkedList
需要快速隨機訪問元素建議使用 ArrayList
二十六、Collection 包結構
Collection 是集合類的上級接口,是單列集合。繼承他的接口主要有 Set 和 List.
Set接口的子接口有:HashSet,TreeSet
List接口的子接口有:Arraylist,LinkedList,Vector
二十七、Collection 與 Collections 的區(qū)別。
Collection 是集合類的上級接口,繼承他的接口有 Set 和 List;
Collections 是針對集合類的一個幫助類,它提供一系列的靜態(tài)方法實現(xiàn)集合的搜索,排序,線程安全等操作。
二十八、 Colection 框架中實現(xiàn)比較要實現(xiàn)什么接口?
comparable:只包含 compareTo() 方法
comparator:compare() 和 equals()
二十九、Collection框架的結構
集合框架(Collection Framework)泛指 java.util 包的若干個類和接口。如 Collection, List, ArrayList, LinkedList, Vector( 自動增長數(shù)組), HashSet, HashMap 等;
集合框架中的類主要封裝的是典型的數(shù)據結構,如動態(tài)數(shù)組,鏈表,堆棧,集合,哈希表等;
集合框架類似編程中經常用到的工具類,使得編碼這專注于業(yè)務層的實現(xiàn),不需要從底層實現(xiàn)相關細節(jié)—“數(shù)據結構的封裝”和”典型算法的實現(xiàn)”。
三十、 快速失?。╢ail-fast)和安全失敗(fail-safe)的區(qū)別。
Iterator 的安全失敗是基于對底層集合做拷貝,因此它不受源集合修改的影響。util 包下的所有集合類都是快速失敗的,util.concurren包下面的所有類都是安全失敗的。
推薦好課:Java開發(fā)實例:坦克大戰(zhàn)游戲、Java零基礎之io流詳解