集合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基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...
随机推荐
- zookeeper的集群搭建
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 超详细 Java 15 新功能介绍
点赞再看,动力无限.微信搜「程序猿阿朗 」,认认真真写文章. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Java 15 在 2 ...
- 在 CSS 中表示颜色的hex code方法和rgb方法
hexadecimal code(十六进制编码),简写为 hex code. 我们通常使用 decimals,也就是十进制数字,它对每一位数字使用符号0到9来表示.Hexadecimals (或 he ...
- 关于knn算法的总结思考
更多的关于k近邻算法的思考 KNN(K- Nearest Neighbor)法即K最邻近法,数据挖掘分类技术中最简单的方法之一 对k近邻算法的总结: 优点部分 其可以解决分类问题,同时可以天然的解决多 ...
- ACL的配置
一.实验拓扑 实验要求: 二.实验编址 三.实验步骤: 1.启动设备(全选) 2.配置端口IP R1: R2: R3: R4: 2.搭建OSPF网络: R1: R2: R3: R4: 4.配置ACL控 ...
- 一个命令搞定 Web 国际化
背景 随着出海的业务越来越多,web 应用面临越来越多的国际化的工作.如何高效,高质量的完成 Web 前端国际化工作,已经是摆在 web 前端同学的急需解决的问题. i18n-helper-cli 是 ...
- 整理自己部署项目需要使用的Linux命令
1.修改文件名: mv test test 12.创建test文件夹: mkdir test3.解压文件至 test文件夹下: unzip test.war -d test/4.将work文件移动至 ...
- 五、Abp vNext 基础篇丨博客聚合功能
介绍 业务篇章先从客户端开始写,另外补充一下我给项目起名的时候没多想起的太随意了,结果后面有些地方命名冲突了需要通过手动using不过问题不大. 开工 应用层 根据第三章分层架构里面讲到的现在我们模型 ...
- C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁
参考网址: https://blog.csdn.net/weixin_43989331/article/details/105356008 C#中的几种锁:用户模式锁.内核模式锁.动态计数.监视锁介绍 ...
- css - 行高
css - 行高 line-height行高 取值:px | em | rem | 百分比 | 纯数字 | normal | inherit 设置给:块.行内.行内块 应用给:文本 继承:块.行内.被 ...