09.集合框架(二)【Set】【HashSet】【TreeSet】

2024-06-06 13:48

本文主要是介绍09.集合框架(二)【Set】【HashSet】【TreeSet】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

一.Set集合(接口)

1.概述

Set集合中元素不可以重复,无序。

Set集合中的方法和Collection一致。

Set集合只有一种取出方式:Iterator迭代器。

        2.Set字体系

        Set

                  |--HashSet:内部结构是哈希表,不同步,稳定,元素是唯一的。

        |--TreeSet:数据结构是二叉树,不同步,元素也是唯一的。

二.HashSet类

1.概述

HashSetSet集合接口的实现类。底层的数据结构是哈希表,操作此类时稳定。但

   线程不同步

哈希表里每一位元素都是唯一的,存储元素时,都会先调用哈希算法,根据元素自身的特点,存储到特定位置,查找时根据对应的角标查找就行。

       所以,哈希表查询快。

       弊端:元素不能重复。

   2.哈希表如何确定两个元素是否相同?

       如何确定元素是否相同,有两步判断:

   第一步:判断元素的哈希值,用hashCode()方法。如果哈希值地址上没有元素,那么就可以存储,如果哈希值地址上有元素,则进行第二步判断。

第二步:判断两个元素的内容,用equals()方法。如果内容不同,则可以顺延存储。如果

       内容相同,则不能存储。

例子:创建HashSet集合,存储自定义对象。

       具体为:往HashSet集合中存储个人信息(包括姓名,年龄)。

注意:1.自定义对象Person时,对象所属类继承的是Object,而Object类中的

       equals()方法比较的是地址的值是否相等,所以要重写equals()

        2.用迭代器迭代时应Object类型转为Person类。

Person类的实现

<span style="font-size:18px">public class Person implements Comparable {private String name;private int age;public Person() {super();	}public Person(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic int hashCode() {return name.hashCode()+age;}</span>
<span style="font-size:18px">	@Overridepublic boolean equals(Object obj) {if(this == obj)//健壮性判断return true;
//		if(obj instanceof Person)
//			throw new ClassCastException("类型错误");Person p = (Person)obj;return this.name.equals(p.name) && this.age==p.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;}public String toString(){return name+":"+age;}@Overridepublic int compareTo(Object o) {		Person p = (Person)o;//优化int temp = this.age-p.age;return temp==0?this.name.compareTo(p.name):temp;/*if(this.age>p.age)return 1;if(this.age<p.age)return -1;else{return this.name.compareTo(p.name);}*/	}
}
</span>

HashSetTest代码实现

<span style="font-size:18px">import java.util.HashSet;
import java.util.Iterator;import cn.itcast.p.bean.Person;public class HashSetTest {public static void main(String[] args) {HashSet hs = new HashSet();/** HashSet集合数据结构是哈希表,所以存储元素的时候,* 使用元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals方法来确定内容是否相同,*/hs.add(new Person("lisi",21));hs.add(new Person("zhangsan",28));hs.add(new Person("wangwu",27));hs.add(new Person("laoer",24));hs.add(new Person("zhangsan",28));/** Person 继承的是Object类,Object里的equals方法判断的是地址是否相同,* 所以,存储元素时,不能保证元素的唯一性。* 那么只能通过在Person里覆写hashCode方法和equals方法来判断。*/for(Iterator it = hs.iterator();it.hasNext();){Person p =(Person)it.next();System.out.println(p.getName()+"..."+p.getAge());}}}
</span>


 

 

三.TreeSet类

TreeSet可以对Set集合中的元素进行指定排序,是不同步的。

1. TreeSet判断元素唯一性的方式:

根据比较方法的返回结果。返回0,则说明两元素相同。

2. TreeSet对元素进行排序的方式:

方式一:让元素具备比较功能。

元素需要实现comparable接口,覆盖compareTo()方法。如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然

        顺序,那么就使用方式二。

方式二:让集合自身具备比较功能。

        定义一个类实现Comparator接口,覆盖compare方法,将该类对象作为参数

        传递给TreeSet集合的构造函数。

例子:对TreeSet中的字符串对象的长度进行排序。

自定义类实现Comparator接口

     

import java.util.Comparator;public class ComparatorByLength implements Comparator{@Overridepublic int compare(Object o1, Object o2) {String s1 = (String)o1;String s2 = (String)o2;int temp = s1.length()-s2.length();return temp==0?s1.compareTo(s2):temp;}}


  

  将该对象作为餐宿传递给TreeSet的构造函数

  

import java.util.Iterator;
import java.util.TreeSet;import cn.itcast.p5.comparator.ComparatorByLength;/*** 对字符串进行长度排序*/
public class TreeSetTest {public static void main(String[] args) {TreeSet ts = new TreeSet(new ComparatorByLength());ts.add("aaaaa");ts.add("zz");ts.add("nbaq");ts.add("cba");ts.add("abc");Iterator it = ts.iterator();while(it.hasNext()){System.out.println(it.next());}}}


 

 

这篇关于09.集合框架(二)【Set】【HashSet】【TreeSet】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

shell中set -u、set -x、set -e的使用

《shell中set-u、set-x、set-e的使用》本文主要介绍了shell中set-u、set-x、set-e的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录✅ 1. set -u:防止使用未定义变量 作用: 示例:❌ 报错示例输出:✅ 推荐使用场景:✅ 2. se

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分