javahashmap
A. 在java中Map和HashMap有什么区别
HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题。
这篇文章中,我们不仅将会看到HashMap和Hashtable的区别,还将看到它们之间的相似之处。
HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
1. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
2. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出,但迭代器本身的remove()方法移除元素则不会抛出异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。
要注意的一些重要术语:
1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。
2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。
3) 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。
我们能否让HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
结论
Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。
我有一个微信公众号,经常会分享一些Java技术相关的干货。
如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。
B. JAVA hashmap的用法
已经给楼主写了个例子..
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
public class HashMapTest {
public static void main(String[] args){
HashMap<String,Object> hm=new HashMap<String,Object>();
People p1=new People();
People p2=new People();
People p3=new People();
People p4=new People();
hm.put("People3", p1);
hm.put("People1", p2);
hm.put("People4", p3);
hm.put("People2", p4);
Iterator<String> it=hm.keySet().iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class People {
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
运行了没问题..
祝楼主早日成功!
C. Hashmap在java中的作用
HashMap实现了Map接口,该接口的作用主要是为客户提供三种方式的数据显示:只查看keys列表;只查看values列表,或以key-value形式成对查看。Map接口并没有定义数据要如何存储,也没有指定如何判定key是一样,因此并不是所有的Map实现都会与hashCode方法扯上关系,如TreeMap便是要求对象实现Comparator接口,通过其compare方法来比对两者是否一致,而非hashCode及equals。同理,如果我们自己实现Map接口,我们也可以直接使用数组进行数据存储使用==判定key值是否一致,依然可以完全满足Map接口的定义。
D. java中Hashmap的get方法
map中存储的是键值对,也就是说通过set方法进行参数和值的存储,之后通过get“键”的形式进专行值的读取属。举例:
Map map = new Hashmap();//创建一个map
map.put("key","value");//给map赋值
String vlaues = map.get("key");//获取map中键值为“key”的值
system.out.println(vlaues );//输出结果
以上代码的运行结果:value;
备注:map中可以存放是字符串,也可以存放的是对象,这个根据实际需要进行调整即可,也可以通过”<T>“的形式来进行对象转换,这个在特定场景下进行特定转换即可。
E. java中map与hashmap的区别
map是一个接口
hashmap是一个实现了map接口的类
接口不能new
F. java 为什么使用hashmap
首先当我们需要存储数据的时候,动态数组虽然能够自动扩容,但是必须在初始时刻指定初始容量。而对于那些在编译时无法确定具体的数量即动态增长的数据,就需要用到Java集合类了。对于ArrayList 和 LinkedList,还有 Vector它们都有一些缺点,要么插入删除速度慢、要么就是遍历速度慢。那么有没有一种插入、删除、遍历都比较不错的集合类呢?于是 HashMap 就出现了。HashMap 是一个散列表,它存储的是一组键值对(key-value)的集合,并实现快速的查找。
(1)为了实现快速查找,HashMap 选择了数组而不是链表。以利用数组的索引实现 O(1) 复杂度的查找效率。
(2)为了利用索引查找,HashMap 引入 Hash 算法, 将 key 映射成数组下标: key -> Index。
(3)引入 Hash 算法又导致了 Hash 冲突。为了解决 Hash 冲突,HashMap 采用链地址法,在冲突位置转为使用链表存储。
(4)链表存储过多的节点又导致了在链表上节点的查找性能的恶化。为了优化查找性能,HashMap 在链表长度超过 8 之后转而将链表转变成红黑树,以将 O(n) 复杂度的查找效率提升至 O(log n)。
【综上】
HashMap 存在的意义就是实现一种快速的查找并且插入、删除性能都不错的一种 K/V(key/value)数据结构。
附上一位博主的高见:网页链接
G. java中实现一个简单HashMap(就是自己写一个简单的,不要太复杂);
Hashmap这个结构,是从一个key到一个value的映射的集合,其中的hash是指用hash数组(也就是散列内表)来存放value集合。
实现思路上容,通过key的hashcode来确定value存储的位置,遇到冲突的位置就通过某个规则找下一个位置。
实现的简述:
1. value数组,Object[] values;
2. key,Object key,可能要考虑hashcode方法和equals方法的重写;
3. 冲突解决规则,下一个位置=(该位置*2+123)% values.size();
需要注意的是,values存的元素不是一个value而已,还要保留用来确定位置的hashcode值,因为在冲突的时候,Hashmap的get(key)方法需要比较hashcode来确定是不是key对应的value。
更好的办法,是values存一个链表,冲突的元素都放在链表里,在get(key)的时候遍历这个链表来获得value。再细节的东西,自己想想吧,这个写起来也不算复杂,可以动手试试。
H. java中的HashMap类是做什么用的
java中HashMap类是用来存储具有键值对特征的数据。例如现在需要按照员工号来存储大量的员工信息,那么就可以使用HashMap,将员工号作为键,员工对象作为值来存储到HashMap中,其中使用HashMap时需要注意,HashMap是线程不同步的,多线程使用时,需要注意;并且HashMap允许null值作为键和值。
I. java 迭代hashmap有几种
HashMap<String,String>emails=newHashMap<String,String>();
//方法一:用entrySet()
Iteratorit=emails.entrySet().iterator();
while(it.hasNext()){
Map.Entrym=(Map.Entry)it.next();
System.out.println("email-"+m.getKey()+":"+m.getValue());
}
//方法二:直接再循环中
for(Map.Entry<String,String>m:emails.entrySet()){
System.out.println("email-"+m.getKey()+":"+m.getValue());
}
//方法三:用keySet()
Iteratorit=emails.keySet().iterator();
while(it.hasNext()){
Stringkey=(String)it.next();
System.out.println("email-"+key+":"+emails.get(key));
}