集合Collection ----Set集合
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集合的更多相关文章
- 集合Collection ----List集合
Collection集合体系的特点: set系列集合:添加的元素是 无序,不重复,无索引的 ----HashSet: 无序,不重复,无索引 ----LinkedHashSet: 有序,不重复,无索引 ...
- Guava库介绍之集合(Collection)相关的API
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...
- 集合Collection
/* * 集合的由来: * 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储. * 而要想存储多个对象,就不能是一个基本 ...
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
- 5、数组和集合--Collection、Map
一.数组:同一个类型数据的集合,其实他也是一个容器 1.数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些数据 2.数组的定义: 在Java中常见: 格式1: 类型 [] 数组名 = ne ...
- java集合——Collection接口
Collection是Set,List接口的父类接口,用于存储集合类型的数据. 2.方法 int size():返回集合的长度 void clear():清除集合里的所有元素,将集合长度变为0 Ite ...
- WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据
数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...
- 在含有null值的复杂类的集合(Collection)中取最大值
在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Clas ...
- 集合Collection总览
前言 声明,本文使用的是JDK1.8 从今天开始正式去学习Java基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...
随机推荐
- 10分钟了解微服务、容器和Kubernetes
什么是微服务? 什么是微服务?你应该使用微服务吗?微服务与容器和 Kubernetes 有什么关系?如果这些问题在您的日常生活中不断出现,那么这篇文章适合您. 从根本上说,微服务只是一个运行在服务器或 ...
- 【原创】Java内存攻击技术漫谈
前言 Java技术栈漏洞目前业已是web安全领域的主流战场,随着IPS.RASP等防御系统的更新迭代,Java攻防交战阵地已经从磁盘升级到了内存里面. 在今年7月份上海银针安全沙龙上,我分享了< ...
- GitHub自动化部署(CD) asp.net core 5.0 项目(免费空间)
这里我简单介绍一下使用Github自动化部署自己项目到Heroku云服务器上,Heroku竟然是一个很非常老牌的云平台服务商,竟然还没听说过,网上一查2010被Salesforce收购,网上有很多关于 ...
- 【SpringMVC】@RequestMapping注解
@RequestMapping注解的源码 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNT ...
- 手把手教你AspNetCore WebApi:Swagger(Api文档)
前言 小明已经实现"待办事项"的增删改查,并美滋滋向负责前端的小红介绍Api接口,小红很忙,暂时没有时间听小明介绍,希望小明能给个Api文档.对于码农小明来说能不写文档就尽量不要写 ...
- 从0开始搭建一个IoC容器(C#版)
网址:https://blog.csdn.net/wangyahua1234/article/details/100619695 目录 1. IoC简介 2. Tiny版IoC的功能 3. Tiny版 ...
- C# 二维码生成 ( QRCoder )
二维码1.前言seaconch 最近在搞二维码方面的一些东西,所以接触了一些二维码相关,那么既然用过了就要有用过了的样子 其实关于二维码的文章真的多的数不胜数,有很多写的很认真,很好,但这就像是学习一 ...
- WPF 饼状图,柱形图,折线图 (2 折线图)
折线图在柱形图的基础上,做了一些修改.大概效果和用法如下. X轴和Y轴的刻度,使用用了Path的Figures属性,绘制多条Figure+LineSegment完成. 同时,由于折线图很可能会画多条线 ...
- Json序列化更新好友列表
一.概述 使用Newtonsoft.Json开源库进行序列化 二.代码 using Newtonsoft.Json; using System; using System.Collections.Ge ...
- dataTemplate 之 ContentTemplate 的使用
<Window x:Class="WpfApplication1.Window38" xmlns="http://schemas.microsoft.com/win ...