javaSE HashSet集合,元素不可以重复。 需要重写hashCode()和equals()方法

本文深入探讨了Java集合框架中的核心概念,包括List、Set、ArrayList、LinkedList和HashSet等的特性和应用场景。特别关注了HashSet的内部实现原理及其如何判断元素重复,并通过重写hashCode()和equals()方法来确保数据唯一性的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Collection(集合):容器,用于存放对象(引用类型。基本类型需要自动装箱)   查看
List(列表):元素有序,元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。  查看
Set(集):元素无序,不可重复 (没有索引)。 遍历只能用Iterator迭代器和增强for, 不能使用普通for遍历。 查看
ArrayList(数组列表): 查询快,增删慢。   查看
LinkedList(链表): 查询慢,增删快。查看
HashSet(哈希表): 查询快,增删慢。 (底层其实就是Map) 。 存放的引用类型需重写hashCode()和equals()方法。 
LinkedHashSet(哈希链表): 查询慢,增删快。 有序的,存放顺序和取出顺序一致。 查看


Demo.java:

package cn.xxx.demo;

import java.util.HashSet;

import cn.xxx.demo.Person;

/*
 *  HashSet集合的自身特点:
 *    底层数据结构,哈希表
 *    存储,取出都比较快
 *    线程不安全,运行速度快
 */
public class Demo {
	public static void main(String[] args) {
		/*HashSet<String> set = new HashSet<String>();
		set.add(new String("abc"));
	    set.add(new String("abc"));
		set.add(new String("bbc"));
		set.add(new String("bbc"));
		System.out.println(set);*/
		
		
		//将Person对象中的姓名,年龄,相同数据,看作同一个对象
		//判断对象是否重复,依赖对象自己的方法 hashCode,equals
		HashSet<Person> setPerson = new HashSet<Person>();
		setPerson.add(new Person("a",11));
		setPerson.add(new Person("b",10));
		setPerson.add(new Person("b",10));
		setPerson.add(new Person("c",25));
		setPerson.add(new Person("d",19));
		setPerson.add(new Person("e",17));
		System.out.println(setPerson);
	}
}
Person.java(存放的引用类型重写hashCode()和equals()方法):
package cn.xxx.demo;

public class Person {
	private String name;
	private int age;
	/*
	 * Person对象如果存放到HashSet集合中,必须重写hashCode()和equals()方法。
	 * HashSet集合存放对象,是根据对象的hashCode()值进行存放的。 两个对象的hashCode如果相同,然后判断是否equals,如果相同就是重复元素。HashSet集合不会存放重复元素
	 * hashCode()和equals()方法可以由Eclipse工具自动生成。
	 * 重写的原则:
	 *      equals()为true的两个对象的hashCode必须相同。  通过equals()方法判断集合中的元素是否重复。
	 *     hashCole()值相同的两个对象,equals()不一定为true。
	 *     
	 * 8种基本数据类型对应的引用类型(8种包装类)以及String类型,已经自动重写了hashCode()和equals()方法。
	 * 
	 */

	public int hashCode(){  // 重写hashCode()方法。
		return name.hashCode()+age*55;
	}

	public boolean equals(Object obj){  // 重写equals()方法。
		if(this == obj)
			return true;
		if(obj == null)
			return false;
		if(obj instanceof Person){
			Person p = (Person)obj;
			return name.equals(p.name) && age==p.age;
		}
		return false;
	}
	
	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;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person(){}
	
	public String toString(){
		return name+".."+age;
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值