Set集合详细讲解

目录

一.Set集合

二.HashSet集合

 foreach循环遍历

迭代器遍历数组  

三.TreeSet集合


一.Set集合

Set集合其实就是一个接口,HashSet和TreeSet实现了Set接口,所有Set所具备的方法HashSet和TreeSet也是具备的。

特点:

  • set集合是无序的,不重复的(无序的意思是不会按照我们增加进集合的顺序)
  • 遍历通过foreach,迭代器,无法通过下标,因为set集合没有下标
  • 初始容量为16,负载因子0.75倍,扩容量增加1倍 

   


二.HashSet集合

  • HashSet是实现Set集合接口的,所以Set集合所具备的,它也具备。
  • 它只储存唯一元素并且允许为空值。储存唯一元素的意思是,如果你增加两个1,那么有一个1会被干掉,只有1一个1存在。
  • 由HashMap支持。
  • 不保持插入顺序
  • 线程不安全

 

  •  foreach循环遍历

     如果里面有的元素增加进去会被覆盖,大家可以按住Ctrl点击add进去看源码。源码里有一个boolean的方法,该方法是判断新增加的元素在该集合是否已经存在了,如果为false那么里面已经存在和该元素一样的元素,如果为true那么里面没有该元素,增加进该集合。

  注:如果已经有元素存在
        

package com.yjx.test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;



public class Test01 {
	
	
	private Set<Integer> set=new HashSet<Integer>();
	
	@Before
	public void list() {
		set.add(1);
		set.add(1);
		set.add(2);
		set.add(3);
		set.add(3);
		set.add(4);
		set.add(5);
		set.add(6);
	
	}
	
	
	
	@Test
	public void test01() {
		for(Integer e:set) {
			System.out.println(e);
		}
	}
	

}

  set集合增加的源码里的判断元素是否在集合中存在的方法

  

boolean add(E e);

得到结果:

  

  • 迭代器遍历数组  

     hasNext:判断集合中是否还有元素

  public void test02() {
     Iterator<Integer>it=set.iterator();
    	while(it.hasNext()) {
    		System.out.println(it.next());
    	}
    }

  得到结果:

  

 

  

  我们创建一个学生实体类,然后将学生增加进集合。

  •   Stundet类一定要实现hashCode()和equals方法,因为他们用来对比两个对象是否相等一致
  • 大家可以试一下在stundet类中实现这两个方法,和去除这两个方法的区别,如果Studnet中没有这个方法,那么就算id和名字和年龄全相等,依旧可以增加进去

  Studnet类

package com.yjx.test;

public class Stundet {
	
