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

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