常用容器(Collection)实现类总结(四)——HashSet

HashSet简略说明:

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

(This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the null element. )

(注意:HashSet必须重写hashcode和equals方法)

HashSet的优、缺点分析:

优点:

  • 不允许储存相同的对象(注意:HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false)

缺点:

  • 相较HashMap速度慢(HashMap由唯一的Key来找Value)

方法分析:

HashSet的底层实现实际上是HashMap,主要分析其中一个方法add():

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

可见,传入的形参e是作为map的Key,而HashSet的元素不可重复实际上就是利用了Map中Key的不可重复

再看看PRESENT是什么:

private static final Object PRESENT = new Object();

定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final

时间: 2024-08-04 19:43:29

常用容器(Collection)实现类总结(四)——HashSet的相关文章

java 容器Collection List Set Map概述

对JAVA的集合的理解是想对于数组 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法. Set 和

界面组件和常用容器

组件 Java图形用户界面最基本组成部分是组件(Component).组件是一个以图形化的方式显示在屏幕上并能与用户交互的对象,例如一个按钮一个标签等.组件不能单独显示出来,必须将组件放在容器中才可以显示出来类Java.awt.Component是许多组件类的父类,Component类中封装来了组件通用的方法和属性,如大小,组件对象,显示位置,颜色等 常用容器 容器java.awt.Container是一个类也是Component的子类,因此容器本身也是一个组件但他主要功能是容纳其他组件和容器.

常用类型转换方法工具类

功能:十六进制字符串与字节数组互转.字符转字节.Blob类型转字节数组.阿拉伯数字转中文小写 1 import java.io.BufferedInputStream; 2 import java.io.IOException; 3 import java.sql.Blob; 4 5 /** 6 * 常用类型转换方法工具类 7 */ 8 public class ConvertUtil { 9 10 /** 11 * 字节数组转换为十六进制字符串. 12 * @param src 13 * @r

集合(Collection)类

集合(Collection)类是专门用于数据存储和检索的类.这些类提供了对栈(stack).队列(queue).列表(list)和哈希表(hash table)的支持.大多数集合类实现了相同的接口. 集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等.这些类创建 Object 类的对象的集合.在 C# 中,Object 类是所有数据类型的基类. 各种集合类和它们的用法 下面是各种常用的 System.Collection 命名空间的类.点击下面的链接查看

spring cloud常用注解及关键类

[email protected] @SpringCloudApplication @EnableFeignClients @MapperScan("com.xx.common.domain.mapper") @ComponentScan({"com.xx.common", "com.xx.api"}) public class ApiApp { public static void main(String[] args) { SpringApp

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

基于内存查看STL常用容器内容

有时候在线上使用gdb调试程序core问题时,可能没有符号文件,拿到的仅是一个内存地址,如果这个指向的是一个STL对象,那么如何查看这个对象的内容呢? 只需要知道STL各个容器的数据结构实现,就可以查看其内容.本文描述了SGI STL实现中常用容器的数据结构,以及如何在gdb中查看其内容. string string,即basic_string bits/basic_string.h: mutable _Alloc_hider _M_dataplus; ... const _CharT* c_s

AVA实例化类的四种方法

原文地址:JAVA实例化类的四种方法 作者:权镜士 JAVA中实例化类的四种方法 1)使用new操作符 2)调用Class对象的newInstance()方法 3)调用clone()方法,对现有实例的拷贝 4)通过ObjectInputStream的readObject()方法反序列化类 点击(此处)折叠或打开 import java.io.*; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTa

winform常用的属性(listview),常用容器(二者结合)

ListVies控件主要用于展示数据(非常实用和重要的控件) FullRowSelect:设置是否行选择模式.(默认为false) (开启之后一下选中一行数据) ___________________________________________________________________________________________________________________________ GridLines:设置行和列之间是否显示网格线.(默认为false)提示:只有在Deta

实例化类的四种方式

实例化类有四种方式: 1)使用new操作符 2)调用Class对象的newInstance()方法 3)调用clone()方法,对现有实例的拷贝 4)通过ObjectInputStream的readObject()方法反序列化类 1.new操作符 A a1 = new A(); System.out.println("a1: " + a1); 2.Class.forName()的newInstance方法和Constructor对象的newInstance()方法 Class<A