	private Integer id;
	private String name;
	private Integer age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
	public Stundet() {
		// TODO Auto-generated constructor stub
	}
	
	
	public Stundet(Integer id, String name, Integer age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	
	
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Stundet other = (Stundet) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Stundet [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

	
	
	

}

 方法

 像这种学生id和学生名字都相同,但是年龄不同,所以他们不是同一个人,两个都会增加进去的。

 

 public void test03() {
		 //先创建一个集合
		 Set<Stundet> set=new HashSet<Stundet>();
		 set.add(new Stundet(1,"张三",18));
		 set.add(new Stundet(1,"张三",19));
		 set.add(new Stundet(3,"张五",16));
		 set.add(new Stundet(5,"张六",11));
		 set.add(new Stundet(3,"张七",12));
		 
		 for(Stundet s:set) {
			 System.out.println(s);
		 }
	 }

 得到结果:

 

  

 但是如果我们将第一个和第二个将id和名字和年龄都设置为一样的,那么只有一个会增加进去。

   

 public void test03() {
		 //先创建一个集合
		 Set<Stundet> set=new HashSet<Stundet>();
		 set.add(new Stundet(1,"张三",18));
		 set.add(new Stundet(1,"张三",18));
		 set.add(new Stundet(3,"张五",16));
		 set.add(new Stundet(5,"张六",11));
		 set.add(new Stundet(3,"张七",12));
		 
		 for(Stundet s:set) {
			 System.out.println(s);
		 }
	 }

得到结果:而且还会帮我们根据id进行一个排序

  

 如果我们想用根据年龄进行一个排序,这个时候就要用到TreeSet,接着往下看。

三.TreeSet集合

  • 是一个包含有序的且没有重复元素的集合
  • 作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
  • TreeSet是基于TreeMap实现的

 什么使用TreeSet集合?

 当我们想根据什么进行排序的话就可以使用TreeSet集合,下面就教大家如何使用TreeSet集合进行排序。 

 

  •    第一种方法

      我们使用Comparator进行一个排序,可以从小到大,也可以从大到小,但是这种方法存在一个很大的问题,如果有年龄相同的,那么只会有一个留下,其他的就会不存在该集合中了。

  

这个是从小到大排序的,想要从大到小,就o2.getAge-o1.getAge。

public void test04() { 
		TreeSet<Stundet> tree=new TreeSet<Stundet>(new Comparator<Stundet>() {
			@Override
			public int compare(Stundet o1, Stundet o2) {
				 
				return o1.getAge() - o2.getAge();
			}
			
		});
		//先创建一个集合
		
		tree.add(new Stundet(1,"张三",18));
		tree.add(new Stundet(3,"张五",16));
		tree.add(new Stundet(5,"张六",18));
		tree.add(new Stundet(4,"张七",12));
		tree.add(new Stundet(6,"张七",12));
		 
		 for(Stundet s:tree) {
			 System.out.println(s);
		 }
	}

     得到结果:

    

  

   刚刚我们也说了,出现年龄相同,只会留下一个,那么这种方法该如何解决嘞,大家看下面代码。

 我们增加了一个判断,当年龄相减为0,他们相等,那就根据他们的id进行排序。就可以解决这样子的问题啦。

public void test04() { 
		TreeSet<Stundet> tree=new TreeSet<Stundet>(new Comparator<Stundet>() {
			@Override
			public int compare(Stundet o1, Stundet o2) {
				 if(o1.getAge() - o2.getAge()==0) {
					 return o1.getId()-o2.getId();
				 }
				return o1.getAge() - o2.getAge();
			}
			
		});
		//先创建一个集合
		
		tree.add(new Stundet(1,"张三",18));
		tree.add(new Stundet(3,"张五",16));
		tree.add(new Stundet(5,"张六",18));
		tree.add(new Stundet(4,"张七",12));
		tree.add(new Stundet(6,"张七",12));
		 
		 for(Stundet s:tree) {
			 System.out.println(s);
		 }
	}

    得到结果:所有的数据都存在,id根据从小到大的顺序。

    

   

     

  •      第二种方法

   我们在Studnet实体类中做判断,实现Comparable

package com.yjx.test;

import java.util.Comparator;

public class Stundet implements Comparable<Stundet>{
	
	private Integer id;
	private String name;
	private Integer age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
	public Stundet() {
		// TODO Auto-generated constructor stub
	}
	
	
	public Stundet(Integer id, String name, Integer age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	
	
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Stundet other = (Stundet) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Stundet [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
	
	@Override
	public int compareTo(Stundet o) {
		if(o.getAge()-this.getAge()==0) {
			return o.getId()-this.getId();
		}
		return o.getAge()-this.getAge();
	}


	  
	
	

}

 测试方法代码

@Test
	public void test05() { 
		TreeSet<Stundet> tree=new TreeSet<Stundet>();
		//先创建一个集合
		
		tree.add(new Stundet(1,"张三",18));
		tree.add(new Stundet(3,"张五",16));
		tree.add(new Stundet(5,"张六",18));
		tree.add(new Stundet(4,"张七",12));
		tree.add(new Stundet(6,"张七",12));
		 
		 for(Stundet s:tree) {
			 System.out.println(s);
		 }
	}

 这种方法也是可以的噢,大家最好做个判断,避免出现一样大的数据而只留下一个这种情况。 

今天的学习就到这里啦。 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值