day12

學習內容:css

  1. hashmap原理:java

    經常使用API是put(K,V)和get(K)。map中鍵是惟一的,咱們調用put存值時,HashMap首先會調用K的hashCode方法,獲取哈希碼,經過哈希碼快速找到某個存放位置,這個位置能夠被稱之爲bucketIndex,經過hashCode的協定能夠知道,若是hashCode不一樣,equals必定爲false,若是hashCode相同,equals不必定爲true。因此理論上,hashCode可能存在衝突的狀況,有個專業名詞叫碰撞,當碰撞發生時,計算出的bucketIndex也是相同的,這時會取到bucketIndex位置已存儲的元素,最終經過equals來比較,equals方法就是哈希碼碰撞時纔會執行的方法,因此前面說HashMap不多會用到equals。HashMap經過hashCode和equals最終判斷出K是否已存在,若是已存在,則使用新V值替換舊V值,並返回舊V值,若是不存在 ,則存放新的鍵值對<K, V>到bucketIndex位置。ide

   public V put(K key, V value) {
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }
        //容許鍵爲空值
        if (key == null)
            return putForNullKey(value);
        //key!=null,計算期hash值
        int hash = hash(key);
        //根據hashcode獲取key在table的bucketIndex
        int i = indexFor(hash, table.length);
        /取出bucketIndex上的元素,循環鏈表
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            //當插入的key和當前循環到的key hashcode相同,而且(內存地址相同
            //或equals爲true時,則認爲key重複
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                //key重複時,取出舊值,用新插入的value覆蓋,並返回舊值
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
       //要插入的key沒有重複,添加新的鍵值對到map
        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

2.hashset和hashmap的異同學習

 hashset實現的是collection接口,存儲的是惟一的對象,底層實現就是hashmap,全部key對應同一個  valuethis

 hashmap實現map接口,存儲鍵值對,鍵惟一spa

-------------------------------------------------------------------------------------code

做業:orm

1,hashmap實現原理,見上對象

2,hashset和hashmap的區別,見上接口

3,集合的嵌套

public static void main(String[] args) {
		
		List<Classes> css=new ArrayList<>();
		for (int i = 1; i < 11; i++) {
			List<Student> sts = new ArrayList<>();
			for (int j = 1; j < 51; j++) {
				sts.add(new Student("mingming" + j, j));
			}
			Classes c = new Classes(i, sts);
			css.add(c);
		}
		Map<Grade, List<Classes>> map = new HashMap<Grade, List<Classes>>();
		Grade grade=new Grade(1); 
		map.put(grade, css);
		System.out.println(map.get(grade).size());
		System.out.println(map.get(grade).get(0).getSts().size());
		
	}
public class Grade {
	
	private int grade;

	public Grade(int grade) {
		super();
		this.grade = grade;
	}

	public int getGrade() {
		return grade;
	}

	public void setGrade(int grade) {
		this.grade = grade;
	}
	
}
public class Classes {
	
	private int number;
	
	private List<Student> sts;

	public Classes(int number, List<Student> sts) {
		super();
		this.number = number;
		this.sts = sts;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	public List<Student> getSts() {
		return sts;
	}

	public void setSts(List<Student> sts) {
		this.sts = sts;
	}
}
public class Student {
	private String name;
	private int id;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public Student(String name, int id) {
		super();
		this.name = name;
		this.id = id;
	}
}

4,文件的複製

public static void main(String[] args) throws Exception {
		long begin=System.currentTimeMillis();
		System.out.println("開始複製時間:"+begin);
		FileReader reader=new FileReader("d:\\a.txt");
		char[] buf=new char[512];
		FileWriter writer=new FileWriter("d:\\b.txt");
		int len=0;
		while((len=reader.read(buf))!=-1){
			writer.write(buf, 0, len);
		}
		System.out.println("複製完成,共耗時"+(System.currentTimeMillis()-begin));
		writer.close();
		reader.close();
	}

修改buf大小,發現buf在512個字符時用時最短

相關文章
相關標籤/搜索