五、Set接口

Set集合也相当于是一个容器,一旦把对象丢进容器中,集合中的多个对象之间没有明显的顺序
Set集合不允许重复元素进行添加,如果试图将两个相同的元素添加到一个Set集合中的时候,则add方法会返回false

1.HashSet
是Set接口的实现类,大多数如果要选用Set集合,一般直接选用HashSet

特点:
a.排重的【同一个元素不能重复添加,依靠hashCode()和equals()方法进行排重】
原理:如果两个对象的hashCode()值相同,并且通过equals()比较的结果返回是true,那么HashSet会认为这两个对象时同一个对象,在添加的时候只会添加一次
b.无序的【元素添加的顺序和底层存储的顺序不同,并不是随机的,是一套算法计算出来的,这个顺序并不是一成不变的,而是随时会发生改变】
c.底层存储采用的数据结构是哈希算法【具有很好的存取和查找性能】
原理:数组可以通过索引访问对应的元素,索引指出了元素在内存中存储的位置,而HashSet没有索引的,所以hashCode相当于是数组中的索引,决定每个元素在内存中的地址
d.HashSet不是同步的,如果多个线程访问同一个HashSet的时候,徐要考虑保证线程的同步

2.LinkedHashSet
LinkedHashSet是HashSet的子类,使用的方式和HashSet类似

特点:
a.排重的【依靠hashCode和equals方法】
b.有序的
c.底层存储采用的数据结构是:链表【类似LinkedList】

3.TreeSet
TreeSet是Set集合的一个实现类,同时也是SortedSet【作用:主要负责排序】的唯一实现类,它可以确保元素处于一个排序状态

特点:
a.排重的【排重方式:在排序的同时,会完成排序,排序方式:自然排序和定制排序】
b.有序的【元素添加到集合中,会按照特定的顺序进行排序,会按照排序后的顺序进行存储】
c.底层存储采用的数据结构:二叉树【红黑树】

排序方式:
自然排序:Treeset中添加元素的时候,会默认调用Compareble接口中的compareTo()方法,作用主要是为了比较大小,从而达到排序的效果【默认全部是升序的】

排序规则:只针对的是自定义的类
对于系统的一些类,已经重写过了compareTo()方法,比如String,Integer,Character,Data...【默认都是升序排序的】
obj1 int compareTo(Object obj2) :比较此对象与指定对象的顺序。

排序的同时排重: (x.compareTo(y)==0) == (x.equals(y))

正整数:obj1 > obj2
负整数:obj1 < obj2
0:obj1 == obj2【相当于obj1.equals(obj2) = true】

时间: 2024-10-07 00:42:36

五、Set接口的相关文章

Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(ReentrantLock)以及读写锁(ReentrantReadWriteLock). 1. ReentrantLock 在Java多线程(二) 多线程的锁机制 里面,已经总结过通过使用Synchronized关键字实现线程内的方法锁定.但使用Synchronized关键字有一些局限性,上锁和释放锁是由JVM决定的

第五章 接口

接口 一.介绍 TypeScript 的核心原则之一是对值所具有的结构进行类型检查. 它有时被称做"鸭式辨型法"或"结构性子类型化". 在 TypeScript 里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约 二.接口初探 interface LabelledValue { label: string; } function printLabel(labelledObj: LabelledValue) { console.log(labelledO

第二十五天接口、多态

1.java是面向对象的语言. 设计模式:接口 接口类是从java里衍生出来的,不是python原生支持的  主要用于继承里多继承 抽象类是python原生支持的主要用于继承里的单继承 但是接口类和抽象类都是为了写程序时进行代码的规范化 2.第一个接口类程序的引入:即如果前面写了两个支付功能,来了三个程序员写但是支付功能与前两个写的方法名称不一样怎么进行查询: class Payment: def pay(self,money): raise NotImplemented #主动抛异常,表示没有

第十五章 接口和集合

1.  接口的关键字:interface 2.  接口的特性: 1)接口属性都是静态常量 2)方法都是抽象方法 3)实现类必须实现接口的所有方法 4)实现类可以实现多个接口 5)接口不能被实例化,没有构造方法 6)接口中的方法不能私有化 3.  实现的关键字:implements 4.  子类和父类是is a 的关系     实现类和接口是has a 的关系 5.  集合:可以存放一组不同或相同类的数据. 6.  接口: collection List Set 类        Arraylis

C#图解教程 第十五章 接口

接口 什么是接口 使用IComparable接口的示例 声明接口实现接口 简单接口示例 接口是引用类型接口和as运算符实现多个接口实现具有重复成员的接口多个接口的引用派生成员作为实现显式接口成员实现 访问显式接口成员实现 接口可以继承接口不同类实现一个接口的示例 接口 什么是接口 接口是指定一组函数成员而不实现它们的引用类型.所以只能类和结构来实现接口. 这种描述比较抽象,直接来看个示例. 下例中,Main方法创建并初始化了一个CA类的对象,并将该对象传递给PrintInfo方法. class

C#编程(二十五)----------接口

接口 如果一个类派生自一个接口,声明这个类就会实现某些函数.并不是所有的面向对象的语言都支持接口. 例如,有一个接口:IDispoable,包含一个方法Dispose(),该方法又类实现,用于清理代码: public interface IDisposable { void Dispose(); } 上述代码说明,声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的实现方式.一般情况下,接口只能包含方法,属性,索引器和事件的声明. 不能实例化接口,他只能包含mount成员的二千名.

五、 接口延伸出的代理模式

示例: // 主题接口:定义了核心功能 interface Subject { public abstract void eat(); } // 核心主题:实现了主题接口,并且只实现核心功能 class RealSubject implements Subject { public void eat() { System.out.println("核心主题RealSubject要XXXX"); } } // 代理主题:实现了主题接口,完成核心主题的辅助性工作 class ProxySu

接口测试基础五--单接口的批量测试

前面我们已经写了代码实现了接口的处理调用,但有时候我们有几条测试用例但是测试步骤完全一致,这个时候如何实现批量测试呢? 1.解决方案-DDT解决批量测试问题 导入ddt测试类,并调用ddt和data方法:from ddt import ddt,data @ddt用来装饰测试类 @data(*test_data) 用来装饰测试用例方法 总结:对于统一接口的批量测试,测试逻辑都是一样的,变动的就只有测试数据,因此我们可以来考虑通过列表来提供几组测试数据,测试类用ddt装饰以及测试方法data装饰后,

Go语言开发(五)、Go语言面向接口

Go语言开发(五).Go语言面向接口 一.Duck Typing简介 1.Duck Typing简介 对于一门强类型的静态语言来说,要想通过运行时多态来隔离变化,多个实现类就必须属于同一类型体系,必须通过继承的方式与同一抽象类型建立is-a关系.而Duck Typing则是一种基于特征,而不是基于类型的多态方式.Duck Typing仍然关心is-a,只不过is-a关系是以对方是否具备相关的特征来确定的.是否满足is-a关系可以使用所谓的鸭子测试(Duck Test)进行判断."当看到一只鸟走起

Hibernate系列之核心开发接口

一.概述 所有的hibernate应用中都会访问5个核心接口,它们分别是: Configuration:配置hibernate,创建SessionFactory对象 SessionFactory:初始化hibernate,充当数据存储源的代理,创建Session对象 Session:负责保存.更新.删除.加载和查询对象 Transaction:管理事事务 Query和Criteria:执行数据库查询 下面将对这五个接口进行逐一总结: 二.Configuration 一个Configuration