1. 程式人生 > >java面試題2018(詳細)

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;
             }
         }
     }