Java開發常見基礎題大全

是一哥嘛發表於2019-11-15

1.&和&&的區別?

&:邏輯與(and),運算子兩邊的表示式均為true時,整個結果才為true。

&&:短路與,如果第一個表示式為false時,第二個表示式就不會計算了 。

2.””和equals方法究竟有什麼區別?

:表示兩個變數的值是否相等,用於比較兩個基本資料型別的資料或者引用變數。

equals:用於比較兩個獨立物件的外匯返傭內容是否相同。字串的比較也用equals。

== 對於基本型別來說是值比較,對於引用型別來說是比較的是引用;而 equals 預設情況下是引用比較,只是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。

3.比較字串相等時用equals和的區別

String 是物件,如果用號就是比較兩個String物件記憶體地址是否一樣,equals()比較的是String內容時候一樣,不過不同的程式語言兩者不太一樣

4.Int和integer的區別?

Int是Java的8中基本資料型別之一,integer是int的封裝類。Int型別的預設值為0,integer預設值為null,所以區別在於,integer能區分出null值和0的區別。

5.過載和重寫的區別?

過載(Overload):函式名相同,引數不同。可以改變返回值型別,引數的個數和型別。

重寫(Override):和父類的的方法名稱、引數完全相同。

6.物件導向的特徵?

封裝:將物件屬性和方法的程式碼封裝到一個模組中,也就是一個類中,保證軟體內部具有優良的模組性的基礎,實現“高內聚,低耦合”。

抽象:找出一些事物的相似和共性之處,然後歸為一個類,該類只考慮事物的相似和共性之處。抽象包括行為抽象和狀態抽象。

繼承:在已經存在的類的基礎上進行,將其定義的內容作為自己的內容,並可以加入新的內容或者修改原來的方法適合特殊的需要。

多型:同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果,就是多型,簡單點說:就是用父類的引用指向子類的物件。目的:提高程式碼複用性,解決專案中緊耦合問題,提高可擴充套件性。

多型的機制:靠的是父類的或者介面的引用變數可以指向子類或者具體實現類的例項物件。

7.JDK 和 JRE 有什麼區別?

JDK:Java Development Kit 的簡稱,Java 開發工具包,提供了 Java 的開發環境和執行環境。

JRE:Java Runtime Environment 的簡稱,Java 執行環境,為 Java 的執行提供了所需環境。

具體來說 JDK 其實包含了 JRE,同時還包含了編譯 Java 原始碼的編譯器 Javac,還包含了很多 Java 程式除錯和分析的工具。簡單來說:如果你需要執行 Java 程式,只需安裝 JRE 就可以了,如果你需要編寫 Java 程式,需要安裝 JDK。

8.final 在 Java 中有什麼作用?

final 修飾的類叫最終類,該類不能被繼承。

final 修飾的方法不能被重寫。

final 修飾的變數叫常量,常量必須初始化,初始化之後值就不能被修改。

9.String s =new String (“syx”);建立了幾個String Object?

如果String常理池(常量緩衝區)中,已經建立"syx",則不會繼續建立,此時只建立了一個物件new String(“syx”);

如果String常理池中,沒有建立"syx",則會建立兩個物件,一個物件的值是"syx",一個物件new String(“syx”)。

10.JDBC運算元據庫的七大步驟?

1.載入JDBC驅動程式:

2.提供JDBC連線的URL;

3.建立資料庫的連線;

4.建立一個Statement(建立sql的執行操作);

5.執行SQL語句;

6.處理執行結果;

7.關閉JDBC物件,釋放記憶體。

11.String 類的常用方法都有那些?

indexOf():返回指定字元的索引。

charAt():返回指定索引處的字元。

replace():字串替換。

trim():去除字串兩端空白。

split():分割字串,返回一個分割後的字串陣列。

getBytes():返回字串的 byte 型別陣列。

length():返回字串長度。

