【Java基础】集合(3) —— Set

【Java基础】集合(1) —— Collection
【Java基础】集合(2) —— List
【Java基础】集合(3) —— Set
【Java基础】集合(4) —— 泛型
【Java基础】集合(5) —— Map
【Java基础】集合(6) —— Collections

存储的对象是无序的(集合中存储对象的顺序和使用add方法添加对象的顺序不一),存储的对象是不可以重复的

没有特有的方法

HashSet
  • 后缀:Set,说明存储的数据无序,不可以存储相同的对象
  • 前缀:Hash,说明该集合在存储数据时底层数据结构使用的是哈希表(数组+链表)
    • 在使用add方法添加元素时,已经保证了元素的唯一
    • 当向集合添加对象时,把要添加的对象和集合中已有的对象比较哈希值,如果和集合中所有对象的哈希值都不相同,则直接加入集合,如果和集合中已有的对象存在哈希值相同的,那么并不认为是同一个对象,还会调用equals方法,确定是否是同一个对象,如果equals方法返回true,则最终认为是同一个对象,不加入集合,返回false,则认为不是同一个对象,使用链表链接在后面。
    • 为什么无序?因为元素的存储位置是根据哈希算法计算出来的
    • 保证元素唯一的原理: int hashCode( ) boolean equals(0bject obj)

在这里插入图片描述

姓名年龄相同的认为是同一个对象:重写hashCode和equals方法

class Student{
    ………………
	public int hashCode(){
		return name.hashCode()+age*36;
	}
	public boolean equals(Object obj){
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不对");
		Student stu=(Student)obj;
		return this.name.equals(stu.name)&&this.age==stu.age;
	}
}
TreeSet
  • 后缀:Set,说明存储的数据无序,不可以存储相同的对象
  • 前缀:Tree,说明该集合在存储数据时底层数据结构使用的是二叉树
    • 具备排序功能
    • 加入到集合中的对象必须具备比较大小的功能,需要让对象所属的类实现Comparable接口中的int compareTo()方法
    • 因为排序了所以导致了无序
    • compareTo方法的返回值为0,则认为是同一个对象,不加入集合,从而保证了加入集合的对象唯一
    • 当对象默认的比较方式不符合我们的需求,可以自定义比较大小的方式
      自定义比较方式必须实现Comparator接口中的int compare (Obejct obj1 , Object obj2) 方法,优先使用自定义的比较方法

让对象所属的类实现Comparable接口中的int compareTo()方法

class Student implements Comparable{
 ………………
	public int compareTo(Object obj){
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不对");
		Student stu=(Student)obj;
     int num = this.age-stu.age; 
		return num==0?name.compareTo(stu.name):num;
	}
}

自定义比较方式必须实现Comparator接口中的int compare (Obejct obj1 , Object obj2) 方法

class ComByLength  implements Comparator{
	public int compare(Object obj1,Object obj2{
		if(!(obj1 instanceof String))
			throw new ClassCastException("类型不对");
		if(!(obj2 instanceof String))
			throw new ClassCastException("类型不对");
		String str1=(String)obj1;
		String str2=(String)obj2;
		return str1.length()-str2.length();//从短到长
	}
}
class Demo10{
	public static void main(String[] args){
		ComByLength comByLength=new ComByLength();
		TreeSet ts = new TreeSet(comByLength);
     //优先使用自定义比较方式
		ts.add("wangyuyuyuyuyuyuyu");  //String Comparable  
		ts.add("chen");
		ts.add("yan");
		ts.add("sunxuxuxu");
		System.out.println(ts);
	}
}
  • TreeSet(Collection<? extends E> c)
TreeSet<Student> st1=new TreeSet<>();
st1.add(new Student("lisi",20));
st1.add(new Student("zhaosi",22));
TreeSet<Worker> st2=new TreeSet<>();
st2.add(new Worker("xiaobai",28));
st2.add(new Worker("zhaoliu",29));
TreeSet<Person> ts = new TreeSet<>(st1);
TreeSet<Person> ts = new TreeSet<>(st2);
  • **TreeSet(Comparator<? super E> comparator) **
class ComByNames implements Comparator<Person>{
     public int compare(Person w1,Person w2){
		 return w1.getName().compareTo(w2.getName());
	 }
}
class Demo8 {
	public static void main(String[] args) {
        ComByNames comByNames=new ComByNames();
		TreeSet<Student> st1=new TreeSet<>(comByNames);
		st1.add(new Student("lisi",20));
		st1.add(new Student("zhaosi",22));
		st1.add(new Student("wangwu",18));
		TreeSet<Worker> st2=new TreeSet<>(comByNames);
		st2.add(new Worker("xiaobai",28));
		st2.add(new Worker("zhaoliu",29));
		st2.add(new Worker("wangwu",16));
	}
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值