set系列集合:添加的元素是 无序,不重复,无索引的

   ----HashSet: 无序,不重复,无索引

------LinkHashSet<>:有序不重复无索引(添加顺序)

   ----TreeSet: 排序(按照大小默认升序排序,是可排序集合),不重复,无索引

HashSet:不重复,无序  

  set集合去重复的流程: 1.对象调用hashcode() 方法获取哈希值进行比较 false---不重复

            2.如果为true,则进行equals比较

    总结:如果set对象认为两个集合的内容一样就重复,重写hashcode()和equals方法

  set集合无序的原因是:底层采用了哈希表存储元素

import java.util.HashSet;
import java.util.Objects;
import java.util.Set; class Sheep{
private String name;
private int age;
Sheep(){ } public Sheep(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Sheep sheep = (Sheep) o;
return age == sheep.age &&
Objects.equals(name, sheep.name);
} @Override
public int hashCode() { return Objects.hash(name, age);
}
@Override
public String toString() {
return "Sheep{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
} public class HashSetDemo1 {
public static void main(String[] args) {
Set<Sheep> sets=new HashSet<>();
Sheep s1 = new Sheep("懒洋洋",6);
Sheep s2 = new Sheep("暖羊羊",8);
Sheep s3 = new Sheep("懒洋洋",6);
sets.add(s1);
sets.add(s2);
sets.add(s3);
System.out.println(sets); // [Sheep{name='暖羊羊', age=8}, Sheep{name='懒洋洋', age=6}]
// 如果没有重写hashcode()和equals,则输出:[Sheep{name='暖羊羊', age=8}, Sheep{name='懒洋洋', age=6}, Sheep{name='懒洋洋', age=6}]

}
}

LinkHashSet:每个元素都添加一个链来维护添加顺序

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkHashSetDemo1 {
public static void main(String[] args) {
Set<String> sets = new LinkedHashSet<>();
sets.add("沸羊羊");
sets.add("喜羊羊");
sets.add("暖羊羊");
sets.add("喜羊羊");
System.out.println(sets); // [沸羊羊, 喜羊羊, 暖羊羊] }
}

TreeSet:

  1.有值特性的元素进行升序排序

  2.String排序按照首字母的 ASCII码值排序

3.引用数据类型(默认无法排序,所以需要定制排序的大小规则)

    a.直接为对象的类实现比较器规则接口Comparable,重写比较方法

    b.直接为集合设置比较器Comparator对象,重写比较方法

   总结:如果类和集合都带有比较规则,优先使用集合自带的比较规则

package com.day05;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet; class Wolf implements Comparable<Wolf>{
private String name;
private int age; //重写比较方法 w1.compareTo(w)
// 比较者:this 被比较者:w
@Override
public int compareTo(Wolf w){
//比价规则!!
//比较者大于被比较者,返回正数(1)
//比较者小于被比较者,返回负数(-1)
//比较者等于被比较者,返回0
// if(this.age>w.age){
// return 1;
// }else if(this.age<w.age){
// return -1;
// }
// return 0;
return this.age-w.age;
} Wolf(){ } public Wolf(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Wolf{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
} public class TreeSetDemo1 {
public static void main(String[] args) {
//---------------第一种-------------------// 自然排序
Set<Wolf> sets=new TreeSet<>();
sets.add(new Wolf("红太狼",24));
sets.add(new Wolf("灰太狼",28));
sets.add(new Wolf("小灰灰",12));
System.out.println(sets);
  
    //--------------第二种--------------------//
Set<Wolf> setss=new TreeSet<>(new Comparator<Wolf>() { // 匿名对象 比较器排序
@Override
public int compare(Wolf o1, Wolf o2) {
return o2.getAge()-o1.getAge();
}
});
setss.add(new Wolf("红太狼",24));
setss.add(new Wolf("灰太狼",28));
setss.add(new Wolf("小灰灰",12));
System.out.println(setss); }
}
package com.shujia.day18;

import java.util.Comparator;
import java.util.TreeSet; public class TreeSetDemo1 {
public static void main(String[] args) {
//创建集合对象
TreeSet<Student> students = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) { //o1-o2为从小到大排序
int i=o1.getName().length()-o2.getName().length();
int i1 = i == 0 ? o1.getName().compareTo(o2.getName()):i;
int i2 = i1 == 0 ? o1.getAge() - o2.getAge():i1;
return i2;
}
}); //创建学生对象
Student s1 = new Student("zhongqihang", 23);
Student s2 = new Student("guoao", 24);
Student s3 = new Student("sunduoqin", 28);
Student s4 = new Student("kuangjie", 27);
Student s5 = new Student("chenchuan", 26);
Student s6 = new Student("wangyouhu", 29);
Student s7 = new Student("chenzhiqiang", 29);
Student s8 = new Student("chenchuan", 27); //添加元素
students.add(s1);
students.add(s2);
students.add(s3);
students.add(s4);
students.add(s5);
students.add(s6);
students.add(s7);
students.add(s8); //遍历
for (Student s : students) {
System.out.println(s.getName()+"----"+s.getAge());
} //guoao----24
//kuangjie----27
//chenchuan----26
//chenchuan----27
//sunduoqin----28
//wangyouhu----29
//zhongqihang----23
//chenzhiqiang----29 }
} class Student {
private String name;
private int age; public Student() {
} public Student(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

集合Collection ----Set集合的更多相关文章

  1. 集合Collection ----List集合

    Collection集合体系的特点: set系列集合:添加的元素是 无序,不重复,无索引的 ----HashSet: 无序,不重复,无索引 ----LinkedHashSet: 有序,不重复,无索引 ...

  2. Guava库介绍之集合(Collection)相关的API

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  3. 集合Collection

    /* * 集合的由来: * 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储. * 而要想存储多个对象,就不能是一个基本 ...

  4. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  5. 5、数组和集合--Collection、Map

    一.数组:同一个类型数据的集合,其实他也是一个容器 1.数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些数据 2.数组的定义: 在Java中常见: 格式1:  类型 [] 数组名 = ne ...

  6. java集合——Collection接口

    Collection是Set,List接口的父类接口,用于存储集合类型的数据. 2.方法 int size():返回集合的长度 void clear():清除集合里的所有元素,将集合长度变为0 Ite ...

  7. WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据

    数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...

  8. 在含有null值的复杂类的集合(Collection)中取最大值

    在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Clas ...

  9. 集合Collection总览

    前言 声明,本文使用的是JDK1.8 从今天开始正式去学习Java基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...

随机推荐

  1. gRPC学习之二:GO的gRPC开发环境准备

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos gRPC学习系列文章链接 在CentOS7部署和设置G ...

  2. 第6篇-Java方法新栈帧的创建

    在 第2篇-JVM虚拟机这样来调用Java主类的main()方法 介绍JavaCalls::call_helper()函数的实现时提到过如下一句代码: address entry_point = me ...

  3. Python脚本文件中使用中文

    Python做图形用户界面(GUI)开发时经常要在界面上显示中文,需要做如下处理(详见[1]和[2]2.3节): 在py文件的首行写上:# -- coding:utf-8 -- 保存py文件时要存为u ...

  4. Linux平台上转换文件编码

    Linux系统的iconv指令是一个很好的文件编码转换工具,支持的编码范围广,使用方便,例如将一个utf-8编码的文件(名为tic)转换为gbk编码: iconv -f utf-8 -t gbk ti ...

  5. 安鸾CTF Writeup PHP代码审计01

    PHP代码审计 01 题目URL:http://www.whalwl.xyz:8017 提示:源代码有泄露 既然提示有源代码泄露,我们就先扫描一遍. 精选CTF专用字典: https://github ...

  6. Redis奇怪的姿势

    Redis奇怪的姿势 写在前面 之前渗透 摸鱼 时和小伙伴发现了一个redis,存在未授权,是win服务器但是没有路径,度娘了之后发现了这个姿势,特此学习记录一下. 写入启动项 环境搭建 window ...

  7. 常见web中间件漏洞(五)weblogic漏洞

    继续整理有关中间件漏洞思路(仅做简单思路整理,不是复现,复现请参考大佬们的长篇好文,会在文章中列举部分操作) WebLogic是Oracle公司出品的一个application server,确切的说 ...

  8. NOIP 模拟 $29\; \rm 最长不下降子序列$

    题解 \(by\;zj\varphi\) 观察这个序列,发现模数很小,所以它的循环节很小. 那么可以直接在循环节上做最长上升子序列,但是循环节中的逆序对会对拼接后的答案造成影响. 没有必要找逆序对个数 ...

  9. 依赖注入@Autowired@Primary@Quelifier使用

    @Autowired 注入声明的SpringBean对象,根据一定的规则首先按照注入的类型去查找,如果没有找到安装注入的名称去匹配你要注入的属性名称,如果都没有找到启动项目时抛出异常,@Autowir ...

  10. air530GPS数据通过air202上传阿里云

    写硬件博客真是太难了 GPS/北斗 导航模块 Air530开发板G1学习日记 上面这个博客详细介绍了如何测试使用Air530模块根据稳重[Air530 和Air 202 进行配合使用,实现2G GPR ...