您的位置:首页 > 编程语言 > Java开发

day12

2016-05-26 13:48 417 查看
学习内容:
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,文件的复制
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个字符时用时最短
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java