0917Java面試知識點準備

  1. Java中String類常量池概念的理解
    java中創建字符串對象的方式有2種:字面量形式+new創建對象的方式.
    String常量池:原有使用new形式創建string對象會導致大量內存的使用.爲了避免資源上的浪費,所以一般字符串對象的聲明都採用字面量形式.在使用字面量形式創建string對象時候,jvm會檢索方法區中的字符串常量池是否存在當前字符串,如果存在則不創建該對象,只用常量池中已經存在的對象.如果不存在的話則在常量池中創建對象.

  2. Java中靜態代理及2種動態代理的區別?
    靜態代理其實就是裝飾者模式,主要是爲了解決寫好的java類中在不修改原有類的基礎上實現功能的擴展就需要用到代理模式.通過代理對象與目標對象實現相同的接口,代理對象中的構造方法傳入目標對象,然後在代理對象中的實現方法中使用目標對象的接口實現方法,同時在此基礎上添加擴展的功能,從而達到代理模式的目的.

動態代理:靜態代理能夠實現不修改目標對象的基礎上 擴展功能的目的,但若頻繁需要擴展功能,那麼需要頻繁的修改代理對象類與目標對象類的內方法,很麻煩.所以爲了解決這種問題 出現了動態代理 無需手動創建代理對象.動態代理主要包括jdk代理與cglib代理.

jdk動態代理:通過jdk包中的Prxoy.newProxyInstacen方法,獲取目標類的代理類,
然後在此基礎上實現功能的擴展.
cglib代理:原理類似通過Proxy.newProxyInstance方法獲取目標類的子類對象,然後在此基礎上實現功能的擴展.

  1. &&與&之前的區別?
    &&主要是與運算.全true則爲true,有false則爲false.也成爲短路運算,就是前面的錯誤了,後面的代碼就不執行了.而&符號則是有1位1,其他爲0的算法.9&8=1001&1000=1000=8

  2. continue與break之間的區別?
    contine與break都是用於結束循環體結構的,主要的區別在於continue用於在循環體中跳過當次循環,執行下一次循環.而break是直接結束當前循環體.

  3. java中equals/hashCode/==符號之間的區別?
    ==在基本數據類型中 主要用於比較2個值是否相等.
    而在對象比較中 主要比較的2個對象的引用類型所指向的地址是否是同一個對象.
    equals是Object類中的方法,主要用於比較2個對象是否爲同一個對象實例.特殊情況比如String類重寫了equals方法(判斷數據類型是否相等,判斷字符串長度是否一致,循環判斷字符是否一致.)主要用於字符串對象的值是否相等.
    (良好的equals方法主要有 自反省和 對稱性 傳遞性 非空性 一致性)

hashCode是Obejct中的方法,主要用於產生當前對象的哈希值.用於比較2個對象是否相等.hashCode值相等對象不一定相等.而2個對象相等,那麼hashCode一定相等.

  1. String類是否可以被繼承?
    不可以,String類使用final修飾,不可被繼承.

  2. java中的方法參數是值傳遞還是引用傳遞?
    java中沒有引用傳遞,只有值傳遞.都是堆中存儲的數據.

  3. java中方法重載和重寫之間的區別?
    方法的重載出現在同一個類當中,方法名相同,而方法的參數類型或個數不同,稱爲方法的重載.
    方法的重寫出現的父類及子類當中,子類繼承父類的方法,並重寫方法體中的內容,稱爲方法的重寫.

  4. 抽象類和接口的區別?
    抽象類使用abstract關鍵字修飾,存在抽象方法的類稱爲抽象類.既有成員變量又有常量,既有抽象方法又有普通方法.
    接口使用interface關鍵字修飾,只有抽象方法+常量.

  5. 靜態變量和實例變量的區別?
    靜態變量使用tstaic修飾,屬於類.使用類名.變量名訪問.無論該類創建多少個對象實例,只有一個靜態變量.
    實例變量屬於當前對象實例的變量,可以使用引用.變量名訪問.其他實例無訪問.

  6. Java中異常分爲哪2中?
    java中的異常分爲編譯時異常和運行時異常.編譯時異常主要由編譯器發現並提示錯誤,而運行時異常主要java語言提供內部檢查.java語言的異常由Throw類擴展出來分爲Exception和Error錯誤.一般來講都是Exception錯誤爲主,常見的如空指針異常,數組越界,類型轉換異常等,文件未找到,類型未找到等.

  7. java中如何對HashMap進行排序?
    HashMap本來是沒有順序區分,但HashMap的子類LinkedHashMap具由順序的作用.所以主要返回LinkedHashMap即可。而排序方法主要是利用Collections類中sort方法進行排序,首先將HashMap的鍵值通過entrySet方法拿出來,然後再將Entry集合放到ArrayList集合當中,利用Collections方法進行排序,然後放到LinkedHashMap集合裏面並且返回.

package SortHashMap;

import java.util.*;

/**
 *
 */
public class SortHashMap {
    public static void main(String[] args) {
        HashMap<Integer, User> map = new HashMap<>();
        map.put(4,new User(3,"張三"));
        map.put(2,new User(1,"找死"));
        map.put(1,new User(2,"網吧"));
        System.out.println(map);
        HashMap<Integer,User> sortMap=sortMap(map);
        System.out.println(sortMap);

    }
    
    private static HashMap<Integer,User> sortMap(HashMap<Integer,User> map) {
        //1.將map集合鍵值對讀取出來
        Set<Map.Entry<Integer,User>> entries = map.entrySet();
        //2.放入到ArrayList集合裏面取
        ArrayList<Map.Entry<Integer,User>> list = new ArrayList<>(entries);
        //3.利用Collections類進行排序
        Collections.sort(list, new Comparator<Map.Entry<Integer,User>>() {
            @Override
            public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {
                if(o1.getValue().getAge()>o2.getValue().getAge()){
                    return 1;
                }else  if(o1.getValue().getAge()<o2.getValue().getAge()){
                    return  -1;
                }else {
                    return 0;
                }
            }
        });
        //4.將排序的放入LinkedHashMap中
        LinkedHashMap<Integer,User> sortMap = new LinkedHashMap<Integer, User>();
        for (Map.Entry<Integer,User> entry: list) {
            sortMap.put(entry.getKey(),entry.getValue());
        }
        return  sortMap;
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章