toLowerCase():將字串轉成小寫字母。

toUpperCase():將字串轉成大寫字元。

substring():擷取字串。

equals():字串比較。

12.普通類和抽象類有哪些區別?

普通類不能包含抽象方法,抽象類可以包含抽象方法。

抽象類不能直接例項化,普通類可以直接例項化。

13.介面和抽象類有什麼區別?

抽象類:用abstract修飾,抽象類不能建立例項物件。抽象方法必須在子類中實現,不能有抽象構造方法或者抽象靜態方法。

介面:抽象類的一種特例,介面中的方法必須是抽象的。

兩者的區別:

1.抽象類可以有構造方法,介面沒有構造方法

2.抽象類可以有普通成員變數,介面沒有普通成員變數。

3.抽象類可以有非抽象的普通方法,介面中的方法必須是抽象的。

4.抽象類中的抽象方法訪問型別可以是public,protected,介面中抽閒方法必須是public型別的。

5.抽象類可以包含靜態方法,介面中不能包含靜態方法。

6.一個類可以實現多個介面,但是隻能繼承一個抽象類。

7.介面中基本資料型別的資料成員,都預設為static和final,抽象類則不是。

8.抽象類的子類使用 extends 來繼承;介面必須使用 implements 來實現介面。

14.BIO、NIO、AIO 有什麼區別?

BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方便,併發處理能力低。

NIO:Non IO 同步非阻塞 IO,是傳統 IO 的升級,客戶端和伺服器端透過 Channel(通道)通訊,實現了多路複用。

AIO:Asynchronous IO 是 NIO 的升級,也叫 NIO2,實現了非同步非堵塞 IO ,非同步 IO 的操作基於事件和回撥機制。

15.Files的常用方法都有哪些?

Files. exists():檢測檔案路徑是否存在。

Files. createFile():建立檔案。

Files. createDirectory():建立資料夾。

Files. delete():刪除一個檔案或目錄。

Files. copy():複製檔案。

Files. move():移動檔案。

Files. size():檢視檔案個數。

Files. read():讀取檔案。

Files. write():寫入檔案。

16.請對比synchronized與java.util.concurrent.locks.Lock的異同?

主要相同點:Lock能完成synchronized所實現的所有功能

主要不同點:Lock有比synchronized更精確的執行緒語義和更好的效能。synchronized會自動釋放鎖,而Lock一定要求程式設計師手工釋放,並且必須在finally從句中釋放。

17.List、Set和Map的區別?

List:是儲存單列資料的集合,儲存有順序,允許重複。繼承Collection介面。

Set: 是儲存單列資料的集合。繼承Collection介面。不允許重複。

Map:儲存鍵和值這樣的雙列資料的集合,儲存資料無順序,鍵(key)不能重複,值(value)。可以重複。

18.java建立物件的方式有哪些?

1.使用new關鍵字

2.使用反射機制建立物件:

(1)使用Class類的newInstance方法

(2)java.lang.reflect.Constructor類裡也有一個newInstance方法可以建立物件。

3.使用clone方法:先實現Cloneable介面並實現其定義的clone方法

4.使用反序列化。

19. Java 中 IO 流分為幾種?

按功能來分:輸入流(input)、輸出流(output)。

按型別來分:位元組流和字元流。

位元組流和字元流的區別是:位元組流按 8 位傳輸以位元組為單位輸入輸出資料,字元流按 16 位傳輸以字元為單位輸入輸出資料。

20.執行時異常與一般異常有何異同?

Java提供了兩類主要的異常:執行時異常runtime exception和一般異常checked exception。對於後者這種一般異常,JAVA要求程式設計師對其進行catch處理。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。

執行時異常我們可以不處理。這樣的異常由虛擬機器接管。出現執行時異常後,系統會把異常一直往上層拋,一直遇到處理程式碼。如果不對執行時異常進行處理,那麼出現執行時異常之後,要麼是執行緒中止,要麼是主程式終止。

