1.&和&&的區別?java
&:邏輯與(and),運算符兩邊的表達式均爲true時,整個結果才爲true。程序員
&&:短路與,若是第一個表達式爲false時,第二個表達式就不會計算了。算法
2.」==」和equals方法究竟有什麼區別?sql
==:表示兩個變量的值是否相等,用於比較兩個基本數據類型的數據或者引用變量。數據庫
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容器知識點
1. 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 替代。
4. 如何決定使用 HashMap 仍是 TreeMap?
對於在 Map 中插入、刪除、定位一個元素這類操做,HashMap 是最好的選擇,由於相對而言 HashMap 的插入會更快,但若是你要對一個 key 集合進行有序的遍歷,那 TreeMap 是更好的選擇。
5. 說一下 HashMap 的實現原理?
HashMap 基於 Hash 算法實現的,咱們經過 put(key,value)存儲,get(key)來獲取。當傳入 key 時,HashMap 會根據 key. hashCode() 計算出 hash 值,根據 hash 值將 value 保存在 bucket 裏。當計算出的 hash 值相同時,咱們稱之爲 hash 衝突,HashMap 的作法是用鏈表和紅黑樹存儲相同 hash 值的 value。當 hash 衝突的個數比較少時,使用鏈表不然使用紅黑樹。
6. 說一下 HashSet 的實現原理?
HashSet 是基於 HashMap 實現的,HashSet 底層使用 HashMap 來保存全部元素,所以 HashSet 的實現比較簡單,相關 HashSet 的操做,基本上都是直接調用底層 HashMap 的相關方法來完成,HashSet 不容許重複的值。
7. 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的區別與聯繫?
1、equals方法的做用
一、默認狀況(沒有覆蓋equals方法)下equals方法都是調用Object類的equals方法,而Object的equals方法主要用於判斷對象的內存地址引用是否是同一個地址(是否是同一個對象)。
2 、要是類中覆蓋了equals方法,那麼就要根據具體的代碼來肯定equals方法的做用了,覆蓋後通常都是經過對象的內容是否相等來判斷對象是否相等。
2、Hashcode()方法:
一、咱們並無覆蓋equals方法只覆蓋了hashCode方法,兩個對象雖然hashCode同樣,但在將stu1和stu2放入set集合時因爲equals方法比較的兩個對象是false,因此就沒有在比較兩個對象的hashcode值。
二、覆蓋一下equals方法和hashCode方法,stu1和stu2經過equals方法比較相等,並且返回的hashCode值同樣,因此放入set集合中時只放入了一個對象。
三、咱們讓兩個對象equals方法比較相等,但hashCode值不相等試試,雖然stu1和stu2經過equals方法比較相等,但兩個對象的hashcode的值並不相等,因此在將stu1和stu2放入set集合中時認爲是兩個不一樣的對象。
總結:
一、equals方法用於比較對象的內容是否相等(覆蓋之後)
二、hashcode方法只有在集合中用到
三、當覆蓋了equals方法時,比較對象是否相等將經過覆蓋後的equals方法進行比較(判斷對象的內容是否相等)。
四、將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,若是不相等直接將該對象放入集合中。若是hashcode值相等,而後再經過equals方法判斷要放入對象與集合中的任意一個對象是否相等,若是equals判斷不相等,直接將該元素放入到集合中,不然不放入。
原文連接:https://blog.csdn.net/qq_35980218/article/details/102481247