黑马程序员——java基础之Set集合

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、Set集合概述

Set集合元素的存入顺序和取出顺序是不一致的,集合中的元素不可以重复。Set集合的两个常用子类:HashSet和TreeSet。

二、HashSet

1.HashSet的常见方法

	//HashSet的常见操作方法
	add()
	addAll()
	remove()
	removeAll()
	iterator()
	
2.HashSet集合保证元素唯一性的依据:

元素通过调用自己的hashCode和equals方法,比较异同。当hashcode值不同时,直接存入集合不进行equals判断。当hashcode相同时,继续进行equals判断,如果equals返回true则存入失败。

注意:当自定义对象存入HashSet中时,为了避免相同对象的存入,需要对象类根据自身的属性特征复写Object类的hashcode和equals方法。

3.练习题:自定义一个pers类,并将person对象存入HashSet集合,再将人对象的属性获取出来。

/*
 * 需求:自定义一个pers类,并将pers对象存入HashSet集合,再将人对象的属性获取出来
 * 思路:
 * 1.定义Pers类,需要复写hashCode和equals以及toString方法
 * 2.定义集合,将pers对象存入
 * 3.通过迭代器将元素打印出来
 */
package com.itheima;

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

class Demo{
	public static void main(String[] args){
		HashSet hs =new HashSet();
		hs.add(new Pers("zhangsan01",10));
		hs.add(new Pers("zhangsan02",20));
		hs.add(new Pers("zhangsan03",30));
		hs.add(new Pers("zhangsan01",10));//存入重复人对象
		hs.add(new Pers("zhangsan04",40));
		
		System.out.println(hs);//打印结果没有重复元素,说明重复元素没有存进来
		
		//定义迭代器取出元素
		Iterator it =hs.iterator();
		while(it.hasNext()){
			Pers p =(Pers)it.next();
			System.out.println(p);
		}
		
		
	}	
}

//定义一个Pers类,用于描述人对象
class Pers{
	private String name;
	private int age;
	Pers(String name,int age){
		this.name=name;
		this.age=age;
	}
	public int hashCode(){           //复写hashCode方法,保证元素存入的唯一性
		return name.hashCode()+age*36;
	}
	public boolean equals(Object obj){ //复写equals方法,保证元素存入的唯一性
		if(!(obj instanceof Pers))
			throw new RuntimeException("类型不匹配");
		Pers p = (Pers)obj;
		return this.name.equals(p.name)&&this.age==p.age;
	}
	public String toString(){    //复写toString方法,使得打印人对象出来的不是地址值
		return name+":::::"+age;
	}
}

	

三、TreeSet

1.TreeSet常见操作方法

	//TreeSet常见操作方法
	add();
	addAll();
	clear();
	remove();
	removeAll();
	iterator();
2.TreeSet保证元素唯一性的依据:

TreeSet集合中的元素通过调用自己的compareTo方法判断元素是否重复,return 0表示元素重复,return正数或负数表示元素不重复。

注意:TreeSet存入自定义对象时,对象必须具备比较性,即自定义的对象类必须实现comparable接口并复写compareto方法。

    当对象自己的比较性不符合需求时,我们可以自己传给TreeSet集合一个比较器X,X只需实现comparator接口即可。

    当元素自身具备比较性且集合接收了比较器时,以集合的比较器为准。

3.练习题:将字符串存入TreeSet集合中,按照字符串长度由短到长的顺序取出。

/*
 *需求:将字符串存入TreeSet集合中,按照字符串长度由短到长的顺序取出。
 *思路:
 *1.字符串本身的compareTo方法比较的是自然顺序而非字符串长短
 *2.需要自己定义一个比较器并传给TreeSet集合 
 */
package com.itheima;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

class Demo{
	public static void main(String[] args){
		
		//定义一个TreeSet集合,并将判断字符串长短的比较器传给集合
		TreeSet ts =new TreeSet(new lenComp());
		ts.add("abcdfdf");
		ts.add("abcdkkkdkgg");
		ts.add("abcde");
		ts.add("abcdeffdf");
		
		//定义迭代器,取出元素
		Iterator it = ts.iterator();
		while(it.hasNext()){
			String s =(String)it.next();
			System.out.println(s);          //验证打印结果是否为由短到长
		}
	}
	
}

//定义一个判断字符串长短的比较器
class lenComp implements Comparator{
	public int compare(Object o1,Object o2){
		String s1 =(String)o1;//多态,必须强转,否则无法调用length()
		String s2 =(String)o2;//多态,必须强转,否则无法调用length()
		return new Integer(s1.length()).compareTo(new Integer(s2.length()));
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值