JAVA容器知識點


Java 容器都有哪些?

Java 容器分為 Collection 和 Map 兩大類,其下又有很多子類,如下所示:

Collection

List

ArrayList

LinkedList

Vector

Stack

Set

HashSet

LinkedHashSet

TreeSet

Map

HashMap

LinkedHashMap

TreeMap

ConcurrentHashMap

Hashtable

2.List、Set和Map的區別?

List:是儲存單列資料的集合,儲存有順序,允許重複。繼承Collection介面。

Set::是儲存單列資料的集合。繼承Collection介面。不允許重複。

Map:儲存鍵和值這樣的雙列資料的集合,儲存資料無順序,鍵(key)不能重複,值(value)。可以重複。

3.HashMap 和 Hashtable 有什麼區別?

儲存:HashMap 執行 key 和 value 為 null,而 Hashtable 不允許。

執行緒安全:Hashtable 是執行緒安全的,而 HashMap 是非執行緒安全的。

推薦使用:在 Hashtable 的類註釋可以看到,Hashtable 是保留類不建議使用,推薦在單執行緒環境下使用 HashMap 替代,如果需要多執行緒使用則用 ConcurrentHashMap 替代。

如何決定使用 HashMap 還是 TreeMap?

對於在 Map 中插入、刪除、定位一個元素這類操作,HashMap 是最好的選擇,因為相對而言 HashMap 的插入會更快,但如果你要對一個 key 集合進行有序的遍歷,那 TreeMap 是更好的選擇。

說一下 HashMap 的實現原理?

HashMap 基於 Hash 演算法實現的,我們透過 put(key,value)儲存,get(key)來獲取。當傳入 key 時,HashMap 會根據 key. hashCode() 計算出 hash 值,根據 hash 值將 value 儲存在 bucket 裡。當計算出的 hash 值相同時,我們稱之為 hash 衝突,HashMap 的做法是用連結串列和紅黑樹儲存相同 hash 值的 value。當 hash 衝突的個數比較少時,使用連結串列否則使用紅黑樹。

說一下 HashSet 的實現原理?

HashSet 是基於 HashMap 實現的,HashSet 底層使用 HashMap 來儲存所有元素,因此 HashSet 的實現比較簡單,相關 HashSet 的操作,基本上都是直接呼叫底層 HashMap 的相關方法來完成,HashSet 不允許重複的值。

ArrayList 和 LinkedList 的區別是什麼?

資料結構實現:ArrayList 是動態陣列的資料結構實現,而 LinkedList 是雙向連結串列的資料結構實現。

隨機訪問效率:ArrayList 比 LinkedList 在隨機訪問的時候效率要高,因為 LinkedList 是線性的資料儲存方式,所以需要移動指標從前往後依次查詢。

增加和刪除效率:在非首尾的增加和刪除操作,LinkedList 要比 ArrayList 效率要高,因為 ArrayList 增刪操作要影響陣列內的其他資料的下標。

ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。

對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。

對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料,而查詢和修改ArrayList佔優勢。

綜合來說,在需要頻繁讀取集合中的元素時,更推薦使用 ArrayList,而在插入和刪除操作較多時,更推薦使用 LinkedList。

Java進階知識

1.三個與取整有關的方法:

Math.ceil():表示向上取整;Math.ceil(11.3)=12;Math.ceil(-11.3)=-12。

Math.floor():表示向下取整;Math.floor(11.6)=12;Math.floor(-11.6)=-12。

Math.round():表示四捨五入;Math.round(11.5)=12;Math.round(-11.5)=-11;

Marh.round(11.3)=11;Math.round(-11.3)=–11;

2.String和StringBuffuer、StringBuilder

String:字串數值不可變;

StringBuffer:字串可修改,可以動態構造字元資料。StringBuffer類是可以透過Append()來修改值。執行緒安全。

