标签:java
学习内容:
hashmap原理:
常用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位置。
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对应同一个 value
hashmap实现map接口,存储键值对,键唯一
-------------------------------------------------------------------------------------
作业:
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,文件的复制
标签:java
原文地址:http://11312010.blog.51cto.com/11302010/1783438