Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)

本文主要是介绍Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Set集合

package SetDemo;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class SetDemo {public static void main(String[] args) {/*Set集合的特点:1.Set系列集合的特点:Set集合是一个存储元素不能重复的集合方式,因为存储数据的时候通过判断其元素的hashCode值,不一样再存储。2.Set集合的实现类特点:HashSet: 无序,不重复,无索引LinkedHashSet:有序,不重复,无索引TreeSet:可排序,不重复,无索引3.Set集合的方法与Collection一致需求:利用Set系列的集合,添加字符串,并使用多种方式遍历。迭代器增强forLambda表达式*/// 1.创建set集合的对象Set<String> set = new HashSet<>();// 2.为set对象添加元素boolean b1 = set.add("a");boolean b2 = set.add("a");set.add("c");set.add("b");set.add("e");set.add("d");System.out.println(b1);// trueSystem.out.println(b2);// false// 3.循环输出集合中的元素Iterator<String> iter = set.iterator();// 迭代器while (iter.hasNext()) {System.out.println(iter.next());}// 增强forfor (String s : set) {System.out.println(s);}// lambda表达式set.forEach(System.out::println);}
}

HashSet

package SetDemo;import java.util.HashSet;public class HashSetDemo {public static void main(String[] args) {/*HashSet用于给数据去重,不需要保证数据的添加顺序时用(无序,不重复,无索引)Hash值:1.是根据hashCode方法算出来的int类型的整数2.该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算3.一般情况下,重写hashCode方法,利用对象内部的属性值计算哈希值对象的哈希值特点:1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的2. 如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的3. 在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)4. String 和 Integer不需要重写hashCode方法,Java已经重写了,自定义对象要重写hashCode需求:创建一个存储学生对象的集合,存储多个学生对象。使用程序实现在控制台遍历该集合。要求:学生对象的成员变量值相同,我们就认为是同一个对象*///创建学生对象Student stu1 = new Student("张三",18);Student stu2 = new Student("张三",18);Student stu3 = new Student("李四",18);Student stu4 = new Student("王五",19);// 创建HashSet集合HashSet<Student> set = new HashSet<>();// 1. 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的System.out.println(stu1.hashCode());//189568618System.out.println(stu2.hashCode());//793589513// 将学生对象存入集合( 要重写hashCode,否则就会有重复属性值的元素,因为添加元素是按照hash值来判断的 )set.add(stu1);set.add(stu2);set.add(stu3);set.add(stu4);// 输出集合System.out.println(set);//[name王五, age=19, name张三, age=18, name李四, age=18]// 3.在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。//哈希碰撞System.out.println("abc".hashCode());//96354System.out.println("acD".hashCode());//96354}}

LinkedHashSet

package SetDemo;import java.util.LinkedHashSet;public class LinkedHashSetDemo {public static void main(String[] args) {/*LinkedHashSet :用于给数据去重且要保证数据的添加顺序时用。(有序,不重复,无索引)有序:指的是输出的顺序和添加元素时的顺序一致*///1.创建4个学生对象Student s1 = new Student("zhangsan",23);Student s2 = new Student("lisi",24);Student s3 = new Student("wangwu",25);Student s4 = new Student("zhangsan",23);//2.创建集合的对象LinkedHashSet<Student> lhs = new LinkedHashSet<>();//3.添加元素System.out.println(lhs.add(s3));System.out.println(lhs.add(s2));System.out.println(lhs.add(s1));System.out.println(lhs.add(s4));//4.打印集合System.out.println(lhs);//[namewangwu, age=25, namelisi, age=24, namezhangsan, age=23]}
}

TreeSet

package SetDemo;import java.util.TreeSet;public class TreeSetDemo{public static void main(String[] args) {/*TreeSet:用于数据唯一且需要按指定的要求排序时使用 (不重复,无索引,可排序)可排序:按照元素的默认规则(由小到大)排序,字符类型按照ASCII码表的数字升序排列的TreeSet基于红黑树的数据结构实现排序,增删改查性能都比较好*//*需求:1.存储整数并进行排序2.使用自定义类型,按元素的规则排序排序方法:给Student类实现Comparable接口,重写里面的抽象方法*/TreeSet<Integer> ts  = new TreeSet();// 1.存储整数并进行排序ts.add(3);ts.add(2);ts.add(7);ts.add(6);ts.forEach(System.out::println);// 2 3 6 7// 2.使用自定义类型,按元素的规则排序TreeSet<Student> tss = new TreeSet();Student stu1 = new Student("二",13);Student stu2 = new Student("一",11);Student stu3 = new Student("五",12);Student stu4 = new Student("三",10);tss.add(stu1);tss.add(stu2);tss.add(stu3);tss.add(stu4);System.out.println(tss);//[name三, age=10, name一, age=11, name五, age=12, name二, age=13]}
}

 Student类

package SetDemo;import java.util.Objects;public class Student implements Comparable<Student> {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public Student() {}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;}@Overridepublic String toString() {return "name" + name + ", age=" + age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student that = (Student) o;return age == that.age && Objects.equals(name, that.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Override// TreeSet排序规则public int compareTo(Student o) {// 指定排序的规则// 按年龄进行排序;// this表示当前要添加的元素,o表示已经存在于红黑树中的元素System.out.println("this:"+this);System.out.println("o:"+o);return this.getAge()-o.getAge();}
}

这篇关于Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046552

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na