StringBuilder:執行緒不安全。

共同點:它們都可以儲存和操作字串,同時三者都使用final修飾,都屬於終結類不能派生子類,操作的相關方法也類似例如獲取字串長度等。

不同:

1.其中String是隻讀字串,也就意味著String引用的字串內容是不能被改變的,每次對String的操作都會生成新的String物件,造成記憶體浪費。而StringBuffer和StringBuilder類表示的字串物件可以直接進行修改,在修改的同時地址值不會發生改變。

2.StringBuilder是JDK 1.5中引入的,它和StringBuffer的方法完全相同,區別在於它是在單執行緒環境下使用的(不能同步訪問),因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer略高。

三者在執行速度方面的比較:StringBuilder > StringBuffer > String

對於三者使用的總結:

1.如果要操作少量的資料用String  

2.單執行緒操作字串緩衝區下操作大量資料用StringBuilder

3.多執行緒操作字串緩衝區下操作大量資料用StringBuffer

3.對比幾種不同的簡單singleton單例模式

飽漢模式:類載入時完初始化,不管用不用,先建立。

//飽漢模式:類載入時完成初始化,建立出例項物件(不管用不用,先建立)。
public class SingleTon {
//例項化物件放到靜態程式碼塊中,可提高執行效率,但是可能更佔用空間
private final static SingleTon instence=new SingleTon();
private SingleTon(){};//私有的建構函式
//獲取方法
public static SingleTon getinstance(){
return instence;
};

餓漢模式:第一次使用時建立物件,存線上程安全問題。

//飢漢模式:延遲載入,在第一次用的時候才建立出物件,存線上程安全問題。

public class SingleTon {
private static SingleTon instence=null;
private SingleTon(){};//私有的建構函式
//獲取方法
public static synchronized SingleTon getinstance(){
if(instence==null){
//第一次使用的時候建立物件
instence=new SingleTon();
}
return instence;
};
}

4.hashCode與equals的區別與聯絡?

一、equals方法的作用

1、預設情況(沒有覆蓋equals方法)下equals方法都是呼叫Object類的equals方法,而Object的equals方法主要用於判斷物件的記憶體地址引用是不是同一個地址(是不是同一個物件)。

2 、要是類中覆蓋了equals方法,那麼就要根據具體的程式碼來確定equals方法的作用了,覆蓋後一般都是透過物件的內容是否相等來判斷物件是否相等。

二、Hashcode()方法:

1、我們並沒有覆蓋equals方法只覆蓋了hashCode方法,兩個物件雖然hashCode一樣,但在將stu1和stu2放入set集合時由於equals方法比較的兩個物件是false,所以就沒有在比較兩個物件的hashcode值。

2、覆蓋一下equals方法和hashCode方法,stu1和stu2透過equals方法比較相等,而且返回的hashCode值一樣,所以放入set集合中時只放入了一個物件。

3、我們讓兩個物件equals方法比較相等,但hashCode值不相等試試,雖然stu1和stu2透過equals方法比較相等,但兩個物件的hashcode的值並不相等,所以在將stu1和stu2放入set集合中時認為是兩個不同的物件。

總結:

1、equals方法用於比較物件的內容是否相等(覆蓋以後)

2、hashcode方法只有在集合中用到

3、當覆蓋了equals方法時,比較物件是否相等將透過覆蓋後的equals方法進行比較(判斷物件的內容是否相等)。

4、將物件放入到集合中時,首先判斷要放入物件的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該物件放入集合中。如果hashcode值相等,然後再透過equals方法判斷要放入物件與集合中的任意一個物件是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。


————————————————

版權宣告:本文為CSDN博主「喝酸奶不舔蓋:)」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結及本宣告。

原文連結:https://blog.csdn.net/hi_onebro/article/details/103085448


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946594/viewspace-2664329/,如需轉載,請註明出處,否則將追究法律責任。

相關文章