day12

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day12相关的知识,希望对你有一定的参考价值。

学习内容:

  1. 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,文件的复制

以上是关于day12的主要内容,如果未能解决你的问题,请参考以下文章

list(), if 和短路评估

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象

12个用得着的 JQuery 代码片段

[code] PTA 胡凡算法笔记 DAY039

JavaScript 有用的代码片段和 trick