用于创建HashMap和TreeMap对象的不同语法

时间:2012-08-13 05:45:19

标签: java object hashmap treemap

通常,在创建对象时,前面提供了相同的类型 喜欢:

Scanner scanner = new Scanner(System.in);

但声明HashMap对象和TreeMap遵循不同的语法。

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

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

4 个答案:

答案 0 :(得分:5)

  

但声明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();
  

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

让我感到害怕......

答案 1 :(得分:2)

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

e.g。 List是一个通用接口,ArrayList实现了List,所以你可以说

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

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

答案 2 :(得分:1)

SortedMap是一个界面,因此您无法实现它。这就是为什么我们创建一个子类对象TreeMap来实现这个接口并将其分配给接口对象SortedMap,以便它可以使用子类和父类的类函数。

答案 3 :(得分:1)

您也可以声明

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

Map是一个由HashMap(和TreeMap)实现的接口。您可以将实现Map接口的任何对象分配给作为映射decalared的变量。类似于Interface 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。