16.Set集合

1.存储特点:

相对无序存储,不可以存储相同的元素(排重),不能通过下标访问

在这里插入图片描述

2.Set常用实现类

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

public class SetDemo {

	public static void main(String[] args) {
		Set sets=new HashSet();
		sets.add("bcd");
		sets.add("abc");
		sets.add(123);
		sets.add("abc");
		System.out.println(sets);
		//遍历Set集合
		for(Object o:sets){
			System.out.println(o);
		}
		Iterator it=sets.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}

2.1HashSet

  • 此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素
  • 存储特点:无序,不允许重复,允许null元素

2.2LinkedHashSet

是HashSet的子类.相对有序.
存储特点:有序(通过二叉树实现排序),不允许重复,允许null元素

2.3TreeSet

  • 是可以给元素进行重新排序的一个Set接口的实现.使用元素的自然顺序对元素进行排序,或者根据创建Set时提供的Comparator进行排序,具体取决于使用的构造方法
  • 存储特点:有序,不重复,不允许null元素,TreeMap实现

例子:

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

/**
 * @author CC
 * HashSet
 */
public class SetDemo2 {

	public static void main(String[] args) {
		Student gu=new Student();
		gu.setStuName("谷丰");
		gu.setStuNo("1001");
		Student cui=new Student();
		cui.setStuName("崔宸");
		Set<Student> setStu=new HashSet<Student>();
		setStu.add(gu);
		setStu.add(cui);
		//不允许重复,由于重写了hashCode和equals,所以不会添加进集合
		Student wang=new Student();
		wang.setStuName("谷丰");
		wang.setStuNo("1001");
		setStu.add(wang);
		//迭代器遍历
		Iterator<Student> it=setStu.iterator();
		while(it.hasNext()){
			Student s=it.next();
			System.out.println(s.getStuName());
		}
		//LinkedSet有序
		LinkedHashSet<Student> linkedSet=new LinkedHashSet<Student>();
		linkedSet.add(gu);
		linkedSet.add(cui);
		System.out.println("--------------------------");
		for(Student s:linkedSet){
			System.out.println(s.getStuName());
		}
	}
}

3.重写hashCode和equals方法

Java判断对象是否相同的过程

  • 1、先判断hashCode(),如果hashCode不同,则加入集合中
    如果hashCode相同,则进一步判断equals
  • 重写equals
    例:
    setStu.add(stu1);
    自动调用stu1对象的hashCode(),系统自动判断此hashCode值在HashSet集合中是否已经存值
    如果没有存值,则存入到HashSet中
    如果有,再次调用eqals()方法,根据equals返回的结果true:值相同,不添加到HashSet
    false :值不同,则添加到HashSet
public class Student {
	private String stuNo;
	private String stuName;
	public String toString(){
		return stuNo+","+stuName;
	}
	//重新Object类的hashCode方法
	public int hashCode(){
		//根据属性值来产生hashCode
		final int pri=31;
		int result=1;
		result=pri+(stuNo==null?0:stuNo.hashCode());
		result=result+(stuName==null?0:stuName.hashCode());
		return result;
	}
	//重写Object类的equals方法
	public boolean equals(Object o){
		//逐个属性值一一对比
		//判断地址是否相同
		if(this==o){
			return true;  //同一个对象
		}
		if(o==null){
			return false; //不是同一对象
		}
		//判断原始类型是否相同
		if(this.getClass() !=o.getClass()){
			return false; //不同对象
		}
		//把形参o进行强转
		Student s=(Student)o;
		if(this.stuName==null){
			if(s.stuName!=null){
				return false;
			}
		}else if(!this.stuName.equals(s.stuName)){
			return false;
		}
		if(this.stuNo==null){
			if(s.stuNo!=null){
				return false;
			}
		}else if(!this.stuNo.equals(s.stuNo)){
			return false;
		}
		return true;
	}
	public String getStuNo() {
		return stuNo;
	}
	public void setStuNo(String stuNo) {
		this.stuNo = stuNo;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值