今天給大家分享的是 Collection 與 Map 以及常用類的思維導圖,以后還會繼續更新的。
Collection 與 Map 思維導圖
- Collection 接口
collection
實現 List 接口的類都遵從有序原則,即按照輸入順序進行輸出。
Linkedlist 原理圖如下所示:
實現 set 接口的類可以說成是唯一,有序的,這里的有序是指按照從小到大的順序,也可以說是無序的,這里的無序是指沒有按照輸入順序進行輸出)。
但是,如圖中所示,LinkedHashSet 類是唯一,有序的,這里的有序是指按照輸入輸出的順序。
-
Map 接口
map
Map 與 List 和 Set 不同,它是雙列的集合,按照 key/value 鍵值對進行存儲的,不能存儲重復的 key。
- 再來說說 hashCode 和 equals,hashCode 是用于查找使用的,而equals 是用于比較兩個對象的是否相等的。之前在網上看到過一段解釋,覺得挺有意思的,而且相對來說比較好理解:
hashcode 是用來查找的,例如內存中有這樣的位置 0、1、2、3、4、5、6、7 共八個位置。
而我有個類,這個類有個字段叫 ID,我要把這個類存放在以上 8 個位置之一,如果不用 hashcode 而任意存放,那么當查找時就需要到這八個位置里挨個去找,或者用二分法一類的算法。
但如果用hashcode那就會使效率提高很多。
我們這個類中有個字段叫 ID,那么我們就定義我們的 hashcode 為
ID%8,然后把我們的類存放在取得得余數那個位置。比如我們的 ID 為9,9 除 8 的余數為 1,那么我們就把該類存在 1 這個位置,如果 ID 是13,求得的余數是 5,那么我們就把該類放在 5 這個位置。這樣,以后在查找該類時就可以通過 ID 除 8求余數直接找到存放的位置了。但是如果兩個類有相同的 hashcode 怎么辦呢(我們假設上面的類的 ID
不是唯一的),例如 9 除以 8 和 17 除以 8 的余數都是 1,那么這是不是合法的,回答是:可以這樣。
那么如何判斷呢?在這個時候就需要定義 equals了。
也就是說,我們先通過 hashcode 來判斷兩個類是否存放某個桶里,但這個桶里可能有很多類,那么我們就需要再通過 equals 來在這個桶里找到我們要的類。
那么,重寫了 equals() 方法,為什么還要重寫 hashCode() 呢?
想想,你要在一個桶里找東西,你必須先要找到這個桶啊,你不通過重寫hashcode() 來找到桶,光重寫 equals() 有什么用啊 。
接下來是常用類的思維導圖:
其中日期類有一個實例,叫可視化日歷,完成的功能效果和日歷一樣,現在把代碼放出來,又興趣的童鞋可以試著敲一敲:
思路:
*第一部分:
*(1) 用戶輸入字符串;
*(2) 字符串轉換Date;
*(3) Date轉成Calendar;
*
*第二部分:
*(4) 輸出:日一二三四五六;
*(5) 1號之前輸出多少空格;判斷1號是一星期中的第幾天;
*(6) 當月最大天數;
*(7) 得到當天日期;
*(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轉成Date;定義格式化器;
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Date date=df.parse(strDate);
//3.date轉成Calendar;
Calendar cal=Calendar.getInstance();
cal.setTime(date);
//System.out.println(cal.getTime());
//0.得到當天日期;
int nowDate=cal.get(Calendar.DATE);
//1.1號之前的空格數:
cal.set(Calendar.DATE, 1);//把日期設成1號;
int week=cal.get(Calendar.DAY_OF_WEEK);
//2.本月最大天數;
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");
}
//如果當前日期是一星期的第七天,換行;
if(cal.get(Calendar.DAY_OF_WEEK)==7){
System.out.println();
}
//每次循環結束,cal的日期加1;
cal.add(Calendar.DATE, 1);
}
}
思維導圖以后還會更新,希望對你有幫助,后期會繼續不斷地更新,敬請期待,請大家多多關注!