java基礎面試題1

&和&&的區別?數組

& 不管左邊表達式執行結果如何,都會執行右邊安全

&& 左邊執行不符合條件時,右邊不執行網絡

 1     public static void main(String[] args) {  2         int i = 1;  3         int j = 2;  4         
 5         // &
 6         if(++i==10 & ++j==10) { //false
 7  System.out.println(i);  8  System.out.println(j);  9  } 10         System.out.println(i); //2
11         System.out.println(j); //3 12         
13         // &
14         if(++i==10 && ++j==10) {  //false
15  System.out.println(i); 16  System.out.println(j); 17  } 18         System.out.println(i); //3
19         System.out.println(j); //3
20     }

int 和 Integer 有什麼區別?(基本數據類型有哪些?)(String不是基本數據類型)app

Java 爲每一個基本類型都提供了包裝類,int 的包裝類就是 Integer,而且從 jdk1.5 引入了自動拆箱、裝箱機制,使得兩者能夠相互轉換。ide

原始類型:boolean,char,byte,short,int,long,float,double模塊化

包裝類型: Boolean,Character,Byte,Short,Integer,Long,Float,Double函數

String、StringBuffer、 StringBuilder 的區別?ui

String 用於字符串操做,不可改變類型,每次值發生改變,都會建立一個新的對象,底層使用 char 數組實現,由於 使用 final,因此 String 不能夠被繼承this

StringBuffer 用於字符串操做,可變類型,對方法增長了同步鎖,線程安全spa

StringBuilder 和 StringBuffer 相似,都是字符串緩衝區,線程不安全

執行效率:StringBuilder(線程不安全)>StringBuffer(線程安全)>String

String 類的經常使用方法都有那些?

indexOf():返回指定字符得索引

charAt():返回指定索引處得字符

repalce():字符串替換

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

split():分割字符串 返回分割後的字符串數組

getBytes():返回字符串的 byte 類型數組

length():返回字符串的長度

toLowerCase():字符串轉小寫

toUpperCase():字符串轉大寫

substring():截取字符串

equals():字符串比較

final 修飾 StringBuffer 後還能夠 append 嗎?

能夠,final 修飾的是一個引用變量,那麼這個引用始終指向這個對象,但這個對象內部的屬性是能夠改變的。

1     public static void main(String[] args) { 2         final StringBuffer sb = new StringBuffer(); 3         sb.append("a"); 4         sb.append("b"); 5         sb.append("c"); 6         
7         System.out.println(sb); //abc
8         
9     }

String 字符串修改實現的原理?

當 String 修改字符串的時候會建立一個 StringBuilder 對象,接下來調用 append 方法,最後經過 toString 方法返回。

什麼是值傳遞和引用傳遞?

值傳遞:基本類型的一個概念,傳遞的是該變量的一個副本,改變副本不影響原變量

引用傳遞:對象型變量而言,傳遞的是該對象地址的一個副本,因此對引用對象操做影響原變量

== 比較的是什麼?

== 比較兩個對象基本內存引用,若是兩個對象的引用徹底相同,返回 true,不然返回 false,若是兩個對象是基本數據類型,則比較值是否相等。

1     public static void main(String[] args) { 2         int i = 10; 3         int j = 10; 4         System.out.println(i==j); 5         
6         String a = new String("hello"); 7         String b = new String("hello"); 8         System.out.println(a==b); 9     }

 

兩個對象的 hashCode() 相同,則 equals() 也必定爲 true 嗎?

若是兩個對象相等,則 hashCode 必定也是相同的;反之不成立。

