如何查看HashMap中键的分布?

2024-02-08

使用哈希映射时,将键均匀分布在存储桶上非常重要。

如果所有键最终都在同一个存储桶中,那么您最终会得到一个列表。

有没有一种方法可以“审核”Java 中的 HashMap,以查看键的分布情况?

我尝试对其进行子类型化并迭代Entry<K,V>[] table,但不可见。


我尝试对其进行子类型化并迭代 Entry[] 表,但它不可见

使用反射 API!

public class Main {
    //This is to simulate instances which are not equal but go to the same bucket.
    static class A {
            @Override
            public boolean equals(Object obj) { return false;}

            @Override
            public int hashCode() {return 42; }
        }

    public static void main(String[] args) {
            //Test data  
            HashMap<A, String> map = new HashMap<A, String>(4);
            map.put(new A(), "abc");
            map.put(new A(), "def");

            //Access to the internal table  
            Class clazz = map.getClass();
            Field table = clazz.getDeclaredField("table");
            table.setAccessible(true);
            Map.Entry<Integer, String>[] realTable = (Map.Entry<Integer, String>[]) table.get(map);

            //Iterate and do pretty printing
            for (int i = 0; i < realTable.length; i++) {
                System.out.println(String.format("Bucket : %d, Entry: %s", i, bucketToString(realTable[i])));
            }
    }

    private static String bucketToString(Map.Entry<Integer, String> entry) throws Exception {
            if (entry == null) return null;
            StringBuilder sb = new StringBuilder();

            //Access to the "next" filed of HashMap$Node
            Class clazz = entry.getClass();
            Field next = clazz.getDeclaredField("next");
            next.setAccessible(true); 

            //going through the bucket
            while (entry != null) {
                sb.append(entry);
                entry = (Map.Entry<Integer, String>) next.get(entry);
                if (null != entry) sb.append(" -> ");
            }
            return sb.toString();
        }
}

