java基础.集合.Set.初识

set:元素无序(存入与取出的顺序不一定一致),而且元素不可以重复
   
   set集合的功能与collection一致
           常见的子类:
           
           HashSet:底层结构为哈希表//保证元素唯一性的原理是:当哈希值重复时,再判断位置是否一样,(如果一样)再判断是否是同一个对象

            hashset是通过元素的两个方法,hashcode(先)和equals(如果hash相同的话)来完成的

可以通过定义类时重新类中的以上几个函数,这样得到自己想要的比较方法

class Person{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public int hashCode(){
		return name.hashCode()+age*27;
	}
	public boolean equals(Object obj){
		if(!(obj instanceof  Person)){
			return false;
		}
		Person p = (Person)obj;
		return (p.name.equals(this.name) && this.age == p.age);
	}
  public String getname()
  {
	  return this.name; 
  }
  public int getage()
  {
	  return this.age; 
  }

TreeSet :底层使用的是二叉树
           
可以对set集合中的元素进行排序(默认是asll表)
           
证明唯一性:comapreTo方法return 0
           
Treeset:
           
排序的第一种方式:让元素自身具有比较性
           
元素需要实现comparable接口,覆盖compareTo方法
           
叫做自然顺序,有叫做默认顺序
           
排序的第二种方式:让集合自身具备比较性,利用比较器比较
           
定义比较器:实现comparator接口

TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错 ClassCastException)
TreeSet如果传入Comparator, 就优先按照Comparator




class Mycom implements Comparator//定义一个比较器
{
	public int compare(Object o1,Object o2)
	{
		Person p1 = (Person)o1;
		Person p3 = (Person)o2;
		return p1.getname().compareTo(p3.getname());
	}
}
class Person implements Comparable//该接口强制让人具备比较性
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public int compareTo(Object obj)
	{
		if(!(obj instanceof Person))
		{
			throw new RuntimeException("不是人对象");
			
		}
		Person p =(Person)obj;
		if(this.age>p.age){
			
			
			return 1;
		}
		else if (this.age==p.age){
			return (this.name.compareTo(p.name));
			
			
			
		}
		return -1;
	}

	  public String getname()
	  {
		  return this.name; 
	  }
	  public int getage()
	  {
		  return this.age; 
	  }
 }
public class Jihe3 {
	public static void main(String[] args)
	{
		TreeSet tr = new TreeSet(new Mycom());//创建一个比较器对象
		tr.add(new Person("lisi1", 2));
		tr.add(new Person("lisi3", 22));
		tr.add(new Person("lisi2", 24));
		tr.add(new Person("lisi6", 22));
		Iterator it = tr.iterator();
		while(it.hasNext())
		{
			Person p =(Person)it.next();
			System.out.println(p.getage()+"……………………"+p.getname());
		}
	}

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值