Set集合

一.了解set集合

1.特点:无序;对象不可重复,即唯一
2.遍历方式:

   1)foreach
   2)iterator 迭代器
   3)注意:因为set集合的特点,无序即没有下标,所以无法使用for循环下标遍历的方式

/**
		 * set集合
		 * 1.特点
		 * 2.遍历方式 两种 foreach iterator
		 */
		Set<String> set=new HashSet<>();
		
		set.add("jj");
		set.add("tt");
		set.add("gg");
		System.out.println("--------无序--------");
		//1.无序
		for (String s : set) {
			System.out.print(s+",");//jj,tt,gg,
		}
		System.out.println();
		System.out.println("---------唯一--------");
		//2.唯一
		
		set.add("cc");
		for (String s : set) {
			System.out.print(s+",");//jj,tt,gg,cc,
		}
		System.out.println();
		System.out.println("---------迭代器遍历--------");
		//3.迭代器遍历
		Iterator<String> it = set.iterator();
		while(it.hasNext()) {
			System.out.print(it.next()+",");
		}

二.常用的实现类

1.HashSet 这个我们上面一直在用就不再作解释了
2.重点:TreeSet

  2.1TreeSet继承SortedSet(排序集合)接口
  2.2定义:TreeSet是按照某种规则对集合里的元素进行排序
  2.3排序的实现:
    1)自然排序接口:java.lang.Comparable (针对对象)
    2)比较器:java.util.Comparator

System.out.println("----------简单的String类型排序--------------");
		
		Set<String> si=new TreeSet<String>();
		
		si.add("yu");
		si.add("dc");
		si.add("fg");
		si.add("xz");
		
		for (String s : si) {
			System.out.print(s+",");//dc,fg,xz,yu,
		}
		System.out.println();
		System.out.println("----------对象类型排序--------------");
		//该例子是对学生成绩进行 降序 排序
		Set<Student> stu=new TreeSet<>(new ScoreComparator());//此处是方法调用
		
		stu.add(new Student(2, "弟弟", 55.5));
		stu.add(new Student(3, "君君", 58.5));
		stu.add(new Student(1, "梅子", 25.5));
		//使用foreach遍历
		/*for (Student s : stu) {
			System.out.println(s);
		}*/
		
		Iterator<Student> is = stu.iterator();
		
		while(is.hasNext()) {
			System.out.println(is.next());
			/*
			 * Student [sid=3, sname=君君, score=58.5]
				Student [sid=2, sname=弟弟, score=55.5]
				Student [sid=1, sname=梅子, score=25.5]
			 */
		}

学生实体类:

package com.zking.set.test;

import java.io.Serializable;

public class Student implements Serializable,Comparable<Object>{

	private Integer sid;
	private String sname;
	private Double score;
	public Integer getSid() {
		return sid;
	}
	public void setSid(Integer sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public Double getScore() {
		return score;
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", score=" + score + "]";
	}
	public void setScore(Double score) {
		this.score = score;
	}
	public Student(Integer sid, String sname, Double score) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.score = score;
	}
	public Student() {
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		//result = prime * result + ((score == null) ? 0 : score.hashCode());
		//result = prime * result + ((sid == null) ? 0 : sid.hashCode());
		result = prime * result + ((sname == null) ? 0 : sname.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;//执行
		Student other = (Student) obj;
		/*if (score == null) {
			if (other.score != null)
				return false;
		} else if (!score.equals(other.score))
			return false;
		if (sid == null) {
			if (other.sid != null)
				return false;
		} else if (!sid.equals(other.sid))
			return false;
		if (sname == null) {
			if (other.sname != null)
				return false;
		} else if (!sname.equals(other.sname))
			return false;*/
		if(this.getSname().equals(other.getSname()))
			return true;
		
		return true;
	}
	@Override
	public int compareTo(Object o) {
		Student stu=(Student)o;
		return -(this.getSid()-stu.getSid());
	}
	
	
	
}


调用的ScoreComparator方法:

package com.zking.set.test;

import java.util.Comparator;

public class ScoreComparator implements Comparator<Student> {

	public int compare(Student o1, Student o2) {
		return -(o1.getScore().hashCode()-o2.getScore().hashCode());//降序
		//return o1.getScore().hashCode()-o2.getScore().hashCode();//升序
	}

}


三.关于set集合元素是被过滤还是被覆盖问题

1.同样要使用到上面的Student学生实体类
2.注意:
  1)需要实现Comparable接口,重写hashcode()方法和equals()方法
  2)步骤:
    a.先执行hashcode方法,判断对象属性的哈希码值是否一致,若一致则直接被过滤掉,不再输出该元素;
    b.若不一致,则再执行equals()方法,在equals()方法中具体对象属性的属性值,根据需求,返回元素!

在这里插入图片描述

对比两张图可知,set集合重复的元素是被过滤掉的,而非覆盖!!!

在这里插入图片描述


四. 关于LinkedHashSet

1.元素是有顺序的
2.元素是不重复的
3.底层数据结构是按照链表的结构存储的 Linked




  感谢你耐心的看完,希望对你有所帮助!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值