最后你会在 STDOUT 中看到类似这样的内容:

 Bucket : 0, Entry: null 
 Bucket : 1, Entry: null 
 Bucket : 2, Entry: Main$A@2a=abc -> Main$A@2a=def 
 Bucket : 3, Entry: null
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查看HashMap中键的分布? 的相关文章

  • Java 中类似 HashMap 的可排序数据结构?

    Java 中是否有某种类似于 HashMap 的数据结构 可以按键或值排序 在 PHP 中 您可以拥有可排序的关联数组 Java中有这样的东西吗 HashMaps 几乎按照定义是未排序的 一个好的哈希函数会产生看似随机的密钥分布 如果你想使
  • 我们可以在java中放弃已经签名的jar吗?

    I ve a jar文件具有旧签名 并希望使用新签名重新签名 是否可以 如果可能的话 怎么做 如果签名不是您拥有的 您需要先解压 jar 像这样 假设是unix 否则翻译成dos jar xvf JarName jar rm rf META
  • CompletableFuture:whenCompleteAsync() 不允许我重新抛出异常

    我是 CompletableFuture 世界的新手 我正在尝试做一些负面测试 以允许我故意抛出异常的方式 该异常将决定通过 失败 这是代码片段 protected CompletableFuture
  • 如何修复安装 maven jar 插件依赖项时出现的错误?

    我正在将应用程序制作成 maven 中的 jar 文件 但是 当我从 Maven 中提取 jar 插件存储库并在终端中运行这三个命令时 mvn clean mvn compile mvn package 在 mvn package 中 我收
  • 如何测试 Jersey REST Web 服务?

    我已经编写了一个 Restful Web 服务 并且必须使用 JUnit4 对其进行测试 我已经使用 Jersey Client 编写了一个客户端 但想知道我是否只能使用 junit4 测试我的服务 至少有人可以帮我提供样品吗 我的休息服务
  • Java 8 中异常类型推断的一个独特功能

    在为该网站上的另一个答案编写代码时 我遇到了这个特性 static void testSneaky final Exception e new Exception sneakyThrow e no problems here nonSnea
  • Java JNDI 名称 java:/

    我正在遵循教程 https docs oracle com javase tutorial jndi index html https docs oracle com javase tutorial jndi index html 我的冒险
  • Spring批量写入器限制

    我正在工作 Spring Batch 项目 从数据库读取记录然后写入rabbitmq 然后发送到HTTP消息网关 网关有150TPS我需要将我的应用程序限制为 150TPS 有没有办法带弹簧批的油门或者还有其他更好的方法吗 你能行的 在 S
  • java.time.LocalDate 到 java.util.Date

    转换的最佳方式是什么java time LocalDate to java util Date Date from dateToReturn atStartOfDay ZoneId systemDefault toInstant 我一直在尝
  • 最终类中的静态函数是否隐式最终?

    我的问题基本上与this https stackoverflow com q 8766476 3882565一 但这是否也适用于static功能 我想了解 编译器是否处理所有static函数在一个final类为final 是否添加final
  • 如何解决声纳中的 dodgy:unchecked/unconfirmedcast 问题?

    我在下面的代码中通过声纳获得异常 我该如何解决这个问题 建议我 Override public boolean validate BaseInfo infoObject boolean isValid true AckTransferPay
  • 如何保存/加载 BigInteger 数组

    我想保存 加载BigInteger数组传入 传出 SharedPreferences 如何做呢 例如对于以下数组 private BigInteger dataCreatedTimes new BigInteger 20 Using Gso
  • Java如何区分这些具有相同名称/签名的多个方法?

    今天我在追踪一个错误 我注意到我们的一个班级中有一些奇怪的事情 我删除了尽可能多的代码并发布在这里 class A static int obtainNumber return 42 static int obtainNumber retu
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean
  • FocusEvent 没有获取 JFormattedTextField 的最后一个值,我如何获取它?

    我有两个JFormattedTextField我的物体JFrame目的 我想要通过这些值进行基本数学 加法 JFormattedTextField对象 我希望当焦点丢失第一个或第二个文本字段时发生这种情况 但当 focusLost 事件没有
  • 如何为用户的活动设置计时器?

    如果用户在 5 小时内停止工作 我需要执行特定的方法 假设用户已登录 但他在 5 小时内没有向数据库的特定表添加任何记录 任何时候用户将记录添加到指定的表中 该特定用户的计时器都应该重置 否则它将继续运行 如果达到 5 小时 应用程序应显示
  • 如何在java中进行多处理,以及预期的速度提升是多少?

    我是一个新手 使用 Java 对 csv 文件进行一些数据处理 为此 我使用 Java 的多线程功能 线程池 将 csv 文件批量导入到 Java 中 并对每一行执行一些操作 在我的四核处理器上 多线程大大加快了处理速度 我很想知道多处理如
  • 旧的和奇异的 JVM 上 java.io.BufferedInputStream 的默认缓冲区大小是多少?

    我一直在为一篇关于以下内容的博客文章进行一些研究java io BufferedInputStream和缓冲区 显然 多年来 默认值已从区区 512 字节增长到 8192 字节 冒昧地 Sun 的 Java 7 实现 甚至在JDK 1 1
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition
  • 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

    默认行为是当字段获得焦点时 字段中的提示文本将被删除 那是标记在场上的时候 是否可以配置文本字段 以便仅在用户开始输入时删除提示文本 否则 我需要在每个文本字段旁边 上方添加一个标签 以描述其中的值 我知道它有点旧 但我自己也需要它 这仍然

