-
Map和HashMap问题5
Map<String, Object> map=new HashMap();和 HashMap<String, Object> map=new HashMap();
本质区别是什么?会有什么不同。有什么影响?求大神明解。。2014年7月08日 15:45
5个答案 按时间排序 按投票排序
-
本质区别在于封装性,实际上事情并没有题主说的那么绝对,先说为什么这样做:
原因:使用一个对象应该尽可能提供一个窄的接口,而不是宽接口,比如告诉别人:我只是一个Map,并不一定是一个HashMap,这样做的好处是:
. 有一天你发现其实使用ConcurrentHashMap更好,那么只需要初始化的时候做修改就好了,引用的地方是不需要修改的;
. 防止使用者调用不必要的方法:比如HashMap里面有一个方法叫做f(只是举例子,实际上没有这个方法),你不希望f被使用者调用,或者不必要让使用者调用,那么给一个Map就是比较好的选择,否则使用者看到”哦,还有一个f可以调用哦,可能真的会去调用了。
例外:技术层面的东东往往没有绝对的好与坏,比如下面的场景,实际上使用后一种方法也可以,甚至更好:
A Map作为局部变量,二者差别其实是很小的,声明成为HashMap也可以的;
B 使用者确实需要使用到f方法,但是给定的是Map接口,他发现“哦,实际上是一个HashMap呀”,那好,使用者会这样做 ((HashMap)map).f();,这样下来你提供的窄接口实际上就没有意义了,这种情况下我认为其实后面一种做法更好:即明确的告诉其他人,我就是一个HashMap,不会是一个Hashtable!2014年7月09日 09:31
-
楼下那个长答案有点过分了额,ListArray........
从面试题角度回答,这体现了java的多态。但是不用想太复杂,在绝大多数实际应用中,两者没有区别,前者流行更多是因为老师这么交的,习惯了,字母少一点。。
如果真要凑一个场景说明一定要map而不是hashmap,就是你设计一个方法,返回值是假定你写成了HashMap,现在有个需求需要你另一种实现,返回的可能是另一种map的子类,也许是为了排序的特性,也许是为了别的原因,这时候返回类型当然是写map咯,而上层调用者无需知道你是具体哪个类型map,拿来直接做执行一个通有的方法。这就是多态。2014年7月09日 00:46
-
以前在网上看到大神总结过,本人记了下来,你可以参考下:
List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。
所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。
List list; //正确 list=null;
List list=new List(); // 是错误的用法
List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
这是一个例子:import java.util.*; public class TestList{ public static void main(String[] args){ List list = new ArrayList(); ArrayList arrayList = new ArrayList(); list.trimToSize(); //错误,没有该方法。 arrayList.trimToSize(); //ArrayList里有该方法。 } }
编译一下就知道结果了。
如果这个样子:
List a=new ArrayList();
则a拥有List与ArrayList的所有属性和方法,不会减少
如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),
则a.i是调用了List中的i
a.f()是调用了ArrayList中的f();2014年7月08日 18:40
-
Map是接口,HashMap是接口Map的实现类,体现了面向接口编程
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
2014年7月08日 15:52
相关推荐
在 Java 中,HashMap、LinkedHashMap、TreeMap 都实现了 Map 接口,都是 Map 的子类,每个子类都有其特点和使用场景。 HashMap HashMap 是最常用的 Map 实现类,它根据键的哈希码值存储数据,能够快速地存储和获取...
《java编程思想》,Map结合HashMap获取键相关联的值
在Java编程中,Map接口是用于存储键值对的数据结构,而Java提供了多种Map的实现,包括TreeMap、HashMap和ConcurrentSkipListMap。本文主要比较了这三种Map的性能,尤其是在插入和查找操作上的效率。 1. **TreeMap**...
- **存储方式**:`List`接口的实现(如`ArrayList`和`Vector`)是有序的,而`Map`接口的实现(如`HashTable`和`HashMap`)是键值对形式,通过键来查找值。 - **数据访问**:`ArrayList`和`Vector`支持通过索引访问...
不过,`HashMap` 的同步问题可以通过 `Collections.synchronizedMap()` 方法得到解决,该方法可以将 `HashMap` 包装成一个线程安全的 `Map` 实例。 #### 三、null 值处理 - **HashMap**:允许使用 `null` 键和 `...
为了在多线程环境中安全地使用`HashMap`,开发者需要自己负责同步,例如使用`Collections.synchronizedMap(new HashMap,V>())`创建线程安全的`HashMap`实例。 #### 2. 允许null值 - **HashTable**: 不支持`null`键...
HashMap和Hashtable是两种常用的Map实现类。HashMap是一个非同步的Map实现类,它允许null,即null value和null key。Hashtable是一个同步的Map实现类,它不允许null。 List、ArrayList、Vector及map、HashTable、...
1. 使用Collections.synchronizedMap():Java提供了一个便捷的方法,通过Collections.synchronizedMap()可以将HashMap转换为线程安全的Map。但是需要注意,虽然这个方法可以保证基本的线程安全,但迭代仍然是非线程...
在Java编程语言中,`Hashtable`和`HashMap`是两种非常重要的数据结构,它们都属于`Map`接口的实现类,用于存储键值对数据。尽管两者在功能上相似,但在实际应用中却存在显著差异。 #### 1. 历史与实现基础 `...
在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程需求。本文将重点分析这三种数据结构之间的区别,特别是针对...
易语言HashMap类是一种在易语言编程环境中实现的高效数据结构,它主要用于存储键值对(key-value pairs),提供快速的数据存取。...通过深入学习和实践,开发者可以更好地利用HashMap类解决实际编程问题。
在Java编程中,HashMap是一个非常重要的数据结构,它实现了Map接口,提供了键值对的存储功能,具有快速存取和高效查找的特点。HashMap基于哈希表(也称为散列表)原理,通过键对象的哈希码来定位元素,进而实现O(1)...
为了解决这个问题,HashMap提供了自动扩容机制。 **3.1 扩容触发条件** 当HashMap中的元素数量超过容量大小与负载因子的乘积时,HashMap会自动扩容。默认负载因子为0.75,这意味着当HashMap的填充率达到75%时,会...
虽然JavaScript原生的`Map`对象提供了类似的功能,但在某些场景下,开发者可能需要自定义HashMap来满足特定的需求,例如优化性能或者实现特定的算法。本篇文章将深入探讨如何在JavaScript中实现HashMap以及如何进行...
Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...
JNI,全称Java Native Interface,是Java平台标准的一...然而,由于其涉及到多层抽象的交互,因此需要谨慎处理内存管理和类型转换,以避免潜在的问题和错误。熟练掌握JNI技术,可以极大地扩展Java应用的功能和性能。
### hashMap和hashTable的区别 #### 一、简介与基本概念 `HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在...
然而,对于多线程环境,HashMap并不是线程安全的,这在并发编程中可能会引发一系列问题。本篇将深入探讨HashMap的线程安全问题,并提供相关的解决方案。 首先,我们需要了解HashMap在多线程环境下可能出现的问题: ...
在Java编程语言中,`Hashtable`和`HashMap`是两种非常重要的数据结构,它们都实现了`Map`接口,用于存储键值对。尽管它们有着相似的功能,但在实现细节和应用场景上存在显著差异。接下来,我们将详细探讨`Hashtable`...
`HashMap`、`Hashtable`和`HashSet`都是基于`Map`或`Set`接口实现的不同数据结构,它们在功能、线程安全性和性能等方面有显著差异。 首先,`HashMap`和`Hashtable`都实现了`Map`接口,这意味着它们都可以存储键值对...