码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap的接口原理和遍历方式

时间:2015-05-14 18:52:18      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:hashmap   线程   hashcode   链表   遍历   

出于一些原因不得不重视java基础,这HashMap还是有些纠结,先将理解一部分写上,之后再继续研究!

1、HashMap概述:

HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

2、HashMap的数据结构:

在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

技术分享

Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.

数据结构原理讲解:

数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。

链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。

(1) 从逻辑结构角度来看
   a, 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
   b,链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
  (2)从内存存储角度来看
   a,(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
   b, 链表从堆中分配空间, 自由度大但申请管理比较麻烦.

HashMap遍历方式:

package dome01;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class User {
	String name;
	String sex;
	public User(String name,String sex){
		super();
		this.name = name;
		this.sex = sex;
	}
	@Override
	public String toString(){
		return "User [name="+name+",sex="+sex+"]";
	}
	
}
 public class HashMapDome{
	 public static void main(String[] args){
		 HashMap<Integer,User> maps = new HashMap<Integer,User>();
		 maps.put(1, new User("小明","男"));
		 maps.put(2, new User("小红","女"));
		 maps.put(3, new User("小张","男"));
		 System.out.println(maps.containsKey(1));
		 System.out.println("=====================================================");
		 //第一种遍历方式
		 Set<Integer> keys = maps.keySet();
		 Iterator<Integer> it = keys.iterator();
		 while(it.hasNext()){
			 Integer key = it.next();
			 User entity = maps.get(key);
			 System.out.println(key+"==========="+entity.toString());
			 
		 }
		 System.out.println("=====================================================");
		 //第二种遍历方式
		 Set<Map.Entry<Integer, User>> entities = maps.entrySet();
		 Iterator<Map.Entry<Integer,User>> its = entities.iterator();
		 while(its.hasNext()){
			 Map.Entry<Integer, User> entry = its.next();
			 System.out.println(entry.getKey()+"==========="+entry.getValue().toString());
		 }
	 }
	 
 }






HashMap的接口原理和遍历方式

标签:hashmap   线程   hashcode   链表   遍历   

原文地址:http://blog.csdn.net/qq_16872369/article/details/45722251

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!