- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建的以下 map 之间有什么区别(在另一个问题中,人们似乎可以互换使用它们来回答,我想知道它们是否/如何不同):
HashMap<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map = new HashMap<String, Object>();
最佳答案
对象之间没有区别;你有一个HashMap<String, Object>
在这两种情况下。对象的界面有所不同。第一种情况,接口(interface)是HashMap<String, Object>
,而第二个是 Map<String, Object>
。但底层对象是相同的。
使用 Map<String, Object>
的优势是您可以将底层对象更改为不同类型的映射,而不会破坏与使用它的任何代码的约定。如果您将其声明为 HashMap<String, Object>
,如果你想改变底层的实现,你就必须改变你的合约。
示例:假设我编写这个类:
class Foo {
private HashMap<String, Object> things;
private HashMap<String, Object> moreThings;
protected HashMap<String, Object> getThings() {
return this.things;
}
protected HashMap<String, Object> getMoreThings() {
return this.moreThings;
}
public Foo() {
this.things = new HashMap<String, Object>();
this.moreThings = new HashMap<String, Object>();
}
// ...more...
}
该类有几个字符串->对象的内部映射,它与子类共享(通过访问器方法)。假设我用 HashMap
写它首先是因为我认为这是编写类时使用的合适结构。
后来,玛丽编写了子类化它的代码。她有一些事情需要与两者一起做things
和moreThings
,所以很自然地她将其放入一个通用方法中,并且她使用了我在 getThings
上使用的相同类型。/getMoreThings
定义她的方法时:
class SpecialFoo extends Foo {
private void doSomething(HashMap<String, Object> t) {
// ...
}
public void whatever() {
this.doSomething(this.getThings());
this.doSomething(this.getMoreThings());
}
// ...more...
}
后来我决定,其实我用TreeMap
会更好。而不是HashMap
在Foo
。我更新Foo
,改变HashMap
至TreeMap
。现在,SpecialFoo
不再编译,因为我违反了契约(Contract):Foo
过去常说它提供了HashMap
s,但现在它提供 TreeMaps
反而。所以我们必须修复SpecialFoo
现在(这种事情可能会影响代码库)。
除非我有充分的理由分享我的实现是使用 HashMap
(这确实发生了),我应该做的是声明 getThings
和getMoreThings
刚回来Map<String, Object>
没有比这更具体的了。事实上,除非有充分的理由去做其他事情,即使在 Foo
范围内也是如此。我可能应该声明 things
和moreThings
如Map
,不是HashMap
/TreeMap
:
class Foo {
private Map<String, Object> things; // <== Changed
private Map<String, Object> moreThings; // <== Changed
protected Map<String, Object> getThings() { // <== Changed
return this.things;
}
protected Map<String, Object> getMoreThings() { // <== Changed
return this.moreThings;
}
public Foo() {
this.things = new HashMap<String, Object>();
this.moreThings = new HashMap<String, Object>();
}
// ...more...
}
注意我现在如何使用 Map<String, Object>
尽我所能,只有在创建实际对象时才具体。
如果我这样做,那么玛丽就会这样做:
class SpecialFoo extends Foo {
private void doSomething(Map<String, Object> t) { // <== Changed
// ...
}
public void whatever() {
this.doSomething(this.getThings());
this.doSomething(this.getMoreThings());
}
}
...并改变Foo
不会做SpecialFoo
停止编译。
接口(interface)(和基类)让我们仅展示必要的内容,从而保持我们的灵 active 以进行适当的更改。一般来说,我们希望我们的引用文献尽可能基本。如果我们不需要知道它是 HashMap
,就叫它 Map
.
这不是一个盲目的规则,但总的来说,对最通用的接口(interface)进行编码比对更具体的东西进行编码要更容易。如果我记得这一点,我就不会创建 Foo
这让玛丽注定失败 SpecialFoo
。如果玛丽记得这一点,那么即使我搞砸了Foo
,她会用 Map
声明她的私有(private)方法。而不是HashMap
和我的改变Foo
的契约(Contract)不会影响她的代码。
有时你不能这样做,有时你必须具体。但除非你有理由这样做,否则最好选择最不具体的界面。
关于java - Java 中的 HashMap 和 Map 对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50139266/
我正在尝试从一个 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 m
我是 Haskell 的新手,我认为函数 map map和 map.map在 Haskell 中是一样的。 我的终端给了我两种不同的类型, (map.map) :: (a -> b) -> [[a]
我的目标是创建一个 map 的 map ,这样我就可以通过它的键检索外部 map 的信息,然后通过它们的键访问它的“内部” map 。 但是,当我得到每个内部映射时,我最初创建的映射变成了一个对象,我
如何使用 Java8 编写以下代码? for (Entry> entry : data.entrySet()) { Map value = entry.getValue(); if (valu
我有覆盖整个南非的图片。它们为Tiff格式,并已将坐标嵌入其中。我正在尝试拍摄这些图像(大约20张图像),并将它们用作我的iPhone应用程序中的地图叠加层。我的问题在于(准确地)将地图切成图块。 我
所以我有 2 std::map s >一个是“旧的”,一个是“新的”,我想知道哪些文件被删除了,这样就能够遍历差异并对 shared_ptr 做一些事情。这样的事情可能吗?如何做到? 最佳答案 虽然
是否可以将当前查看的 google.maps.Map 转换为静态图像链接,以便我可以获取图像并将其嵌入到 PDF 中? 我在 map 上添加了一些带有自定义图标的标记,所以我不确定这是否真的可行。 如
你能帮我吗 Java Streams ? 从标题可以看出我需要合并List>>进入Map> . 列表表示为List>>看起来像: [ { "USER_1":{
对于 idAndTags 的第二个条目,内部映射被打乱,但第一个条目则不然 第一次接近! for (Map.Entry> entryOne : idAndTags.entrySet()) {
我将从我的代码开始,因为它应该更容易理解我想要做什么: @function get-color($color, $lightness) { @return map-get(map-get($col
我过去曾在许多网站上使用过 Google map ,但遇到了以前从未遇到过的问题。 map 窗口正在显示,但它只显示左上角的 map 片段,以及之后的任何内容(即使我在周围导航时),右侧也不会加载任何
众所周知,这些 map ,无论是常规街道 map 还是卫星 map ,在中国的特定地区都无法正确排列。那么哪个 map 排列正确,是卫星 map 还是默认街道 map ?一些网站表明卫星 map 是正
在拖尾事件之后,我面临着获取此处 map 中的 map 边界的问题。我需要新的经纬度来在新更改的视口(viewport)中获取一些项目/点。我只是想在拖动结束时获得谷歌地图map.getBounds(
我想做的是通过 ajax API 显示以英国邮政编码为中心的小型 bing 生成 map 。我相信这是可能的;我在 Bing map 文档中找不到如何将英国邮政编码转换为可以插入 map Ajax 控
我有一个 List我想转换成的 e Map>其中外部字符串应为“Name”,内部字符串应为“Domain”。 Name Id Domain e(0) - Emp1, 1, Insuran
我的第 2 部分:https://stackoverflow.com/questions/21780627/c-map-of-maps-typedef-doubts-queries 然后我继续创建 I
是否可以在 1 行中使用 Java8 编写以下所有 null 和空字符串检查? Map> data = new HashMap<>(holdings.rowMap()); Set>> entrySet
我正在审查一个项目的旧代码,并使用 Map 的 Map 的 Map 获得了如下数据结构(3 层 map ): // data structure Map>>> tagTree
这可能是一种不好的做法,但我还没有找到更好的解决方案来解决我的问题。所以我有这张 map // Map>> private Map>> properties; 我想初始化它,这样我就不会得到 Null
我们在 JDK 1.7 中使用 HashMap,我在使用 SonarQube 进行代码审查时遇到了一些问题。 请考虑以下示例: public class SerializationTest imple
我是一名优秀的程序员,十分优秀!