集合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基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...
随机推荐
- java使用Selenium操作谷歌浏览器学习笔记(三)键盘操作
我们用Selenium打开网页后,可能需要在输入框输入一些内容等等,这时候就需要键盘操作了 使用sendKEys进行键盘操作,在bing的搜索框中输入内容并点击跳转 1 import org.open ...
- 使用simg2img win提取安卓官方ROM包中独立的系统软件
一.背景 今天是七夕情人节诶,但是与我一只单身老狗有啥关系呢?一大早发现手机系统更新了(MIUI12.5 增强版),但是更新完后感觉充电速度不是很妙(你们懂得),为了恢复之前的充电速度,首先想到将手机 ...
- Python入门:ChainMap 有效管理多个上下文
摘要: Python的ChainMap从collections模块提供用于管理多个词典作为单个的有效工具. 本文分享自华为云社区<从零开始学python | ChainMap 有效管理多个上下文 ...
- MyBatis学习05(多对一和一对多)
8.多对一的处理 多对一的理解: 多个学生对应一个老师 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师! 数据库设计 CREATE TABLE `teacher` ( `id` IN ...
- Tag Helper 标签助手
简介 标签助手是Razor 页面中自动生成HTML语句的可重用组件.标签助手对应特定的HTML标签,ASP.NET Core 包含大量与HTML标签对应的预定义标签助手. Razor页面中的标签助手作 ...
- 【网络编程】TCPIP-5-UDP
目录 前言 5. UDP 网络编程 5.1 UDP 的工作原理 5.2 UDP 的高效性 5.3 实现 UDP 服务端/客户端 5.3.1 概念 5.3.2 UDP 的数据 I/O 函数 5.3.3 ...
- zabbix监控rabbitmq队列消费状态
使用rabbitmqctl 管理 mq -n 指定节点 [root@logging-master zabbix]# rabbitmqctl -n rabbit@localhost list_queue ...
- HashTable原理和底层实现
1. 概述 上次讨论了HashMap的结构,原理和实现,本文来对Map家族的另外一个常用集合HashTable进行介绍.HashTable和HashMap两种集合非常相似,经常被各种面试官问到两者的区 ...
- centos7 添加磁盘到/(根目录下),扩展VG卷和lv
转载自:http://blog.itpub.net/25469263/viewspace-2662215/ centos7中使用vg方式扩充root分区 1.创建pv fdisk /dev/sdb 输 ...
- jQuery中的样式(七):addClass()、removeClass()、toggleClass()、hasClass()、css()、width()、height()等
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...