栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Collection框架集合之Set集合

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Collection框架集合之Set集合

书接上回,进入正题---set集合! Set集合
  1. 特点:无序、对象不能重复(唯一)

        无序:元素添加的顺序于输出的顺序不一致
        唯一:不允许添加重复元素

Question:元素是被覆盖了?还是过滤了? 答案是:过滤了 。且听细细分解

        Set set = new HashSet<>();
		set.add(new Student(1,"ax",100f));
		set.add(new Student(2,"by",80f));
		set.add(new Student(3,"cd",60f));
		set.add(new Student(1,"ax",120f));

1、默认使用equals比较,Object类型是引用类型,默认比较的是内存地址
2、重写hashcode和equals方法,先比较hashcode值是否相同,再比较equals
   2.1)hashcode值相同,则比较equals
   2.2)hashcode值不相同,则不比较equals

由图可知:编号为1的,名字为ax,分数为120f的 被过滤了

2. 遍历方式(2种)

创建一个Student类,然后在Demo中调用。

Student.java

package com.zking.collection.entity;
import java.io.Serializable;
public class Student implements Serializable,Comparable {
	private int sid;
	private String sname;
	private float score;
	public Student() {
		super();
	}
	public Student(int sid, String sname, float score) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.score = score;
	}
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public float getScore() {
		return score;
	}
	public void setScore(float score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", score=" + score + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		//result = prime * result + Float.floatToIntBits(score);
		result = prime * result + sid;
		result = prime * result + ((sname == null) ? 0 : sname.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		//true:表已存在 false:表允许添加(不存在)
		//当前对象是否与obj对象相同
		if (this == obj)
			return true;
		//obj对象是否为空
		if (obj == null)
			return false;
		//当前对象类型与obj对象类型不相同
		if (getClass() != obj.getClass()) 
			return false;
		Student other = (Student)obj;
		if(this.getSid()!=other.getSid())
			return false;
		return true;
	}
	
	@Override
	public int compareTo(Student o) {
		return this.getSid()-o.getSid();//升序(数字)
		//return -(this.getSid()-o.getSid());//降序
		//return this.getSname().hashCode()-o.getSname().hashCode();//(字符)
		
	}
	
	
	
}

    2.1 foreach

    2.2 迭代器

        Demo.java

        //1、foreach
		for (Student student : set) {
			System.out.println(student);
		}
		//iterator(迭代器)
		//获取迭代器
		Iterator it = set.iterator();
		//遍历循环
		while(it.hasNext()) {
			//移动下标取出元素
			System.out.println(it.next());
		}

 3.常用实现类

      HashSet
      TreeSet:以某种特定的规则对集合中的元素进行排序(升序和降序)
      自然比较接口(默认排序): java.lang.Comparable 
      比较器: java.util.Comparator
      String以AscII码进行比较,返回差值

        Set set = new TreeSet<>(new NameComparator());
		set.add(new Student(1,"xx",100f));
		set.add(new Student(2,"yy",80f));
		set.add(new Student(3,"cd",60f));
		//输出
		set.forEach(System.out::println);

可以自己构建不同比较器,例如名字比较器(字符)、编号比较器(数字)等等


NameComparator 实现Comparator接口

    public int compare(Student o1, Student o2) {
		return o1.getSname().hashCode()-o2.getSname().hashCode();//(字符)
	}

       


LinkedHashSet:(后期会讲)
  1)元素是有顺序的
  2)元素是不重复的
  3)底层数据结构是按照链表的结构存储的 Linked
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/943689.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号