1     public static void main(String[] args) { 2         String str1 = "通話"; 3         String str2 = "重地"; 4  System.out.println(str1.hashCode());//1179395 5  System.out.println(str2.hashCode());//1179395 6         
7  System.out.println(str1.equals(str2));//false 8     }

 

Java 裏面的 final 關鍵字是怎麼用的?

final關鍵字修飾的變量,只能進行一次賦值操做,而且在生存期內不能夠改變它的值。

final關鍵字修飾的參數,在此方法中,不可更改該參數的值。

final關鍵字修飾的方法,該方法不能被重寫。

final關鍵字修飾的類,該類不能被繼承。

解釋下什麼是面向對象?面向對象和麪向過程的區別?

面向對象的程序是由對象組成的,每一個對象包含用戶公開的特定功能部分和隱藏的實現部分。 結構清晰,程序便於模塊化,結構化,抽象化,更加符合人類的思惟方式。

面向過程的程序經過設計一系列的過程來解決問題。 面向過程側重整個問題的解決步驟,着眼局部或者具體。

面向對象的三大特性?分別解釋下?

封裝:一般認爲封裝是把數據和操做數據的方法封裝起來,對數據的訪問只能經過已定義的接口。

繼承:繼承是從已有類獲得繼承信息建立新類的過程。提供繼承信息的類被稱爲父類(超類/基類),獲得繼承信息的被稱爲子類(派生類)。

多態:分爲編譯時多態(方法重載)和運行時多態(方法重寫)。

要實現多態須要作兩件事:一是子類繼承父類並重寫父類中的方法,二是用父類型引用子類型對象,這樣一樣的引用調用一樣的方法就會根據子類對象的不一樣而表現出不一樣的行爲。主要由如下三種方式實現:

經過子類對父類的覆蓋實現

經過在一個類中對方法的重載來實現

經過將子類對象做爲父類對象使用來實現

Java 類初始化採用什麼順序呢?

初始化父類中的靜態成員變量和靜態代碼塊

初始化子類中的靜態成員變量和靜態代碼塊

初始化父類中的普通成員變量和代碼塊,再執行父類的構造方法

初始化子類中的普通成員變量和代碼塊,再執行父子類的構造方法

Java 是否支持多繼承?

Java不支持多繼承,但Java能夠實現多個接口,從而達到相似多繼承的目的。

什麼是構造函數?什麼是構造函數重載?
新對象被建立的時候會調用構造函數,每一個類都有構造函數,若是沒有顯式的建立構造函數,Java 編譯器會自動爲該類建立一個默認的構造函數。

若該類已經建立非空參構造函數,默認的無參構造函數就會失效。

構造函數重載和方法重載相似,能夠爲一個類建立多個構造函數,可是要保證每一個構造函數都有惟一的參數列表。

重載和重寫的區別?

重載,編譯時多態,在一個類裏面,方法名字相同,而參數不一樣。返回類型能夠相同也能夠不一樣。

重寫,也叫覆蓋,運行時多態,重寫發生在子類與父類之間,重寫要求子類與父類具備相同的參數列表和返回類型。重寫的方法調用時會覆蓋父類的方法。

請說明 Comparable 和 Comparator 接口的做用以及它們的區別?

Comparable:

它是一個排序接口,只包含一個函數 compareTo()

一個類實現了 Comparable 接口,就意味着該類自己支持排序,它能夠直接經過 Arrays.sort() 或 Collections.sort() 進行排序

 1 public class Human implements Comparable<Human> {  2     public Integer id;  3     public Integer age;  4     
 5  @Override  6     public int compareTo(Human o) {  7         if(this.age > o.age) {  8             return 1;  9         }else if(this.age < o.age) { 10             return -1; 11         }else{ 12             return 0; 13  } 14  } 15     
16 }

 

Comparator:

它是一個比較器接口,包括兩個函數:compare() 和 equals()

一個類實現了Comparator接口,那麼它就是一個比較器,其它的類,能夠根據該比較器去排序

綜上所述:Comparable 是內部比較器,而 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; } } }

抽象類和接口有什麼區別?

抽象類中能夠定義構造函數,接口不能定義構造函數;

抽象類中能夠有抽象方法和具體方法,而接口中只能有抽象方法(public abstract);

抽象類中的成員權限能夠是 public、默認、protected(抽象類中抽象方法就是爲了重寫,因此不能被 private 修飾),而接口中的成員只能夠是 public(方法默認:public abstrat、成員變量默認:public static final);

抽象類中能夠包含靜態方法,而接口中不能夠包含靜態方法。

static 關鍵字的做用?Java 中是否能夠重寫一個 private 或者是 static 的方法?

static 關鍵字代表一個成員變量或成員方法能夠在沒有所屬類的狀況下被訪問。

重寫是基於運行時動態綁定的,而 static 方法是編譯時靜態綁定的,static 方法與任何實例都不相關,因此不能重寫一個 static 方法

成員變量和局部變量的區別?

生命週期不一樣

成員變量:

類成員變量是從該類的準備階段開始,直到系統徹底銷燬這個類,類變量的做用域與這個類的生存範圍相同

實例變量是從該類的實例被建立開始存在,直到系統徹底銷燬這個實例,實例變量的做用域與對應實例的生存範圍相同

