java的map和hashmap_字典 - Java中的HashMap和Map对象有什么区别?

对象之间没有区别; 在这两种情况下你都有一个TreeMap。 您对该对象的界面有所不同。 在第一种情况下,接口是HashMap,而在第二种情况下它是Foo.但底层对象是相同的。

使用TreeMap的优点是,您可以将基础对象更改为不同类型的地图,而不会破坏与使用它的任何代码的合同。 如果您将其声明为HashMap,则如果要更改基础实现,则必须更改合同。

示例:假设我写这个类:

class Foo {

private HashMap things;

private HashMap moreThings;

protected HashMap getThings() {

return this.things;

}

protected HashMap getMoreThings() {

return this.moreThings;

}

public Foo() {

this.things = new HashMap();

this.moreThings = new HashMap();

}

// ...more...

}

该类有一些string->对象的内部映射,它与子类共享(通过访问器方法)。 假设我用TreeMaps开始编写它,因为我认为这是编写类时使用的适当结构。

后来,Mary写了代码子类化它。 她有TreeMap和HashMap需要做的事情,所以很自然地她把它放在一个常用的方法中,并且她在定义她的方法时使用了我在Foo/Foo上使用的相同类型:

class SpecialFoo extends Foo {

private void doSomething(HashMap t) {

// ...

}

public void whatever() {

this.doSomething(this.getThings());

this.doSomething(this.getMoreThings());

}

// ...more...

}

后来,我决定实际上,如果我在Foo中使用TreeMap而不是HashMap更好。我更新Foo,将HashMap更改为Foo.现在,SpecialFoo不再编译,因为我违反了合同:Foo用来说它 提供了Maps,但现在提供HashMap相反。 所以我们现在必须修复Foo(这种事情可以通过代码库来解决)。

除非我有一个非常好的理由分享我的实现使用Foo(确实发生了),我应该做的是声明SpecialFoo和Foo只是返回Map而不是更具体。 事实上,除非在HashMap之内做出其他事情,否则我应该宣布Foo和moreThings为Map,而不是HashMap/TreeMap:

class Foo {

private Map things; // <== Changed

private Map moreThings; // <== Changed

protected Map getThings() { // <== Changed

return this.things;

}

protected Map getMoreThings() { // <== Changed

return this.moreThings;

}

public Foo() {

this.things = new HashMap();

this.moreThings = new HashMap();

}

// ...more...

}

请注意我现在到处都在使用Foo,仅在创建实际对象时才具体。

如果我这样做了,玛丽就会这样做:

class SpecialFoo extends Foo {

private void doSomething(Map t) { // <== Changed

// ...

}

public void whatever() {

this.doSomething(this.getThings());

this.doSomething(this.getMoreThings());

}

}

...并且更改Foo将不会使SpecialFoo停止编译。

接口(和基类)让我们尽可能多地展示,保持我们的灵活性,以便适当地进行更改。 一般来说,我们希望我们的参考资料尽可能基本。 如果我们不需要知道它是Foo,请将其命名为SpecialFoo。

这不是一个盲目的规则,但一般来说,编码到最通用的界面将比编写更具体的东西更不脆弱。 如果我记得那个,我就不会创建一个Foo,让玛丽失败了SpecialFoo.如果玛丽记得那个,那么即使我搞砸了Foo,她也会用Map而不是HashMap宣布她的私人方法 而我的更改Foo的合同不会影响她的代码。

有时你不能这样做,有时你必须具体。 但除非你有理由这样做,否则最不具体的界面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值