使用键作为字符串序列化和反序列化映射

我打算序列化和反序列化其键是字符串的hashmap。 从Josh Bloch的Effective Java,我理解以下内容。 第222页 例如,考虑哈希表的情况。 物理表示是包含键值条目的一系列散列桶。 放入条目的哪个桶是密钥的哈希码的函数,通常保证从JVM实现到JVM实现不相同。 实际上,从运行到同一JVM实现运行甚至不能保证它们是相同的。 因此,接受哈希表的默认序列化表单将构成严重错误。 序列化和反序列化哈希表可能会产生一个不变量严重损坏的对象。 我的问题是:1)一般来说,覆盖地图关键类的等于和哈希码会解决这个问题,地图可以正确恢复吗? 2)如果我的键是一个String并且String类已经覆盖了hashCode()方法,我是否还会遇到上述问题。 (我看到一个错误,让我觉得这可能仍然是一个问题,即使键是重写hashCode的String。) 3)以前,我通过序列化一系列条目(键,值)解决了这个问题,并且在反序列化时我会重建地图。 我想知道是否有更好的方法。 4)如果问题1和2的答案仍然无法保证,有人可以解释原因吗? 如果hashCodes是相同的,他们会跨JVM转到相同的存储区吗? 谢谢,格雷斯

尝试使用Alakai插件将Launch4j集成到Maven项目中

我试图将安装程序的生成集成为maven编译过程的一部分。 我找到了Alakai的Launch4j 插件 。 我使用Maven创建了一个简单的Hello World应用程序。 我试图使用Alakai提供的配置示例,但是当我编译项目时,我得到: 无法在项目Launch4j上执行目标org.bluestemsoftware.open.maven.plugin:launch4j-plugin:1.5.0.0:launch4j(launch4j):无法构建可执行文件; 请validation您的配置。 应用程序jar不存在。 – > [帮助1] 不幸的是,Alakai的文档是有限的,我用谷歌搜索找不到多少。 有谁知道应该在哪里设置Launch4j config.xml? 它在项目内吗? 它在一个单独的目录中吗? 我需要使用程序集插件吗? 我在我的电脑上安装了Launch4j。 我是否需要在pom.xml中指定安装目录? 如果有,怎么样? 有没有人有一个可操作的pom.xml示例/示例来共享? 谢谢。

为什么我们在jsp而不是System.out.println()中写出out.println()?

我开始学习jsp,我看到,如果我们想在jsp中打印一些内容,我们必须编写out.println()而不是System.out.println() ,但如果我们编写System.out.println()它没有显示任何错误,但也没有o / p到浏览器。 我想知道它为什么会发生? 我们都知道System是一个预定义的类, out是连接到控制台的输出流。 那么为什么我们不需要在jsp中编写System ? 谢谢。

java中的包级保护有什么用?

我知道java中的包级保护是如何工作的。 我读了很多代码(包括许多开源代码),似乎没有人使用它。 整个保护级别对我来说似乎有点不对(我在一周的任何一天都有c#内部)。 是否存在常用的合法的现实用例? 编辑:在问这个问题后有点太晚了,我意识到我忘了排除包受保护的实现类的“标准”模式,可能提供公共接口的实现。 每个人都使用这些,正如回复中多次提到的那样。 我仍然认为这个问题有很多很好的回复。

Java不是垃圾收集内存

我正在读取一个非常大的文件,并从每一行中提取一小部分文本。 但是在操作结束时,我的内存很少。 看起来垃圾收集器在读取文件后无法释放内存。 我的问题是:有没有办法释放这段记忆? 或者这是一个JVM错误? 我创建了一个SSCCE来certificate这一点。 它读取1 mb(由于16位编码而在Java中为2 mb)文件并从每行中提取一个字符(~4000行,因此应该是大约8 kb)。 在测试结束时,仍然使用了完整的2 mb! 初始内存使用情况: Allocated: 93847.55 kb Free: 93357.23 kb 读取文件后立即(在任何手动垃圾收集之前): Allocated: 93847.55 kb Free: 77613.45 kb (~16mb used) 这是预料之中的,因为程序正在使用大量资源来读取文件。 然而,我垃圾收集,但不是所有的内存都被释放: Allocated: 93847.55 kb Free: 91214.78 kb (~2 mb used! That’s the entire file!) 我知道手动调用垃圾收集器不会给你任何保证(在某些情况下它是懒惰的)。 然而,这发生在我的大型应用程序中,其中文件几乎占用了所有可用内存,并且导致程序的其余部分尽管需要它而耗尽内存。 这个例子证实了我怀疑从文件中读取的多余数据没有被释放。 以下是生成测试的SSCCE: import java.io.*; import java.util.*; public class Test { […]

java如何在引擎盖下实现字符串的flyweight模式?

如果你有两个String实例,并且它们是相同的,那么在Java中它们将共享相同的内存。 这是如何实现的? 编辑:我的应用程序使用大量的String对象,其中许多是相同的。 使用Java String常量池的最佳方法是什么,以避免创建自定义flyweight实现?

OkHTTPClient代理validation如何?

问题:如何向OkHTTP添加授权代理。 我知道OkHTTP的构建器确实支持代理,尽管我很难设置代理 。 /** * Given a Url and a base64 encoded password return the contents of a website. * @param urlString * @param password * @return JSON */ public String getURLJson(String urlString, String password) { OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build(); Request request = new Request.Builder() .url(urlString) .get() […]

Spring + AspectJ使用aspectj-maven-plugin编织java 8

我正在将我的项目从java 7迁移到java 8,我遇到的问题与使用aspectj-maven-plugin aspectj编织有关。 根据Haus文档,我可以使用在Java 6和7上运行的这个插件成功配置编织。 但问题是我还没有找到任何方法来使用(并找到)支持java 8的插件版本7.我在这里看到插件7增加了java 8支持,但找不到使用它的方法。 这是我需要的配置插件: org.codehaus.mojo aspectj-maven-plugin 1.7 1.8 1.8 1.8 compile test-compile 我确认使用版本1.6的上述代码适用于Java 7,但尝试使用1.7版本没有运气。 你知道怎么运行在Java 8上运行的spring + aspectj的weaver吗?

为什么varargs应该是方法签名中的最后一个?

如果我尝试编写如下方法 public void someStuff(Object … args, String a ) 我收到这个错误 someStuff方法的变量参数类型Object必须是最后一个参数。 我不完全理解变量参数类型的要求是最后一个。 任何输入都会有所帮助。

如何在Java中为图像添加水印?

如何使用Java在图像上创建水印? 我需要将用户输入的文本添加到图像上的提供位置。 任何示例代码/建议都会有所帮助。