Java開發常見基礎題大全
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.使用反序列化。
- 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 {
//實例化對象放到靜態代碼塊中,可提高執行效率,但是可能更占用空間
function(){ //亨達返傭www.kaifx.cn/broker/hantecglobal.html
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判斷不相等,直接將該元素放入到集合中,否則不放入。
原文鏈接:blog.csdn.net/qq_35980218/article/details/102481247