- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
LinkedHashSet 的 java 文档声明如下:
请注意,如果将元素重新插入集合中,插入顺序不会受到影响。 (如果在调用之前 s.contains(e) 返回 true 时调用 s.add(e),则元素 e 会重新插入到集合 s 中。)
对于最近的一个项目,我决定使用一个在客户端-服务器通信中保存一组数据 token ,以便在某些 ListView 小部件中向用户显示。我的想法是,我能够以廉价的方式重新插入具有更新数据的元素,并且用户不会感到惊讶,因为顺序不会改变。
显然情况并非如此,使用 Oracle JRE 1.7.0_55-b13 时,它的运行方式与任何其他 Set 一样。 ,正如这个简短的测试程序所示:
import java.util.LinkedHashSet;
import static java.util.Arrays.deepToString;
public class LhsStack
{
public static class T
{
public T ( int id ) { this.id = id; }
public final Integer id;
public String value;
@Override
public int hashCode () { return id.hashCode (); }
@Override
public boolean equals ( Object obj )
{
return obj instanceof T && id.equals ( ((T)obj).id );
}
@Override
public String toString () { return id + " => " + value; }
}
public static void main ( String [] args )
{
LinkedHashSet < T > set = new LinkedHashSet <> ();
T a = new T ( 1 ),
b = new T ( 1 ),
c = new T ( 2 ),
d = new T ( 3 );
a.value = "Hello, World";
b.value = "World, Hello";
c.value = "Foo";
d.value = "Bar";
System.out.println ( "a == b: " + a.equals ( b ) );
if ( set.add ( a ) ) {
System.out.println ( "Inserted: " + a.value );
}
System.out.println ( "set.contains ( a ): " + set.contains ( a ) );
System.out.println ( "set.contains ( b ): " + set.contains ( b ) );
set.add ( c ); set.add ( d );
System.out.println ( "Elements: " + set.size () );
System.out.println ( deepToString ( set.toArray () ) );
if ( set.add ( b ) ) {
System.out.println ( "Re-Inserted: " + b.value );
}
else
{
System.out.println ( "Removing and Adding: " + b.value );
set.remove ( b );
set.add ( b );
}
System.out.println ( "Elements: " + set.size () );
System.out.println ( deepToString ( set.toArray () ) );
}
}
a == b: true
Inserted: Hello, World
set.contains ( a ): true
set.contains ( b ): true
Elements: 3
[1 => Hello, World, 2 => Foo, 3 => Bar]
Removing and Adding: World, Hello
Elements: 3
[2 => Foo, 3 => Bar, 1 => World, Hello]
因此,我的问题是,由于元素 b 没有重新插入到集合中(即必须将其删除,然后重新添加以更新其值),那么该元素的意义是什么java 文档中的注释?
谢谢!
最佳答案
通常,linkedHashSet.add(elementToAdd)
使elementToAdd
是 linkedHashSet
的最后一个元素。 Javadoc中注释的意义在于,如果elementToAdd
已经出现在 linkedHashSet
内,然后linkedHashSet.add(elementToAdd)
只会将其保留在原处(并且不会将其移动到末尾)。
对于您想要做的事情,最好使用 LinkedHashMap<Integer, T>
。然后您可以迭代其 values()
获取您的T
按迭代顺序排列的实例,具有更新映射的能力。 (如果需要,您可以将 LinkedHashMap<Integer, T>
包装在某种容器对象中,该对象不是提供 put(Integer, T)
,而是提供一个 add(T)
来处理幕后的键映射。事实上,它应该非常可以直接扩展 AbstractSet<T>
以创建 LinkedHashMap<Integer, T>
的基于 Set<T>
的实现。)
编辑更新的问题:啊,好吧,抱歉,我现在更好地理解您的困惑了。上面是对第一句的目的的解释(“注意,如果元素重新插入到集合中,插入顺序不会受到影响”);我没有意识到您误解了第二句话(“如果 e
被调用,而 s
将在调用之前立即返回 s.add(e)
,则元素 s.contains(e)
被重新插入到集合 true
中。”)
所以,让我解释一下。第二句话只是术语“重新插入”的定义;它没有描述任何行为。这句话并不是说一个LinkedHashSet
如果您调用它 add
,则会执行称为“重新插入”的操作方法及其已包含的元素;相反,这句话说如果你调用它 add
方法中已包含元素,则此调用称为“重新插入”。重新插入的(非)效果如第一句中所述,即它不会将元素移动到末尾。
LinkedHashSet.add
仍然遵守Set.add
的要求,它指定“如果指定元素尚不存在,则将其添加到此集合(可选操作)。[...]如果此集合已包含该元素,则调用将保持集合不变并返回 false
。”
在某些情况下,JDK 类不遵守它们声称要实现的接口(interface)的要求,但当发生这种情况时,它将以粗体警告的形式发出,而不仅仅是隐藏在括号内并且从未提及再次。请参阅the Javadoc of IdentityHashMap
举个例子。
关于java - LinkedHashSet 文档歧义 : Re-insert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23576401/
我有一个 .sln 文件,里面有几个项目。为了简单起见,让我们称它们为... 项目A 项目B 项目C ...其中 A 是引用 B 和 C 的主要项目。我的目标是更新我的构建脚本,为 ProjectA
我安装了 Magento,我想知道如何生成完整的 API 文档,例如 http://docs.magentocommerce.com/ 上的文档是使用 phpdoc 生成的。 Magento 中是否包
我通常使用jetbrains family ide。在为函数创建文档时非常有用,只需输入 /** 如何在创建文档时创建自定义标签,例如@date标签。 最佳答案 JavaScript、Java: st
我正在尝试使用 jOpenDocument library创建文档。我已经执行了创建电子表格的示例 - 代码编译并运行正常,但当我尝试使用 Excel Office 2012 或 Google Doc
如标题。 有没有介绍HTML DOM构造的图片? 最佳答案 DOM(文档 对象模型)从文档 节点开始。它被称为“根节点”。 观察下面的树(括号中对应的nodeType): [HTMLDocument]
我喜欢 ColdFusion Builder。但我不喜欢帮助只有 CF9 文档。有什么方法可以将其更改为拥有 ColdFusion 8 文档? 最佳答案 http://livedocs.adobe.c
这个问题在这里已经有了答案: What is the consequence of this bit of javascript? (4 个答案) 关闭 9 年前。 我看到一些 jQuery 脚本嵌
我有一个 XML 文件,其中包含需要在 Word 文档中填充的数据。 我需要找到一种方法来定义一个模板,该模板可用作从 XML 文件填充数据并创建输出文档的基线。 我相信有两种方法可以做到这一点。 创
我正在尝试查找有关如何使用 AVAudioEngine 的详细文档。有谁知道我在哪里可以找到它? 我找到了这个,但与文档丰富的 UI 内容相比,它似乎非常简陋。 https://developer.a
我对 Tensorflow 文档越来越感到恼火和沮丧。我在谷歌上搜索了有关 的文档 tf.reshape 我被定向到一个通用页面,例如 here 。我想查看 tf.reshape 的详细信息,而不是整
我正在学习本教程:http://moxleystratton.com/clojure/clojure-tutorial-for-the-non-lisp-programmer 然后遇到了这个片段: u
如何在 swagger 中为对象数组编写文档。这是我的代码,但我不知道如何访问对象数组中的数据。 { "first_name":"Sam", "last_name":"Smith",
是否有针对 Javascript 的 JavaDocs 之类的东西?当我在 netbeans IDE 中按 ctrl+space 时 写javascript,指定对象的javascript文档就出来了
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我需要 JavaScript 中的 heredoc 之类的东西。你对此有什么想法吗?我需要跨浏览器功能。 我发现了这个: heredoc = '\ \ \ zzz\ \
WSDL 文档是包含一系列的,可描述某个 web service 的定义的,简单的 XML 文档 WSDL 文档结构 WSDL 文档用下表这些主要的元素来描述某个 web service 的
是否有 ocropus 的文档? 我正在寻找对以下功能的解释: make_SegmentPageByRAST(): segment() RegionExtractor(): setPageLines(
这个问题在这里已经有了答案: Understanding events and event handlers in C# (13 个回答) 4年前关闭。 我正在使用 NRECO 和 ffmpeg 对视
我正在尝试访问工作服务器以与名为 Spotfire 的应用程序一起使用。我的同事把这个传给我,现在已经休息了几个星期,我对他的建议有意见。 实际上,当我通过 localhost 运行我的 Web 应用
Elm 文档没有给出示例用法,因此很难理解类型规范的含义。在几个地方,我看到“a”用作参数标识符,例如 Platform.Cmd : map : (a -> msg) -> Cmd a -> Cmd
我是一名优秀的程序员,十分优秀!