局部變量根據定義形式的不一樣,又能夠分爲以下三種:

形參,形參的做用域在整個方法中都有效

方法局部變量,做用域從定義這個變量的位置到方法結束時都有效

代碼塊局部變量,做用域從定義這個變量的位置到代碼塊結束時都有效

super 關鍵字的做用?

super 關鍵字能夠在子類構造方法中顯式調用父類構造,可是必要處於第一行。

super 關鍵字能夠在子類中顯式調用父類方法或變量。

 

有時候可使用這個關鍵字擴展從父類繼承過來的方法。

請說明類和對象的區別?

類是對某一類事物的描述,是抽象的;而對象是表示的一個具體的個體,是類的一個實例。

對象是函數、變量的集合體,而類是一組函數、變量的集合體, 即類是一組具備相同屬性的對象集合體。

(class修飾的是類,new出來的是對象)

finally 塊中的代碼何時被執行?

在 Java 語言的異常處理中,finally 塊的做用就是爲了保證不管出現什麼狀況,finally 塊裏的代碼必定會被執行。因爲程序執行 return 就意味着結束對當前函數的調用並跳出這個函數體,所以任何語句要執行都只能在 return 前執行(除非碰到 exit 函數),所以 finally 塊裏的代碼也是在 return 以前執行的。

此外,若是 try-finally 或者 catch-finally 中都有 return,那麼 finally 塊中的 return 將會覆蓋別處的 return 語句,最終返回到調用者那裏的是 finally 中 return 的值。

finally 是否是必定會被執行到?

不必定,下面列舉兩種執行不到的狀況:

當程序進入 try 塊以前就出現異常時,會直接結束,不會執行 finally 塊中的代碼;

當程序在 try 塊中強制退出時也不會去執行 finally 塊中的代碼,好比在 try 塊中執行 exit 方法。

try-catch-finally 中,若是 catch 中 return 了,finally 還會執行嗎?

會,程序在執行到 return 時會首先將返回值存儲在一個指定的位置,其次去執行 finally 塊,最後再返回。所以,對基本數據類型,在 finally 塊中改變 return 的值沒有任何影響,直接覆蓋掉;而對引用類型是有影響的,返回的是在 finally 對 前面 return 語句返回對象的修改值。

throw 和 throws 的區別?

throw:在方法體內部,表示拋出異常,由方法體內部的語句處理;throw 是具體向外拋出異常的動做,因此它拋出的是一個異常實例;

throws:在方法聲明後面,表示若是拋出異常,由該方法的調用者來進行異常的處理;表示出現異常的可能性,並不必定會發生這種異常。

常見的異常類有哪些?

ArithmeticExecption

NullPointerException

ClassCastException

ArrayIndexOutOfBoundsException

FileNotFoundException

NumberFormatException

SQLException

IOException

NoSuchMethodException

IndexOutOfBoundsExecption

IllegalArgumentException

Java 的泛型是如何工做的 ? 什麼是類型擦除 ?

泛型使得數據的類型能夠經過參數傳遞過來,它提供了一種擴展能力,更符合面向對象思想。

當具體的類型肯定以後,泛型還提供了類型檢測機制,不符合的類型不容許賦值,不然編譯不經過。

因此類型擦除就是在進入 JVM 以前,與泛型相關的信息會被擦除掉,這些信息被擦除後,相應的類型就會被替換成泛型類型參數的上限,若是沒有指定,則替換成 Object。

什麼是泛型中的限定通配符和非限定通配符 ?

限定通配符包括兩種:

表示類型的上界,格式爲:<? extends T>,即類型必須爲 T 類型或者 T 子類

表示類型的下界,格式爲:<? super T>,即類型必須爲 T 類型或者 T 的父類

非限定通配符:類型爲 ,能夠用任意類型替代。

List<? extends T> 和 List <? super T> 之間有什麼區別 ?

List<? extends T>,即類型必須爲 T 類型或者 T 子類

List <? super T>,即類型必須爲 T 類型或者 T 的父類

Java 中的 IO 流的分類?

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

按類型來分:字節流 和 字符流。

字節流和字符流有什麼區別?

字節流按 8 位傳輸,以字節爲單位輸入輸出數據,字符流按 16 位傳輸,以字符爲單位輸入輸出數據。

可是無論文件讀寫仍是網絡發送接收,信息的最小存儲單元都是字節。

相關文章
相關標籤/搜索