随机推荐

  • React createElement 与 CloneElement

    谁能告诉我如果使用cloneElement 在现有元素实例上 或createElement 在react Element类上 哪一个在性能方面更好 有时克隆某些东西比创建新实例更快 请告诉我 谢谢 Using cloneElement通常会
  • ASP.NET MVC 3 DropDownList 选定索引已更改

    我有一项功能 允许用户根据自己的状态代码过滤记录 在菜单中 我有一个自定义过滤器部分 h3 Custom Filters h3 br ul Html RenderAction GetGroups Manage ul 我的部分视图如下所示 m
  • ReplayKit 在应用程序的后台模式或应用程序外部停止屏幕录制?

    我已经在应用程序的前台模式下使用 ReplayKit 实现了屏幕录制 但是 当我使用主页按钮离开应用程序时 应用程序会停止后台记录 gt App Store 中有一个可以进行后台屏幕录制的应用程序 gt 如果我必须使用广播上传和 UI 扩展
  • 简单地将 Entity Framework Core 添加到基本 Azure 函数应用程序会导致错误

    描述起来非常简单 使用 Visual Studio 2019 16 4 1 中的 Azure Functions 模板创建新的解决方案 将 TargetFramework 更改为 NET Core 3 1 它将使用 Microsoft NE
  • 如何加载依赖程序集?

    我有一个项目处理器 它依赖于其他 2 个项目 当我编译项目时 我在 Bin 文件夹中得到 dll Processor dll 和其他项目的依赖 dll Processor dll BusinessAction dll 和 Repositor
  • Spring实际上是否使用REQUIRES_NEW启动一个新事务?

    我的 spring 4 1 1 应用程序部署在 JBoss 6 10 final 实例上 因此它使用基于容器的事务管理器和数据源 对于消息传递 我使用 TIBCO EMS 8 1 并设置了 XA 队列连接工厂 Java版本是1 8 0 20
  • ctrl-d 没有停止 while(getchar()!=EOF) 循环[重复]

    这个问题在这里已经有答案了 Here is my code I run it in ubuntu with terminal when I type a CtrlD in terminal the program didn t stop b
  • ASP .NET MVC 3 - 如何提交嵌套在 html 表单中的 ajax 表单

    我有一个 ASP NET MVC 3 项目 并且我的 创建 视图之一存在问题 我有使用 ajax 表单实现的级联下拉字段 粗略地说 该视图是这样的 using Html BeginForm Html MyDropDown1 using Aj
  • 在 Linux 上安装 nloptr

    我正在尝试安装 R 包nloptr在没有互联网连接的 CentOS Linux 机器上 如下所示 install packages home ravi nloptr 1 0 4 tar gz repos NULL type source 该
  • 函数内声明的 const 数组是否存储在堆栈中?

    如果这是在函数中声明的 它会在堆栈上声明吗 它是 const 让我想知道 void someFunction const unsigned int actions 8 e1 e2 etc 是的 它们在堆栈上 您可以通过查看此代码片段来了解这
  • SAP B1,如何显示从 ItemImage 获取的图像?

    我正在从 SAP B1 服务层获取图像 在邮递员中 我可以将其视为image png 但显示它时出现问题 正确的显示方式是什么 img require fetchedImage 不起作用 我创建了一个云函数来获取图像并将其传递给客户端 但我
  • 以编程方式设置 LinearLayout 分隔线大小

    我已经尝试了多种解决方案 但似乎没有一个有效 我目前正在使用以下Drawable作为分隔线 这是水平示例 但相同的方法也适用于垂直 将高度切换为宽度 LinearLayout linearLayout set with findViewBy
  • 使用 ?与 sed

    我只想获取可能经过 gzip 压缩或未经过 gzip 压缩的文件的编号 但是 sed 中的正则表达式似乎不支持 这是我尝试过的 echo file 1 gz sed n s gz 1 p 并没有返回任何东西 然后我添加了一个 到正在分析的字
  • Julia:矢量化代码与非矢量化代码

    据我了解 Julia 应该使 for 循环更快 并且与矢量化操作一样快 我编写了一个简单函数的三个版本 该函数使用 for 循环与矢量化操作与后者使用 DataFrame 来查找距离 x rand 500 y rand 500 a rand
  • YouTube 数据 API 每日最大查询配额已降至 0,且无法设置任何数字

    我们的项目每天的查询配额限制突然降至 0 Google 没有任何解释 我们正在为我们的项目使用 YouTube Data API 并且即将发布该应用程序 因此我们要求 YouTube 增加每天的查询配额限制 然而 三天后就降为0 没有任何明
  • ag-grid 使用单个 gridOptions 在同一页面中多个实例

    我在我的应用程序中使用 ag grid 我想在同一页面上使用具有两个网格的网格选项的相同实例 ag grid 仅渲染其中一个网格 而将另一个网格留空 这个 plnkr 显示了这个问题 http plnkr co edit 4rRNRGbUo
  • 在延迟加载模块中使用 Angular 组件

    我想在应用程序的多个部分中使用 Angular 组件 包括在延迟加载模块内的组件中 我不知道如何声明在惰性模块中使用它的组件 我将向您展示不同文件的一些相关部分 应用程序模块 ts import FpgTimeComponent from
  • Android Room Dao:按案例排序不起作用

    我有一个 Room 数据库 使用 Dao 来处理查询等 我使用静态 非实时数据 函数通过查询检索结果 当我手动硬编码 Order By 值和列时 一切正常 如下所示 但是在传递参数时到 Dao 进行排序时 Order By 恢复为默认值 按
  • Android,如果内容已经下载到ListView中,如何停止再次读取getView()函数

    我是一个 Android 新手 我有一个 ListView 在 ListView 的每个元素上显示图像 它工作正常 但是当我开始滚动时 我意识到如果我的图像显示在我的手机设备的屏幕上 我会再次下载它 我怎样才能停止重新加载 ListView
  • 如何查看HashMap中键的分布?

    使用哈希映射时 将键均匀分布在存储桶上非常重要 如果所有键最终都在同一个存储桶中 那么您最终会得到一个列表 有没有一种方法可以 审核 Java 中的 HashMap 以查看键的分布情况 我尝试对其进行子类型化并迭代Entry