集合体系之Set及其子类知识

Set(接口)

public interface Set<E>extends Collection<E>

​ 特点:无序(存储顺序与取出顺序不一致,但它有内在的存储顺序该顺序通过哈希表生成,有时在输入时可能与其内在顺序相同,但之并不代表其有序,多输入几个数据就会发现其无序性),唯一。

其方法与Collection相同,是Set集合框架的顶层接口,不做过多讲解。

HashSet(类)

public class HashSet<E>extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable

HashSet实现唯一性的原理:

​ 底层代码中虽然较为复杂,但是还是可以看出其依赖了hashCode()与equals()方法;

步骤:

​1. 首先比较哈希值

(1)如果相同,继续走,比较的值值或equals()方法

​(2) 如果不同,添加到集合中

按照方法的步骤来说:

​ 1.先观察由hashCode()实现的hash()方法值是否相同

​ (1)相同:走equals()方法;

​ <1>返回true:说明元素重复,没有添加到集合中;

​ <2>返回false:说明元素不重复,以添加到集合中

​ (2)不同:就添加元素到集合

如果类没有重写这两个方法,默认使用Object。一般来说不相同;

  • HashSet的底层数据类型为哈希表(元素是链表的数组)由HsahMap实现,哈希表依赖于哈希值存储,

LinkedHashSet(类)

public class LinkedHashSet<E>extends HashSet<E>
implements Set<E>, Cloneable, Serializable

特点:底层由链表和哈希表实现,

通过链表保证元素有序性,通过哈希表实现元素唯一性。

  • 其无特殊方法,使用去父类方法操作即可

TreeSet(类)

public class TreeSet<E>extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, Serializable

特点:能够按照某种规则对元素排序

排序有两种方式:

1.自然排序

​ TreeSet默认自然排序

​ 如果一个自定义对象要实现自然排序,就必须实现Comparable接口

2.比较器排序

​ 在声明对象时使用带参构造选择构造器,用匿名内部类实现比较器

如果自然排序和比较器排序同时存在优先使用比较器排序

TreeSet集合保证元素排序和唯一性的原理:

唯一性:根据返回值是否为0来决定。

排序:

​ 1.自然排序(元素具备比较性)

​ 让元素所属的类实现自然排序接口Comparable

​ 2.比较器排序(集合具备比较性)

​ 让集合的构造方法接收一个比较器的子类对象Comparator

两种排序实例:

  • 自然排序
import java.util.TreeSet;

//通过泛型来约束Compareable的比较类型
class Student implements Comparable<Student>{
private int age;
private String name; Student (String name,int age){
this.age = age;
this.name = name;
} @Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
} @Override
public int compareTo(Student s) {
//此处只是判断了年龄的条件,但是除了年龄外还有姓名不相同
// 但年龄相同的元素被去掉了,所以还要判断年龄是否相同
//而在此处需要判断所有元素是否相同,比较时基本元素直接比较,
//比较引用类型时比较它们基本类型
// return this.age - s.age;
int mun = this.age - s.age;
return mun == 0?this.name.compareTo(s.name):mun;
}
} public class treeset的自然排序 {
public static void main(String[] args) {
Student s1 = new Student("aa",34);
Student s2 = new Student("bb",24);
Student s3 = new Student("cc",32);
Student s4 = new Student("dd",36);
Student s5 = new Student("ee",36);
TreeSet<Student> h = new TreeSet<>();
h.add(s1);
h.add(s2);
h.add(s3);
h.add(s4);
h.add(s5);
System.out.println(h);
}
}
  • 比较器排序
import java.util.Comparator;
import java.util.TreeSet; class Person {
private int age;
private String name; Person (String name,int age){
this.age = age;
this.name = name;
} @Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
} public class tree的比较器排序 {
public static void main(String[] args) { TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int num = o1.getAge() - o2.getAge();
return num == 0?o1.getName().compareTo(o2.getName()):num;
}
}); Person p1 = new Person("aa",2);
Person p2 = new Person("bb",3);
Person p3 = new Person("cc",4);
Person p4 = new Person("dd",1);
Person p5 = new Person("ee",2);
Person p6 = new Person("aa",2); ts.add(p1);
ts.add(p2);
ts.add(p3);
ts.add(p4);
ts.add(p5);
ts.add(p6); for (Person p:ts){
System.out.println(p.getName()+"====="+p.getAge());
}
}
}

两种排序自然排序适合多次进行排序时使用,而比较器排序适合排序次数不多的情况。而且如果先实现了自然排序,再修改了类的属性则重写的自然排序也要进行修改。但是比较器排序没有这样的问题,因为其在使用时才会被重写。

