集合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基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...
随机推荐
- 跟我一起写 Makefile(八)
六.多行变量 还有一种设置变量值的方法是使用define关键字.使用define关键字设置变量的值可以有换行,这有利于定义一系列的命令(前面我们讲过"命令包"的技术就是利用这个 ...
- Access, Modify, Change Time of Linux File
All these 3 time can be viewed by "stat " command. Access time is influenced by read opera ...
- Socket通信-客户端
WSADATA wsd; SOCKET sHost; SOCKADDR_IN servAddr; if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) retu ...
- 【原创】利用动态二进制加密实现新型一句话木马之PHP篇
概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...
- 高性能 C++ HTTP 客户端原理与实现
一.什么是Http Client Http协议,是全互联网共同的语言,而Http Client,可以说是我们需要从互联网世界获取数据的最基本方法,它本质上是一个URL到一个网页的转换过程.而有了基本的 ...
- NOIP 模拟 $13\; \text{工业题}$
题解 本题不用什么推式子,找规律(而且也找不出来) 可以将整个式子看成一个 \(n×m\) 矩阵 考虑 \(f_{i,j}\),它向右走一步给出 \(f_{i,j}×a\) 的贡献,向下走一步给出 \ ...
- 题解 P3158 [CQOI2011]放棋子
题解 本题是一个 \(DP\) 加 容斥,容斥的式子很好推,重点是如何想到和如何推出 \(DP\) 部分的式子. 因为不同种颜色的棋子不能放在同一行或同一列,所以不同种的棋子是相对独立的. 据此,我们 ...
- mysqldump备份总结
常用的备份参数 -A 备份全库 -B 备某一个数据库下的所有表 -R, --routines 备份存储过程和函数数据 --triggers 备份触发器数据 --master-data={1|2} 告诉 ...
- C#中Finalize方法的问题
ninputer在关于"值类型的Finalize不会被调用"中(http://blog.joycode.com/lijianzhong/archive/2005/01/13/429 ...
- SpringMVC之@ControllerAdvice
@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller.使用这个 Controller ,可以实现三个 ...