练习:往HashSet中存储学生对象(姓名,年龄) 同姓名,同年龄视为一个人,不存

具体源码实现

package com.runoob.test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*
		 * 练习:往HashSet中存储学生对象(姓名,年龄) 同姓名,同年龄视为一个人,不存
		 * 1.描述学生
		 * 2.定义容器
		 * 3.将学生对象存储到容器中
		 *
		 *
		 * 发现存储了同姓名童年里的学生是可以的
		 * 原因是每一次存储学生对象时,都先调用hashCode方法获取哈希值
		 * 但是调用的是Object类中的hashCode,所以不同的对象,哈希值也不同
		 * 这就是同姓名同年龄存入的原因
		 *
		 * 解决:
		 * 需要根据学生对象自身的特点来定义哈希值
		 * 所以就需要覆盖hashCode方法
		 */

		//1.创建容器对象
		Set set = new HashSet();

		//2.存储学生对象
		set.add(new Student("xiaoqiang",21));
		set.add(new Student("wangcai",27));
		set.add(new Student("xiaoming",22));
		set.add(new Student("xiaoqi",23));
		set.add(new Student("xiaoming",22));
		set.add(new Student("xiaoqi",23));

		//3.获取所有学生
		for (Iterator it = set.iterator(); it.hasNext();) {
			Student stu = (Student) it.next();
			System.out.println(stu.getName()+"::"+stu.getAge());

		}
	}

}

  

=============================================================================================================================================================================================

package com.runoob.test;

  class Student {

	private String name;
	private int age;

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}

	/*shift+alt+s 快捷键出来的
	 * *(non-Javadoc)
	 * @see java.lang.Object#hashCode()

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}*/

//哈希值冲突了 需要判断内容 equlas 自己写的

//自定义重写hashCode 和equals 方法
	public int hashCode(){
		final int NUMBER=37;
		return name.hashCode()+age*NUMBER;

	}

	public boolean equals(Object obj){

		//System.out.println(this+"vs"+obj);
		if(this==obj){
			return true;
		}

		if(!(obj instanceof Student)){
			throw new ClassCastException("类型错误");
		}

		Student stu =(Student)obj;
		return this.name.equals(stu.name)&&this.age==stu.age;

	}

}

  

时间: 2024-10-23 00:36:05

练习:往HashSet中存储学生对象(姓名,年龄) 同姓名,同年龄视为一个人,不存的相关文章

黑马程序员——java——TreeSet集合中储存学生对象,按照其年龄进行排序

TreeSet集合中储存学生对象,按照其年龄进行排序 import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.TreeSet; public class SortListDemos { public static void main(String[] args) { // //linkhash

Java基础知识强化之集合框架笔记13:Collection集合存储学生对象并遍历

1. Collection集合存储学生对象并遍历: 需求:存储自定义对象并遍历Student(name,age) 分析: (1)创建学生类 (2)创建集合对象 (3)创建学生对象 (4)把学生对象添加到集合对象中 (5)遍历集合 2. 代码示例: Student.java,如下: 1 package cn.itcast_04; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Stude

集合中存储自定义对象源代码

集合中存储自定义对象: package attention; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Main_7 { public static void main(String[] args) { Collection coll=new ArrayList(); coll.add(new Person("List1",21));

集合框架(Collection存储学生对象并遍历)

先创建学生类 package cn.itcast_04; public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } publi

集合框架(List存储学生对象并遍历)

package cn.itcast_02; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /* * 存储自定义对象并遍历 */ public class ListDemo { public static void main(String[] args) { // 创建集合对象 List list = new ArrayList(); // 创建学生对象 Student s1 = new

用HashSet存储自定义对象

  案例 package cn.itcast_02; import java.util.HashSet; /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同,则为同一个元素. * * 目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法. * 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类. * 这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作. */ pub

《java入门第一季》之HashSet存储自定义对象问题以及注意事项

上一篇http://blog.csdn.net/qq_32059827/article/details/51578158 写到存储字符串类型的时候出现了无序,而且这个无序不是随机那种无序,它是有一定存储规律的.上次存储的是字符串,那么这里看看存储自定义对象是不是也是同样的规律.其实这里有着很多的问题需要讨论. 存储自定义对象,代码写了出来: import java.util.HashSet; public class HashSetDemo2 { public static void main(

TreeSet排序,存储自定义对象,自定义比较器示例

Set:无序,不可以重复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:判断元素的hashCode值是否相同. 如果相同,还会继续判断元素的equals方法,是否为true. |--TreeSet:可以对Set集合中的元素进行排序. 底层数据结构是二叉树. 保证元素唯一性的依据:compareTo方法return 0. TreeSet排序的第一种方式:让元素自身具备比较性. 元素需要实现Comparable接口,覆盖compareTo方法. 也种方式也成为

程序通过定义学生结构体变量,存储学生的学号、姓名和3门课的成绩。函数fun的功能是:对形参b所指结构体变量中的数据进行修改,并在主函数中输出修改后的数据。

程序通过定义学生结构体变量,存储学生的学号.姓名和3门课的成绩.函数fun的功能是:对形参b所指结构体变量中的数据进行修改,并在主函数中输出修改后的数据.例如,若b所指变量t中的学号.姓名和三门课的成绩一次是:10002."ZhangQi".93.85.87,修改后输出t中的数据应为:10004."Lijie".93.85.87. #include <stdio.h>#include <string.h>struct student { lo