Javase之集合体系(3)之Set及其子类知识的更多相关文章

  1. Javase之集合体系(4)之Map集合

    集合体系之Map集合 ##Map<K,V>( 接口 ) 特点:将键映射到值对象,一个映射不能包含重复的键:每个键只能映射一个值 Map集合与Collection集合的区别 ​ Map集合存 ...

  2. Javase之集合体系(2)之List及其子类ArrayList,LinkedList与Vector及其迭代器知识

    集合体系之List及其子类ArrayList,LinkedList与Vector及其迭代器知识 List(接口) 特点:有序(存储与取出顺序相同),可重复 List子类特点: ​ ArrayList: ...

  3. Javase之集合体系之(1)集合顶层类Collection与其迭代器知识

    集合体系之集合顶层类Collection与其迭代器知识 集合的由来:Java是一门面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,就必须把多个对象进行存储,而要存 ...

  4. javaSE中级篇3——集合体系(另外一种存储容器)——更新完毕

    集合还是一种工具,所以它们的包都在java.util包下 1.集合的整个体系结构(是需要掌握的体系,完全体系不是这样) 对图中所说的 序和重复 这两词的说明: 序:指的是添加进去的元素和取出来的元素 ...

  5. 浅谈Java的集合体系

    集合体系框架图 集合接口 Java集合类库将接口(interface)与实现(implementation)分离,如上图,Set是一个集合接口,而HashSet与TreeSet都是实现了Set接口的子 ...

  6. JAVA提高九:集合体系

    在经过了前面的JDK6.0新特性的学习后,将进一步深入学习JDK,因为集合的重要性,因此从集合开始入手分析: 一.集合概况 Java是一种面向对象语言,如果我们要针对多个对象进行操作,那么首先必要将多 ...

  7. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

  8. Java集合体系总结

    一.集合框架 集合是容纳数据的容器,java常用的集合体系图如下.以集合中是否运行重复元素来分,主要有List和Set接口,List集合中可以有重复元素,Set集合集合中的元素不可重复,Iterato ...

  9. 大数据之路week02 Collection 集合体系收尾(Set)

    1.Set集合(理解) (1)Set集合的特点 无序,唯一. (2)HashSet集合(掌握) A: 底层数据结构是哈希表(是一个元素为链表的数组) B: 哈希表底层依赖两个方法: hashCode( ...

随机推荐

  1. SpringBoot日志原理解析

    1.日志框架 小张:开发一个大型系统:1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件?2.框架来记录系统的一些运行时信息:日志框架 : ...

  2. SPARQL入门(二)使用Java操作ARQ

      在文章SPARQL入门(一)SPARQL简介与简单使用中,我们了解了RDF.SPARQL以及基于Java编写的SPARQL处理器ARQ.在本文中,笔者将会如何使用Java来操作ARQ.   注意到 ...

  3. WebShell代码分析溯源(三)

    WebShell代码分析溯源(三) 一.一句话变形马样本 <?php $g = array('','s');$gg = a.$g[1].ser.chr('116');@$gg($_POST[ge ...

  4. 微信小程序头像为什么是模糊的?小程序头像模糊怎么办?

    「柒留言」更新的换国旗头像小功能,获取头像显示模糊... 1.头像模糊 国庆之前,更新了「柒留言」小程序加国旗头像的小功能,但是头像模糊这个坑我在发布新版之前还没解决. 一直以为是代码出了问题,各种搜 ...

  5. 【C#】学习笔记(3) 关于Events使用的小Demo

    关于Events事件的简单Demo. 目录结构: Program.cs using System; namespace EventsDemo { class Program { static void ...

  6. Thymeleaf常用语法:条件判断 if、switch case

    if语句条件判断使用th:if,它会判断表达式是否成立,表达式的结果支持boolean.number.character.String及其他类型.满足下面情况,if语句成立:(1) 表达式的结果是数字 ...

  7. 最常见的 Git 问题和操作清单汇总

    最常见的 Git 问题和操作清单汇总 引言 本文整理自工作多年以来遇到的所有 Git 问题汇总,之前都是遗忘的时候去看一遍操作,这次重新整理了一下,发出来方便大家收藏以及需要的时候查找答案. 一.必备 ...

  8. 近期用到了Git,就简单介绍下具体用法吧

    pull:是下拉代码,相等于将远程的代码下载到你本地,与你本地的代码合并push:是推代码,将你的代码上传到远程的动作完整的流程是: 第一种方法:(简单易懂) 1.git add .(后面有一个点,意 ...

  9. 初级模拟电路:3-9 BJT三极管实现逻辑门

    回到目录 BJT晶体管可以实现逻辑门,事实上,在场效应管被发明用于集成电路以前,各种逻辑门芯片中的电路就是用BJT晶体管来实现的.最早人们使用二极管与BJT组合来实现逻辑门,这个称为二极管-晶体管逻辑 ...

  10. npm --save-dev 和 --save 的区别

    转载 >>> 1. npm install 在安装 npm 包时,有两种命令参数可以把它们的信息写入 package.json 文件, 一个是npm install--save    ...