我只是意识到编译器允许以多种方式定义映射。这些声明之间有区别吗,哪种是“正确”的方式:
Map<String, String> data = new HashMap<String, String>();
Map<String, String> data = new HashMap<>();
Map<String, String> data = new HashMap();
地图
要回答你的问题,请始终使用选项1或选项2,因为你会获得更强的类型安全性。选项三只是一种过时且危险的方式,可能会导致错误,因为您可以声明如下内容:
HashMap mixedMap = new HashMap();
mixedMap.put("bla", 20);
// Add further elements...
HashMap<String, String> map = new HashMap(mixedMap);
这只起作用,因为Java类型擦除。在运行时,
混合地图
和map
都被视为HashMap
那么,如果第三种选择有负面影响,为什么它仍然是可能的呢?答案是Java设计人员决定保持向后兼容性,因此他们不得不使用类型擦除,不幸的是,这允许使用与类型安全有关的关键代码。
Map<K, V> m = new HashMap();
这是初始化m
最糟糕的方法HashMap
这里是一个原始类型,这意味着它忽略所有通用数据。它被强制转换为Map
Map<String, String> m;
Map<Int, Int> m2 = new HashMap(m); // no error
原始类型的存在是为了与旧的Java 5之前的代码进行互操作,而在旧代码中不存在泛型。所有泛型类型都被视为它们的擦除。因此,原始
HashMap
构造函数不再采用映射
永远不要这样做。
Map<K, V> m = new HashMap<K, V>();
这是Java 7之前初始化泛型类型的方法。由于
HashMap
构造函数是通过类型参数传递的,因此它比第三种方法安全得多。通用信息现在被充分利用,一切都是类型安全的。这比第三种方法好得多,但如果可以的话,你也可以用第二种方法。
Map<K, V> m = new HashMap<>();
这是Java7中介绍的初始化泛型类型的新方法,也是最好的方法。这与第一种方法相同,只是因为在声明的左右两侧写出相同的类型参数很痛苦,所以右侧可以省略类型参数。<代码>
第二种方法是使用Java 7,第二种方法是不使用Java 7,第三种方法太邪恶了,根本不考虑使用Java 7。
%1有编译器错误,而%2是合法的。 为什么变量声明的类型必须与我们传递给对象类型的类型匹配(不允许派生类型)?我使用的数组如下所示,这是完全正确的: 有人能告诉我为什么集合必须声明为条件2吗?谢谢
问题内容: “ Prepared Statement”是Statement的稍强版本,并且应始终至少与Statement一样快捷且易于处理。 准备好的语句可能已参数化 大多数关系数据库通过四个步骤来处理JDBC / SQL查询: 解析传入的SQL查询 编译SQL查询 规划/优化数据采集路径 执行优化的查询/获取并返回数据 对于发送到数据库的每个SQL查询,一个Statement将始终执行上述四个步
当我在Spark中使用数据帧时,有时我必须只编辑该数据帧中特定列的值。例如,如果我的数据帧中有一个字段,如果我想将添加到的每个值中,那么我可以编写一个自定义udf,使用数据帧的功能来完成工作,或者我可以在数据帧上做一个,然后从生成的RDD中提取另一个数据帧。 我想知道的是udf在引擎盖下是如何工作的。在这种情况下,请给我一个使用map/udf的比较。性能有什么不同? 谢谢
问题内容: JUnit框架包含2个类(显然是在不同的包中),每个类的方法似乎非常相似。有人可以解释为什么吗? 我要参考的类是:和。 问题答案: (JUnit 3的)旧方法是通过扩展标记测试类。那继承了它自己,并且您的测试类获得了以这种方式调用assert方法的能力。 从JUnit版本4开始,该框架用于标记测试。因此,您不再需要扩展。但这意味着,断言方法不可用。但是您可以静态导入新类。这就是为什么新
问题内容: 我无法理解RxSwift中map和flatMap之间的区别。在RxSwift游乐场示例和书籍中,flatMap用作转换具有内部Observable属性的Observables。 但是我看到flatMap直接用于基本类型的Observable。例如,下面的代码,它们都产生相同的输出。有人可以帮助我了解map和flatMap之间的区别吗 问题答案: flatMap 与 map 相似,但是它
本文向大家介绍Java中定义和声明之间的区别。,包括了Java中定义和声明之间的区别。的使用技巧和注意事项,需要的朋友参考一下 对于定义和声明之间的区别,应该首先考虑其字面含义,其中包括声明或声明的“声明”方法,而描述某些实体的“定义”方法。 以下是定义和声明之间的重要区别。 序号 键 声明 定义 1 概念 声明的概念包括通知编译器有关变量的属性,例如变量的名称,其持有的值的类型以及初始值(如果有