java基礎(chǔ)面試題整理小結(jié)

&和&&的區(qū)別?
& 無論左邊表達式執(zhí)行結(jié)果如何,都會執(zhí)行右邊
&& 左邊執(zhí)行不符合條件時,右邊不執(zhí)行
public static void main(String[] args) { int i = 1; int j = 2; // & if(++i==10 & ++j==10) { //false System.out.println(i); System.out.println(j); } System.out.println(i); //2 System.out.println(j); //3 // & if(++i==10 && ++j==10) { //false System.out.println(i); System.out.println(j); } System.out.println(i); //3 System.out.println(j); //3 }
int和 Integer 有什么區(qū)別?(基本數(shù)據(jù)類型有哪些?)(String不是基本數(shù)據(jù)類型)
Java 為每個基本類型都提供了包裝類,int 的包裝類就是 Integer,并且從 jdk1.5 引入了自動拆箱、裝箱機制,使得二者可以相互轉(zhuǎn)換。
原始類型:boolean,char,byte,short,int,long,float,double
包裝類型: Boolean,Character,Byte,Short,Integer,Long,F(xiàn)loat,Double
String、StringBuffer、 StringBuilder 的區(qū)別?
String 用于字符串操作,不可改變類型,每次值發(fā)生改變,都會創(chuàng)建一個新的對象,底層使用 char 數(shù)組實現(xiàn),因為 使用 final,所以 String 不可以被繼承
StringBuffer 用于字符串操作,可變類型,對方法增加了同步鎖,線程安全
StringBuilder 和 StringBuffer 類似,都是字符串緩沖區(qū),線程不安全
執(zhí)行效率:StringBuilder(線程不安全)>StringBuffer(線程安全)>String
String 類的常用方法都有那些?
indexOf():返回指定字符得索引
charAt():返回指定索引處得字符
repalce():字符串替換
trim():去除字符串兩端的空白
split():分割字符串 返回分割后的字符串?dāng)?shù)組
getBytes():返回字符串的 byte 類型數(shù)組
length():返回字符串的長度
toLowerCase():字符串轉(zhuǎn)小寫
toUpperCase():字符串轉(zhuǎn)大寫
substring():截取字符串
equals():字符串比較
final修飾 StringBuffer 后還可以 append 嗎?
可以,final 修飾的是一個引用變量,那么這個引用始終指向這個對象,但這個對象內(nèi)部的屬性是可以改變的。
public static void main(String[] args) { final StringBuffer sb = new StringBuffer(); sb.append("a"); sb.append("b"); sb.append("c"); System.out.println(sb); //abc }
String 字符串修改實現(xiàn)的原理?
當(dāng) String 修改字符串的時候會創(chuàng)建一個 StringBuilder 對象,接下來調(diào)用 append 方法,最后通過 toString 方法返回。
什么是值傳遞和引用傳遞?
值傳遞:基本類型的一個概念,傳遞的是該變量的一個副本,改變副本不影響原變量
引用傳遞:對象型變量而言,傳遞的是該對象地址的一個副本,所以對引用對象操作影響原變量
== 比較的是什么?
== 比較兩個對象基本內(nèi)存引用,如果兩個對象的引用完全相同,返回 true,否則返回 false,如果兩個對象是基本數(shù)據(jù)類型,則比較值是否相等。
public static void main(String[] args) { int i = 10; int j = 10; System.out.println(i==j); String a = new String("hello"); String b = new String("hello"); System.out.println(a==b); }
兩個對象的 hashCode() 相同,則 equals() 也一定為 true 嗎?
如果兩個對象相等,則 hashCode 一定也是相同的;反之不成立。
public static void main(String[] args) { String str1 = "通話"; String str2 = "重地"; System.out.println(str1.hashCode());//1179395 System.out.println(str2.hashCode());//1179395 System.out.println(str1.equals(str2));//false }
Java 里面的 final 關(guān)鍵字是怎么用的?
final關(guān)鍵字修飾的變量,只能進行一次賦值操作,并且在生存期內(nèi)不可以改變它的值。
final關(guān)鍵字修飾的參數(shù),在此方法中,不可更改該參數(shù)的值。
final關(guān)鍵字修飾的方法,該方法不能被重寫。
final關(guān)鍵字修飾的類,該類不能被繼承。
解釋下什么是面向?qū)ο??面向?qū)ο蠛兔嫦蜻^程的區(qū)別?
面向?qū)ο蟮某绦蚴怯蓪ο蠼M成的,每個對象包含用戶公開的特定功能部分和隱藏的實現(xiàn)部分。 結(jié)構(gòu)清晰,程序便于模塊化,結(jié)構(gòu)化,抽象化,更加符合人類的思維方式。
面向過程的程序通過設(shè)計一系列的過程來解決問題。 面向過程側(cè)重整個問題的解決步驟,著眼局部或者具體。
面向?qū)ο蟮娜筇匦??分別解釋下?
封裝:通常認為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法封裝起來,對數(shù)據(jù)的訪問只能通過已定義的接口。
繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過程。提供繼承信息的類被稱為父類(超類/基類),得到繼承信息的被稱為子類(派生類)。
多態(tài):分為編譯時多態(tài)(方法重載)和運行時多態(tài)(方法重寫)。
要實現(xiàn)多態(tài)需要做兩件事:一是子類繼承父類并重寫父類中的方法,二是用父類型引用子類型對象,這樣同樣的引用調(diào)用同樣的方法就會根據(jù)子類對象的不同而表現(xiàn)出不同的行為。主要由以下三種方式實現(xiàn):
通過子類對父類的覆蓋實現(xiàn)
通過在一個類中對方法的重載來實現(xiàn)
通過將子類對象作為父類對象使用來實現(xiàn)
Java 類初始化采用什么順序呢?
初始化父類中的靜態(tài)成員變量和靜態(tài)代碼塊
初始化子類中的靜態(tài)成員變量和靜態(tài)代碼塊
初始化父類中的普通成員變量和代碼塊,再執(zhí)行父類的構(gòu)造方法
初始化子類中的普通成員變量和代碼塊,再執(zhí)行父子類的構(gòu)造方法
Java 是否支持多繼承?
Java不支持多繼承,但Java可以實現(xiàn)多個接口,從而達到類似多繼承的目的。
什么是構(gòu)造函數(shù)?什么是構(gòu)造函數(shù)重載?
新對象被創(chuàng)建的時候會調(diào)用構(gòu)造函數(shù),每個類都有構(gòu)造函數(shù),如果沒有顯式的創(chuàng)建構(gòu)造函數(shù),Java 編譯器會自動為該類創(chuàng)建一個默認的構(gòu)造函數(shù)。
若該類已經(jīng)創(chuàng)建非空參構(gòu)造函數(shù),默認的無參構(gòu)造函數(shù)就會失效。
構(gòu)造函數(shù)重載和方法重載類似,可以為一個類創(chuàng)建多個構(gòu)造函數(shù),但是要保證每個構(gòu)造函數(shù)都有唯一的參數(shù)列表。
重載和重寫的區(qū)別?
重載,編譯時多態(tài),在一個類里面,方法名字相同,而參數(shù)不同。返回類型可以相同也可以不同。
重寫,也叫覆蓋,運行時多態(tài),重寫發(fā)生在子類與父類之間,重寫要求子類與父類具有相同的參數(shù)列表和返回類型。重寫的方法調(diào)用時會覆蓋父類的方法。
請說明 Comparable 和 Comparator 接口的作用以及它們的區(qū)別?
Comparable:
它是一個排序接口,只包含一個函數(shù) compareTo()
一個類實現(xiàn)了 Comparable 接口,就意味著該類本身支持排序,它可以直接通過 Arrays.sort() 或 Collections.sort() 進行排序
public class Human implements Comparable<Human> { public Integer id; public Integer age; @Override public int compareTo(Human o) { if(this.age > o.age) { return 1; }else if(this.age < o.age) { return -1; }else{ return 0; } } }
Comparator:
它是一個比較器接口,包括兩個函數(shù):compare() 和 equals()
一個類實現(xiàn)了Comparator接口,那么它就是一個比較器,其它的類,可以根據(jù)該比較器去排序
綜上所述:Comparable 是內(nèi)部比較器,而 Comparator 是外部比較器。
public class Man implements Comparator<Man>{ public Integer id; public Integer age; @Override public int compare(Man o1, Man o2) { if(o1.age > o2.age) { return 1; }else if(o1.age < o2.age) { return -1; }else{ return 0; } } }
抽象類和接口有什么區(qū)別?
抽象類中可以定義構(gòu)造函數(shù),接口不能定義構(gòu)造函數(shù);
抽象類中可以有抽象方法和具體方法,而接口中只能有抽象方法(public abstract);
抽象類中的成員權(quán)限可以是 public、默認、protected(抽象類中抽象方法就是為了重寫,所以不能被 private 修飾),而接口中的成員只可以是 public(方法默認:public abstrat、成員變量默認:public static final);
抽象類中可以包含靜態(tài)方法,而接口中不可以包含靜態(tài)方法。
static 關(guān)鍵字的作用?Java 中是否可以重寫一個 private 或者是 static 的方法?
static 關(guān)鍵字表明一個成員變量或成員方法可以在沒有所屬類的情況下被訪問。
重寫是基于運行時動態(tài)綁定的,而 static 方法是編譯時靜態(tài)綁定的,static 方法與任何實例都不相關(guān),所以不能重寫一個 static 方法
成員變量和局部變量的區(qū)別?
生命周期不同
成員變量:
類成員變量是從該類的準(zhǔn)備階段開始,直到系統(tǒng)完全銷毀這個類,類變量的作用域與這個類的生存范圍相同
實例變量是從該類的實例被創(chuàng)建開始存在,直到系統(tǒng)完全銷毀這個實例,實例變量的作用域與對應(yīng)實例的生存范圍相同
局部變量根據(jù)定義形式的不同,又可以分為如下三種:
形參,形參的作用域在整個方法中都有效
方法局部變量,作用域從定義這個變量的位置到方法結(jié)束時都有效
代碼塊局部變量,作用域從定義這個變量的位置到代碼塊結(jié)束時都有效
super 關(guān)鍵字的作用?
super 關(guān)鍵字可以在子類構(gòu)造方法中顯式調(diào)用父類構(gòu)造,但是必要處于第一行。
super 關(guān)鍵字可以在子類中顯式調(diào)用父類方法或變量。
有時候可以使用這個關(guān)鍵字擴展從父類繼承過來的方法。
請說明類和對象的區(qū)別?
類是對某一類事物的描述,是抽象的;而對象是表示的一個具體的個體,是類的一個實例。
對象是函數(shù)、變量的集合體,而類是一組函數(shù)、變量的集合體, 即類是一組具有相同屬性的對象集合體。
(class修飾的是類,new出來的是對象)
finally 塊中的代碼什么時候被執(zhí)行?
在 Java 語言的異常處理中,finally 塊的作用就是為了保證無論出現(xiàn)什么情況,finally 塊里的代碼一定會被執(zhí)行。由于程序執(zhí)行 return 就意味著結(jié)束對當(dāng)前函數(shù)的調(diào)用并跳出這個函數(shù)體,因此任何語句要執(zhí)行都只能在 return 前執(zhí)行(除非碰到 exit 函數(shù)),因此 finally 塊里的代碼也是在 return 之前執(zhí)行的。
此外,如果 try-finally 或者 catch-finally 中都有 return,那么 finally 塊中的 return 將會覆蓋別處的 return 語句,最終返回到調(diào)用者那里的是 finally 中 return 的值。
finally 是不是一定會被執(zhí)行到?
不一定,下面列舉兩種執(zhí)行不到的情況:
當(dāng)程序進入 try 塊之前就出現(xiàn)異常時,會直接結(jié)束,不會執(zhí)行 finally 塊中的代碼;
當(dāng)程序在 try 塊中強制退出時也不會去執(zhí)行 finally 塊中的代碼,比如在 try 塊中執(zhí)行 exit 方法。
try-catch-finally 中,如果 catch 中 return 了,finally 還會執(zhí)行嗎?
會,程序在執(zhí)行到 return 時會首先將返回值存儲在一個指定的位置,其次去執(zhí)行 finally 塊,最后再返回。因此,對基本數(shù)據(jù)類型,在 finally 塊中改變 return 的值沒有任何影響,直接覆蓋掉;而對引用類型是有影響的,返回的是在 finally 對 前面 return 語句返回對象的修改值。
throw 和 throws 的區(qū)別?
throw:在方法體內(nèi)部,表示拋出異常,由方法體內(nèi)部的語句處理;throw 是具體向外拋出異常的動作,所以它拋出的是一個異常實例;
throws:在方法聲明后面,表示如果拋出異常,由該方法的調(diào)用者來進行異常的處理;表示出現(xiàn)異常的可能性,并不一定會發(fā)生這種異常。
常見的異常類有哪些?
ArithmeticExecption
NullPointerException
ClassCastException
ArrayIndexOutOfBoundsException
FileNotFoundException
NumberFormatException
SQLException
IOException
NoSuchMethodException
IndexOutOfBoundsExecption
IllegalArgumentException
Java 的泛型是如何工作的 ? 什么是類型擦除 ?
泛型使得數(shù)據(jù)的類型可以通過參數(shù)傳遞過來,它提供了一種擴展能力,更符合面向?qū)ο笏枷搿?/p>
當(dāng)具體的類型確定之后,泛型還提供了類型檢測機制,不符合的類型不允許賦值,否則編譯不通過。
所以類型擦除就是在進入 JVM 之前,與泛型相關(guān)的信息會被擦除掉,這些信息被擦除后,相應(yīng)的類型就會被替換成泛型類型參數(shù)的上限,如果沒有指定,則替換成 Object。
什么是泛型中的限定通配符和非限定通配符 ?
限定通配符包括兩種:
表示類型的上界,格式為:<? extends T>,即類型必須為 T 類型或者 T 子類
表示類型的下界,格式為:<? super T>,即類型必須為 T 類型或者 T 的父類
非限定通配符:類型為 ,可以用任意類型替代。
List<? extends T> 和 List <? super T> 之間有什么區(qū)別 ?
List<? extends T>,即類型必須為 T 類型或者 T 子類
List <? super T>,即類型必須為 T 類型或者 T 的父類
Java 中的 IO 流的分類?
按功能來分:輸入流(input)、輸出流(output)。
按類型來分:字節(jié)流 和 字符流。
字節(jié)流和字符流有什么區(qū)別?
字節(jié)流按 8 位傳輸,以字節(jié)為單位輸入輸出數(shù)據(jù),字符流按 16 位傳輸,以字符為單位輸入輸出數(shù)據(jù)。
但是不管文件讀寫還是網(wǎng)絡(luò)發(fā)送接收,信息的最小存儲單元都是字節(jié)。
總結(jié)
到此這篇關(guān)于java基礎(chǔ)面試題1的文章就介紹到這了,更多相關(guān)java 基礎(chǔ)面試題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- 這篇文章主要介紹了大廠Java高級工程師面試題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-07-27
- 這篇文章主要介紹了2020年最新版Java面試題大全,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-04-16
- 這篇文章主要介紹了字節(jié)跳動Java后端視頻面一面涼經(jīng),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)2020-04-13
- 這篇文章主要介紹了100+經(jīng)典Java面試題及答案解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)2020-04-09
- 這篇文章主要介紹了抖音、騰訊、阿里、美團春招Java開發(fā)崗位硬核面試,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-18