出于一些原因不得不重视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, 链表从堆中分配空间, 自由度大但申请管理比较麻烦.
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()); } } }
原文地址:http://blog.csdn.net/qq_16872369/article/details/45722251