Set keySet = hashMap1.keySet();
Iterator iterator = keySet.iterator();
while(iterator.hasNext())
{
String key = iterator.next();
System.out.println(key+"\t"+hashMap1.get(key));
}
System.out.println(“Java中自带的数据类型:相同的对象会覆盖!”);
System.out.println("\n");
//用户自定义的数据类型:为重写之前
System.out.println(“测试用户自定义的数据类型–未重写两个方法之前:”);
HashMap<Student, String> hashMap2 = new HashMap<Student,String>();
hashMap2.put(new Student(“zhangsan”,88.8), “beijing”);
hashMap2.put(new Student(“lisi”,88.8), “beijing”);
hashMap2.put(new Student(“wangwu”,66.9), “beijing”);
hashMap2.put(new Student(“zhangsan”,88.8), “beijing”);
hashMap2.put(new Student(“lisi”,88.8), “beijing”);
hashMap2.put(new Student(“wangwu”,66.9), “beijing”);
Set keySet2 = hashMap2.keySet();
Iterator iterator2 = keySet2.iterator();
while(iterator2.hasNext())
{
Student key = iterator2.next();
System.out.println(key+"\t"+hashMap2.get(key));
}
System.out.println(“如果没有重写:导致相同的对象不会被覆盖!”);
}
}
class Student implements Comparable
{
public String name;
public double score;
public Student(String name,double score)
{
this.name = name;
this.score = score;
}
public String toString()
{
return this.name+"\t"+this.score;
}
public int compareTo(Student obj)
{
if(this.score > obj.score)
return 1;
else
return -1;
}
}
结果:
先测试Java中自带的数据类型:
wangting 87.5
wangwu 98.6
lisi 88.6
zhangsan 96.0
Java中自带的数据类型:相同的对象会覆盖!
测试用户自定义的数据类型–为重写两个方法之前:
zhangsan 88.8 beijing
wangwu 66.9 beijing
lisi 88.8 beijing
wangwu 66.9 beijing
zhangsan 88.8 beijing
lisi 88.8 beijing
如果没有重写:导致相同的对象不会被覆盖!
实例程序2:重写之后
package IT;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class App
{
public static void main(String[] args)
{
//用户自定义的数据类型:为重写之后
System.out.printl
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
n(“测试用户自定义的数据类型–重写两个方法之后:”);
HashMap<Student, String> hashMap2 = new HashMap<Student,String>();
hashMap2.put(new Student(“zhangsan”,88.8), “beijing”);
hashMap2.put(new Student(“lisi”,88.8), “beijing”);
hashMap2.put(new Student(“wangwu”,66.9), “beijing”);
hashMap2.put(new Student(“zhangsan”,88.8), “beijing”);
hashMap2.put(new Student(“lisi”,88.8), “beijing”);
hashMap2.put(new Student(“wangwu”,66.9), “beijing”);
Set keySet2 = hashMap2.keySet();
Iterator iterator2 = keySet2.iterator();
while(iterator2.hasNext())
{
Student key = iterator2.next();
System.out.println(key+"\t"+hashMap2.get(key));
}
System.out.println(“重写过后:相同的对象会被覆盖!”);
}
}
class Student implements Comparable
{
public String name;
public double score;
public Student(String name,double score)
{
this.name = name;
this.score = score;
}
public String toString()
{
return this.name+"\t"+this.score;
}
public int compareTo(Student obj)
{
if(this.score > obj.score)
return 1;
else
return -1;
}
@Override
public int hashCode()
{
return (int) (this.name.hashCode()*score);//保证相同对象映射到同一个索引位置
}
@Override
public boolean equals(Object obj)
{
Student cc = (Student)obj;
return this.namecc.name&&this.scorecc.score;
}
}
结果:
测试用户自定义的数据类型–重写两个方法之后:
wangwu 66.9 beijing
zhangsan 88.8 beijing
lisi 88.8 beijing
重写过后:相同的对象会被覆盖!
重要的一个逻辑:逻辑上来讲,只要两个对象的内容相同,其地址(hashCode()返回值)以及这两个对象就应该相同(equals()).
1、凡是把类对象放到容器中,相应的类都应该实现Object类中的toString()方法;
2、凡是需要进行比较排序的类都应该实现Comparable接口中的compareTo()方法;凡是把类对象放到以树为内部结构的容器中都应该实现Comparable接口中的compareTo()方法
3、凡是把类对象放到以哈希表为内部存储结构的容器中,相应的类必须要实现equals方法和hashCode方法,这样才符合哈希表真实的逻辑功能.
4、逻辑上来讲,只要两个对象的内容相同,其地址(hashCode()返回值)以及这两个对象就应该相同(equals())。
哈希冲突的相关概念
本质上讲就是:hash(对象1.hashCode())=hash2(对象2.hashCode()),即第一个对象的hashCode()方法返回的哈希码值带入到哈希函数后得到的索引位置与第二个对象的hashCode()方法返回的哈希码值带入到哈希函数后得到的索引位置相同,这就是哈希冲突。
最常见的哈希算法是取模法。
下面简单讲讲取模法的计算过程。
比如:数组的长度是5。这时有一个数据是6。那么如何把这个6存放到长度只有5的数组中呢。按照取模法,计算6%5,结果是1,那么就把6放到数组下标是1的位置。那么,7 就应该放到2这个位置。到此位置,哈斯冲突还没有出现。这时,有个数据是11,按照取模法,11%5=1,也等于1。那么原来数组下标是1的地方已经有数了,是6。这时又计算出1这个位置,那么数组1这个位置,就必须储存两个数了。这时,就叫哈希冲突。冲突之后就要按照顺序来存放了。
如果数据的分布比较广泛,而且储存数据的数组长度比较大。
那么哈希冲突就比较少。否则冲突是很高的。
细说Java之util类:
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。
Collection