set的contains方法,看hashcode和equals,所以对象最好重写hashcode和equals方法
判断set中课程是否存在:
contains(): List中equals()判断,Set中hashcode()+equals()判断
在这里Set的contains()方法需要重写equals和hashCode方法
public void createStudentAndSelectCours(){ Student student = newStudent("1","小明"); System.out.println("欢迎学生:"+student.name+"选课"); Scanner console = new Scanner(System.in); for(int i=0;i<3;i++){ System.out.println("请输入课程ID"); String courseId = console.next(); for(Course cr : coursesToSelct){ if(cr.id.equals(courseId)){ student.courses.add(cr); } } } } public static void main(String[] args){ SetTest st = new SetTest(); Sst.testAdd(); st.testForEach(); st.createStudentAandSelectCours(); st.testSetContains(); }
HashSet的contains的实现机制,先执行hashCode,确定哈希码相等后,然后再调用equals,只有两个方法都返回相等才认为包含某个元素。
所以如果添加的类型是自定义的类,使用contains方法时需要自定义hashCode和equals方法。
###使用 Set 集的 hashCode的方法:hashCode方法的工作原理是
Set.contains(E e)的时候,先调用从Object继承而来的hashCode方法,然后再调用equals()方法。如果两个方法都返回真的时候,才认定Set包含某个元素。
###jvm运行时,给每个对象分配唯一一个标志身份的标志hanshcode。众类鼻祖Object的hashCode()方法在默认情况下,判断哈希码是不是相同。即equals默认情况下比较的是二者是不是同一个内存块。
Set集的contains方法,内部就是先调用hashCode再调用equals()方法。很多情况要结合实际对hashCode进行改写
== 和equals()两种比较方法,在使用时要注意:
1、如果测试两个简单类型的数值是否相等,则一定要用“==”来比较;
2、如果要比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较;
3、如果需要比较两个引用变量是否指向同一对象,则使用“==”来进行比较;
还有,对于自定义的类,应该根据情况覆盖其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同
Set中的contains()方法同时调用hashCode()和equals()方法,需要重写hashCode()和equals()两个方法。
list中不需要重写hashCode()方法。
Set的contains方法,先调用hashCode方法,如果hashCode相同,才会调用equals方法
当调用HashSet的Contains()方法的时候调用的是hashcode()方法来返回哈希码,如果哈希码的值相等再调用equals()方法来判断是否相等,只有当两个都相等的情况下才会返回true
set.contains(obj)
需要重写equals()
set中的 contains
在全局变量中将Student设置为了该类的Student类型的成员变量student,不然退出了createStudentAndSelectCours方法后student对象就不存在了,你在testSetContains方法里也就访问不到
student是Student的对象,Student是一个学生类,courses是Student类里面的一个成员,用对象student调用类成员没问题
object中除了定义了equals()方法还定义了hashCode()方法
contains(obj)方法首先调用hashCode()方法,如果哈希码相等再调用equals()方法。只有在这两个值都相等才判断hashSet包含某元素
得重新定义hashCode(),右键source系统自动
重写hashCode、equals
ide可自动生成
60%
hashSet判断相等:hashCode、equals都为true
60%
hashSet的contains方法先调用hashcode()方法判断hash码是否相同,如果相同在调用equals()方法
自动生成重写hashCode()方法
hashSet的contains方法先调用hashSet的元素的hashCode方法进行判断,如果返回true再调用equals方法来进一步判断。所以需要重写hashCode和equals方法
当调用hashSet的contains方法时,其实是遍历每个元素,然后调用了hashCode()方法,返回哈希码,如果哈希码相等,再调用equals()方法,如果equals()方法也返回true,才算相等
判断set中的课程是否存在? 使用set中的contains方法,set中调用contains(obj)方法,contains方法的实现机制:先调用object中的hashcode方法,再调用object中的equals方法。所以要对对象的hashcode()方法和equals方法重写,可以使用eclipse中的source>GENARATE hashcode(),在对象的类中,实现方法的重写。
public void testSudenttoCause() {
student1 = new Student("1","CBB");
for(int i=0;i<3;i++){
System.out.println("请输入你要选课的id");
Scanner input = new Scanner(System.in);
String str = input.next();
for(Cause ca :causetolist) {
if(str.equals(ca.id)) {
student1.cause.add(ca);
}
}
}
}
public void testSetEquals() {
System.out.println("请学生输入已选择的课程:");
String name = input.next();
Cause cause =new Cause() ;
cause.name=name;
System.out.println("备选课程里是否包含课程"+cause.name+":"+student1.cause.contains(cause));
}
查询使用 contains和containsAll方法
set hashcode???
Set的contains方法原理:
——利用eclipse自动生成hashCode()和equals()的源代码。
使用Set的contains方法查询是否存在该课程:
判断set中的课程是否存在? 使用set中的contains方法,set中调用contains(obj)方法,contains方法的实现机制:先调用object中的hashcode方法,再调用object中的equals方法。所以要对对象的hashcode()方法和equals方法重写,可以使用eclipse中的source>GENARATE hashcode(),在对象的类中,实现方法的重写。
当调用hashSet的contains方法时,其实是遍历每个元素,然后调用了hashCode()方法,返回哈希码,如果哈希码相等,再调用equals()方法,如果equals()方法也返回true,才算相等
Set的contains方法
Object中,除了定义了equals (Object obj)方法,还定义了hashCode()方法
当调用HashSet的方法时,实际是每个元素先调用hashCode()方法来返回哈希码 ,哈希码值相等的情况下在调用equals()方法去判断是否相等,只有这两个都相等时,才认定HashSet包含某个元素
HashSet中contains方法实现机制
需要重写hashCode方法
可以直接利用eclipse生成
set的contains方法的原理:
set的contains方法:
Set中的contains()方法同时调用hashCode()和equals()方法,需要重写hashCode()和equals()两个方法。
list中不需要重写hashCode()方法。
Set的contains方法,先调用hashCode方法,如果hashCode相同,才会调用equals方法
自动生成hashCode()和equals()方法