Java 學(xué)習(xí)思維導(dǎo)圖之 Collection 與 Map 以及常用類

何以解憂,唯有學(xué)習(xí)

今天給大家分享的是 Collection 與 Map 以及常用類的思維導(dǎo)圖,以后還會繼續(xù)更新的。

Collection 與 Map 思維導(dǎo)圖

  • Collection 接口
    collection

    實現(xiàn) List 接口的類都遵從有序原則,即按照輸入順序進行輸出。

Linkedlist 原理圖如下所示:

LinkedList 原理圖
HashSet 底層原理圖

實現(xiàn) set 接口的類可以說成是唯一,有序的,這里的有序是指按照從小到大的順序,也可以說是無序的,這里的無序是指沒有按照輸入順序進行輸出)。

但是,如圖中所示,LinkedHashSet 類是唯一,有序的,這里的有序是指按照輸入輸出的順序。

  • Map 接口


    map

Map 與 List 和 Set 不同,它是雙列的集合,按照 key/value 鍵值對進行存儲的,不能存儲重復(fù)的 key。

  • 再來說說 hashCode 和 equals,hashCode 是用于查找使用的,而equals 是用于比較兩個對象的是否相等的。之前在網(wǎng)上看到過一段解釋,覺得挺有意思的,而且相對來說比較好理解:
  1. hashcode 是用來查找的,例如內(nèi)存中有這樣的位置 0、1、2、3、4、5、6、7 共八個位置。
    而我有個類,這個類有個字段叫 ID,我要把這個類存放在以上 8 個位置之一,如果不用 hashcode 而任意存放,那么當(dāng)查找時就需要到這八個位置里挨個去找,或者用二分法一類的算法。
    但如果用hashcode那就會使效率提高很多。
    我們這個類中有個字段叫 ID,那么我們就定義我們的 hashcode 為
    ID%8,然后把我們的類存放在取得得余數(shù)那個位置。比如我們的 ID 為9,9 除 8 的余數(shù)為 1,那么我們就把該類存在 1 這個位置,如果 ID 是13,求得的余數(shù)是 5,那么我們就把該類放在 5 這個位置。這樣,以后在查找該類時就可以通過 ID 除 8求余數(shù)直接找到存放的位置了。

  2. 但是如果兩個類有相同的 hashcode 怎么辦呢(我們假設(shè)上面的類的 ID
    不是唯一的),例如 9 除以 8 和 17 除以 8 的余數(shù)都是 1,那么這是不是合法的,回答是:可以這樣。
    那么如何判斷呢?在這個時候就需要定義 equals了。
    也就是說,我們先通過 hashcode 來判斷兩個類是否存放某個桶里,但這個桶里可能有很多類,那么我們就需要再通過 equals 來在這個桶里找到我們要的類。
    那么,重寫了 equals() 方法,為什么還要重寫 hashCode() 呢?
    想想,你要在一個桶里找東西,你必須先要找到這個桶啊,你不通過重寫hashcode() 來找到桶,光重寫 equals() 有什么用啊 。

接下來是常用類的思維導(dǎo)圖:

常用類

其中日期類有一個實例,叫可視化日歷,完成的功能效果和日歷一樣,現(xiàn)在把代碼放出來,又興趣的童鞋可以試著敲一敲:

思路:
 *第一部分:
 *(1) 用戶輸入字符串;
 *(2) 字符串轉(zhuǎn)換Date;
 *(3) Date轉(zhuǎn)成Calendar;
 *
 *第二部分:
 *(4) 輸出:日一二三四五六;
 *(5) 1號之前輸出多少空格;判斷1號是一星期中的第幾天;
 *(6) 當(dāng)月最大天數(shù);
 *(7) 得到當(dāng)天日期;
 *(8) 換行


public static void main(String[] args) throws ParseException {
        
        Scanner input=new Scanner(System.in);

        //1.模擬用戶輸入日期格式的字符串;
        System.out.println("請輸入日期(按照格式:2015-09-20)");
        String strDate=input.next();//必須和格式化器的指定一致;

        //2.把strDate轉(zhuǎn)成Date;定義格式化器;
        DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
        Date date=df.parse(strDate);

        //3.date轉(zhuǎn)成Calendar;
        Calendar cal=Calendar.getInstance();
        cal.setTime(date);
        //System.out.println(cal.getTime());
        
        //0.得到當(dāng)天日期;
        int nowDate=cal.get(Calendar.DATE);
        
        //1.1號之前的空格數(shù):
        cal.set(Calendar.DATE, 1);//把日期設(shè)成1號;
        int week=cal.get(Calendar.DAY_OF_WEEK);
        //2.本月最大天數(shù);
        int maxDate=cal.getActualMaximum(Calendar.DATE);
            
        //開始輸出:
        //1.輸出星期:
        System.out.println("日\t一\t二\t三\t四\t五\t六");
        
        //2.輸出空格;
        for(int i=1;i<week;i++){
            System.out.print("\t");
        }
    
        //3.輸出日期;
        for(int i=1;i<=maxDate;i++){
            
            if(i==nowDate){
                System.out.print(i+"*\t");  
            }else{
                System.out.print(i+"\t");
            }
            //如果當(dāng)前日期是一星期的第七天,換行;
            if(cal.get(Calendar.DAY_OF_WEEK)==7){
                System.out.println();
            }
            
            //每次循環(huán)結(jié)束,cal的日期加1;
            cal.add(Calendar.DATE, 1);
        }
    }

思維導(dǎo)圖以后還會更新,希望對你有幫助,后期會繼續(xù)不斷地更新,敬請期待,請大家多多關(guān)注!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容