java面試題2018(詳細)
1.java基本資料型別:8種
四種整數型別(byte、short、int、long):
byte:8 位,用於表示最小資料單位,如檔案中資料,-128~127
short:16 位,很少用,-32768 ~ 32767
int:32 位、最常用,-2^31-1~2^31 (21 億)
long:64 位、次常用 注意事項: int i=5; // 5 叫直接量(或字面量),即 直接寫出的常數。 整數字面量預設都為 int 型別, 所以在定義的 long 型資料後面加 L或 l。
兩種浮點數型別(float、double):
float:32 位,字尾 F 或 f,1 位符號位,8 位指數,23 位有效尾數。
double:64 位,最常用,字尾 D 或 d,1 位符號位,11 位指數,52 位有效尾
一種字元型別(char):
char:16 位,是整數型別,用單引號括起來的 1 個字元(可以是一箇中文字元),使用 Unicode 碼代表字元,0~2^16-1 (65535) 。 注意事項: 不能為 0個字元。
一種布林型別(boolean):
boolean:true 真 和 false 假。
2.JDK、JRE、JVM關係是什麼?
JDK:(Java Development Kit):Java開發工具包,包含編寫Java程式所必須的編譯、執行等開發工具以及JRE。
JRE:(Java Runtime Environment)即為Java執行環境,提供了執行Java應用程式所必須的軟體環境,包含有Java虛擬機器(JVM)
和豐富的系統類庫。
JVM:(Java Virtual Machines)即為Java虛擬機器,提供了位元組碼檔案(.class)的執行環境支援。
關係:JDK包含JRE包含JVM。
3.javac:是java語言程式設計編譯器。
全稱java compiler。將java檔案編譯成位元組程式碼的class檔案。
4.面向物件的四大基本特性:
(1)抽象
(2)封裝
(3)繼承
(4)多型
5.列舉幾個常見的java的設計模式
工廠模式
抽象工廠模式
單例模式
原型模式
享元模式
策略模式
觀察者模式
裝飾者模式
橋接模式
組合模式
職責鏈模式
6.重寫(Overriding)和過載(Overloading)的區別?
重寫:子類重新定義了父類的方法。方法重寫必須有相同的方法名,引數列表和返回型別。
過載:發生在同一個類裡面多個方法的方法名相同但是引數列表不同。
7.介面和抽象類的區別是什麼?
(1)一個類可以實現多個介面,但是隻能繼承一個抽象類。
(2)抽象類可以有自己的方法,而介面不能,抽象類中可以包含靜態方法,介面內不能包含靜態方法。
(3)抽象類裡可以有構造方法,而介面內不能有構造方法。
(4)抽象類中的抽象方法的訪問型別可以是public ,protected和預設型別,但介面中的抽象方法只能是public型別的,並且預設即為
public abstract型別。
8.15.用最有效率的方法計算2乘以8?
答: 2 << 3(左移3位相當於乘以2的3次方,右移3位相當於除以2的3次方)。
9.Java8新特性
(1)實現了函數語言程式設計
(2)封裝了多執行緒
(3)流式處理 Streams
10.HashMap與HashTable有什麼區別?
11.多執行緒的實現方式
12.執行緒的生命週期(5種狀態):
(1)新建(New)
(2)就緒(Runnable)
(3)執行(Running)
(4)阻塞(Blocked)
(5)死亡(Dead)
13.List、Set、Map三種集合的區別https://www.cnblogs.com/IvesHe/p/6108933.html
List:1.可以有重複的物件。
2.可以插入多個空值。
3.是有序的,保持了每個元素的插入順序,輸出的順序就是插入的順序。
常用的實現類有:
ArrayList:的底層是一個object陣列,所以是有序的,查詢塊,增刪比較慢,
LinkedList:底層是以連結串列的形式進行排序的。
Vector:是執行緒安全的(執行緒同步的),而arralist執行緒是非同步的也就是說他是不安全的,效率比arralist低
Set: 1.不允許有重複的物件
2. 是無序的,無法保證每個元素的儲存順序,但是TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序。
這裡的無序是針對放入順序而言
3. 只允許有一個空值
實現類是:
HashSet:的底層是hashmap,他有著hashmap中鍵的特性,那就是,無序,不可重複性,和hashmap的區別:hashset鍵值都不允許重複
TreeSet:實現了sortset介面,sortedset有排序能力,也就意味著treeset也有著排序的能力,他是使用二叉樹進行排序的。
14.如何實現多執行緒?
多執行緒實現的四種方式:https://blog.csdn.net/u011480603/article/details/75332435
1.繼承Thread類,重寫run方法
2.實現Runnable介面,重寫run方法,實現Runnable介面的實現類的例項物件作為Thread建構函式的target
3.通過Callable和FutureTask建立執行緒
4.通過執行緒池建立執行緒
15.父類與子類之間的呼叫順序(列印結果)
a) 父類靜態程式碼塊
b) 子類靜態程式碼塊
c) 父類構造方法
d) 子類構造方法
e) 子類普通方法
f) 重寫父類的方法,則列印重寫後的方法
16.是否可以繼承String類?
String 類是final類,不可以被繼承。
17.當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?
是值傳遞。Java語言的方法呼叫只支援引數的值傳遞。
16.String和StringBuilder、StringBuffer的區別
String為字串常量,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,
StringBuilder和StringBuffer是變數,是可以更改的。
StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的
執行速度:StringBuilder > StringBuffer > String
String:適用於少量的字串操作的情況
StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況
StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況
17.int和integer的區別
1、Integer是int的包裝類,int則是java的一種基本資料型別
2、Integer變數必須例項化後才能使用,而int變數不需要
3、Integer實際是物件的引用,當new一個Integer時,實際上是生成一個指標指向此物件;而int則是直接儲存資料值
4、Integer的預設值是null,int的預設值是0
18.介面、抽象類、實體類之間的繼承和實現關係
1.介面是否可繼承介面?
介面是可以繼承介面的:定義一個泛型介面,然後讓其他介面去繼承它並定義各自的泛型類,這樣就方便很多。
2.抽象類是否可實現(implements)介面?
抽象類可以實現介面:抽象類可以有自己的方法實現,所以可以繼承介面
3.抽象類是否可繼承實體類(concrete class)?
抽象類可以繼承實體類,但前提是實體類必須有明確的建構函式。
Object就是個實體類,每個抽象類的條目裡都明確寫著直接或間接繼承自Object。
19. sleep 方法和 wait 方法的區別?
兩者都是用來暫停當前執行的執行緒,sleep()不會釋放鎖,而 wait() 要釋放鎖。
20.陣列例項化有幾種方式?
1.靜態例項化:建立陣列的時候已經指定陣列中的元素
2.動態例項化:例項化陣列的時候,只指定了陣列長度,陣列中所有元素都是陣列型別的預設值
21.equals和==的區別?
== 比較的是變數(棧)記憶體中存放的物件的(堆)記憶體地址,用來判斷兩個物件的地址是否相同,即是否是指相同一個物件。
equals用來比較的是兩個物件的內容(值)是否相等
22.如何將字串反轉?
Stringbuilder或者stringbuffer的reverse方法
23.uper與this表示什麼?
Super表示當前類的父類物件This表示當前類的物件
大題:
1.手寫單例模式(餓漢和飽漢模式)和工廠模式?
第一種:飽漢模式
public class SingleTon {
//將建構函式私有化
private SingleTon(){
}
//例項化放在靜態程式碼塊裡可提高程式的執行效率,但也可能更佔用空間
private final static SingleTon instance = new SingleTon();
public static SingleTon getInstance(){
return instance;
}
}
第二種:飢漢模式
public class SingleTon {
//將建構函式私有化
private SingleTon(){
}
private static instance = null;//new SingleTon();
public static synchronized SingleTon getInstance(){
if(instance == null){
instance = new SingleTon();
}
return instance;
}
}
2.try裡有return,若是finally裡面有程式碼會不會執行?什麼時候執行?
會執行,在return之前執行
int x = 1;
try {
return x;
}catch (Exception e) {
// TODO: handle exception
}finally {
x+=1;
System.out.println(x);
}
此時輸出的x為2
3.氣泡排序
public static void bubbleSort(int []arr) {
for(int i =0;i<arr.length-1;i++) {
for(int j=0;j<arr.length-i-1;j++) {//-1為了防止溢位
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
4.mysql級聯查詢:https://blog.csdn.net/qymufeng/article/details/80934378
5.關於String s = new String("xyz"); 建立幾個物件的問題
https://www.cnblogs.com/dangzhenjiuhao/p/4585389.html
6.設計四個執行緒,其中共兩個執行緒每次對j增加1,另外兩個執行緒每次對j減少1。迴圈100次,寫出程式。
https://blog.csdn.net/ankeyuan/article/details/39671979
7.幾個數字的全排列:https://blog.csdn.net/aijiaoxiaodetuzi/article/details/70312437
public static void permutateSequence(char[] strArrs,int i){
char temp;
if(strArrs==null||i>strArrs.length||i<0){
return;
}
else if(i==strArrs.length){
System.out.println(strArrs);
}
else{
for(int j=i;j<strArrs.length;j++){
//交換位置
temp = strArrs[j];//
strArrs[j] = strArrs[i];
strArrs[i] = temp;
//後續元素遞迴全排列
permutateSequence(strArrs, i+1);
//還原成原來的陣列,便於下一次的全排列
temp = strArrs[j];
strArrs[j] = strArrs[i];
strArrs[i] = temp;
}
}
}