【问题标题】:Different Syntax for creating HashMap and TreeMap objects创建 HashMap 和 TreeMap 对象的不同语法
【发布时间】:2012-08-13 05:45:18
【问题描述】:

通常,当您创建一个对象时,您会在前面提供相同的类型 喜欢:

Scanner scanner = new Scanner(System.in);

但是声明一个 HashMap 对象和 TreeMap 遵循不同的语法,像这样。

Map m1 = new HashMap();
SortedMap sm = new TreeMap();

是什么原因?我问我的教授。但他不知道答案。

【问题讨论】:

  • 谢谢。立即阅读。
  • 顺便说一句,您也可以执行 `Map sm = new TreeMap()"。这表明您希望对键进行排序,但实际上不需要任何键利用这一点的方法。一个用例是,如果代码只需要放置/获取条目,但您打算以人类可读的方式将它们打印出来,这样可以方便地按顺序打印条目.

标签: java object hashmap treemap


【解决方案1】:

但是声明一个 HashMap 对象和 TreeMap 遵循不同的语法,像这样。

你没有。你可以写:

HashMap<String, Integer> map = new HashMap<String, Integer>();

...只是你通常不会。

同样你可以写:

Object scanner = new Scanner(System.in);

基本上涉及两种类型:

  • 您要声明的变量的类型
  • 您正在调用其构造函数的类型

它们不必相同,但构造的类型必须与变量类型赋值兼容。它必须是该类支持的超类或接口。仅将Map(或List 或其他)变量指定为接口类型的意义在于,大多数代码只应将其视为map/list/set/whatever。事实上,它恰好是一个 HashMap(或 ArrayList 等),这是一个实现细节。

请参阅"programming to an interface" 了解更多详情...但请注意,两种情况下的语法是相同的:

VariableType variableName = new ActualTypeBeingConstructed();

我问过我的教授。但他不知道答案。

吓到我了……

【讨论】:

  • 感谢您的回答。我现在正在看那个帖子。
【解决方案2】:

Map 是一个接口(或更通用的类)- TreeMap 是实现 Map 的东西(或更具体的类)。

例如List是一个通用接口,ArrayList实现了List所以你可以说

List<Obj> list = new ArrayList<Obj>();
// or
ArrayList<Obj> list = new ArrayList<Obj>();
// but not
ArrayList<Obj> list = new List...

如果你的教授真的不能回答这个问题,你真的需要换一个新教授了!!

【讨论】:

  • 假设科目是编程或者计算机科学什么的。如果教授。可以回答,但希望您自己找出答案:好的,我会买的。如果教授。真的无法回答,然后:不。他可能是个好人,但他不知道主题,不适合教它!
【解决方案3】:

SortedMap 是一个接口,所以你不能实例化它。这就是为什么我们创建一个子类对象TreeMap,它实现了这个接口,并将它分配给接口对象SortedMap,这样它就可以使用子类和父类的功能。

【讨论】:

  • 有趣。这就是我声明这些对象时发生的事情。谢谢。
【解决方案4】:

你也可以声明

HashMap m1 = new HashMap();
TreeMap sm = new TreeMap();

Map 是一个由 HashMap(和 TreeMap)实现的接口。您可以将任何实现 Map 接口的对象分配给声明为映射的变量。接口 TreeMap 也是如此。

在java中,你有一个类和接口的层次结构。一个类可以分配给它实现的任何接口的任何“父”类

一个更复杂的例子是 Swingclass JTextField 这里的层次结构是

Component
  Containter
     JContainer
         JTextComponent
             JTextField

所以

 Component c1 = new JTextField();
 Containter c2 = new JTextField();
 JContainer c3 = new JTextField();
 JTextComponent c4 = new JTextField();

都是完全有效的。 JTextField 是一个 JTextCompent、JContainer、Container 和 Component。

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2016-05-30
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多