JAVA源码分析Collection之Map
2017-01-25 19:59
447 查看
Map的底层实现:LinkedList数组,一个非常大的数组,LinkedList中存储的是MyEntry对象(包括key和value属性的对象),因为要保证map中的查询速度比较快,是基于散列算法来实现的,散列的主要实现是依靠hashcode方法。hashcode的产生是基于,内存地址产生的,保证产生的每一个hashcode都是唯一的,其实这种算法有点类似于桶排序。就是一种牺牲空间,从而来换取时间的算法。
MyEntry类主要是一个key、value的对象package com.xl.realizeMap;
public class MyEntry {
private Object key;
private Object value;
public Object getKey() {
return key;
}
public void setKey(Object key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
HashMap类的put和get方法
package com.xl.realizeMap;
import com.xl.realizeLinkedList.XLLinkedList;
public class XLMap {
//开始定义一个非常大的LinkedList数组
XLLinkedList[] list = new XLLinkedList[999];
/**
* put(Object key,Object value)根据键和值来新增对象
* 实现的主要思想:
* 1、根据key来产生一个hashcode
* 2、对产生的hashcode进行取余,保证产生的index在数组范围内
* 3、将对应的value存储到index对应的LinkedList数组中
* 4、当,进行取值的时候,先根据key来产生一个hashcode,因为如果key相同
* 产生的hashcode也是一样的
* 5、如果,LinkedList中有多个元素的时候,使用equals方法进行查找到
* 对应的key,从而得到value
*
*/
public void put(Object key,Object value){
MyEntry myEntry = new MyEntry();
myEntry.setKey(key);
myEntry.setValue(value);
//根据key来计算hashcode,因为hashcode有可能为负数
//所以,如果计算出来的hashcode为负数的话要进行取反
int code = key.hashCode() < 0 ? -key.hashCode() : key.hashCode();
//index为根据key产生的hashcode根据数组的长度来取余,
//取余的目的:保证产生的index在数组的范围内,不会导致数组越界异常
int index = code%list.length;
//如果,新增的元素为第一个,初始化LinkedList
if(list[index] == null){
XLLinkedList linkedList = new XLLinkedList();
linkedList.add(myEntry);
list[index] = linkedList;
}else{
for(int i = 0;i < list[index].size();i++){
MyEntry temp = (MyEntry) list[index].get(i);
//判断是否为同一个key,如果是则进行覆盖值
if(temp.getKey().equals(key)){
temp.setValue(value);
return;
}
}
//如果,新增的元素原来的LinkedList中没有,则直接添加
list[index].add(myEntry);
}
}
/**
* get(Object key)根据key来得到value
*/
public Object get(Object key){
//采用与put中相同的算法来获取index
int index = key.hashCode()%list.length;
if(list[index] != null){
XLLinkedList xlList = list[index];
for(int i = 0;i < xlList.size();i++){
MyEntry entry = (MyEntry) xlList.get(i);
if(entry.getKey().equals(key)){
return entry.getValue();
}
}
}
return null;
}
}
MyEntry类主要是一个key、value的对象package com.xl.realizeMap;
public class MyEntry {
private Object key;
private Object value;
public Object getKey() {
return key;
}
public void setKey(Object key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
HashMap类的put和get方法
package com.xl.realizeMap;
import com.xl.realizeLinkedList.XLLinkedList;
public class XLMap {
//开始定义一个非常大的LinkedList数组
XLLinkedList[] list = new XLLinkedList[999];
/**
* put(Object key,Object value)根据键和值来新增对象
* 实现的主要思想:
* 1、根据key来产生一个hashcode
* 2、对产生的hashcode进行取余,保证产生的index在数组范围内
* 3、将对应的value存储到index对应的LinkedList数组中
* 4、当,进行取值的时候,先根据key来产生一个hashcode,因为如果key相同
* 产生的hashcode也是一样的
* 5、如果,LinkedList中有多个元素的时候,使用equals方法进行查找到
* 对应的key,从而得到value
*
*/
public void put(Object key,Object value){
MyEntry myEntry = new MyEntry();
myEntry.setKey(key);
myEntry.setValue(value);
//根据key来计算hashcode,因为hashcode有可能为负数
//所以,如果计算出来的hashcode为负数的话要进行取反
int code = key.hashCode() < 0 ? -key.hashCode() : key.hashCode();
//index为根据key产生的hashcode根据数组的长度来取余,
//取余的目的:保证产生的index在数组的范围内,不会导致数组越界异常
int index = code%list.length;
//如果,新增的元素为第一个,初始化LinkedList
if(list[index] == null){
XLLinkedList linkedList = new XLLinkedList();
linkedList.add(myEntry);
list[index] = linkedList;
}else{
for(int i = 0;i < list[index].size();i++){
MyEntry temp = (MyEntry) list[index].get(i);
//判断是否为同一个key,如果是则进行覆盖值
if(temp.getKey().equals(key)){
temp.setValue(value);
return;
}
}
//如果,新增的元素原来的LinkedList中没有,则直接添加
list[index].add(myEntry);
}
}
/**
* get(Object key)根据key来得到value
*/
public Object get(Object key){
//采用与put中相同的算法来获取index
int index = key.hashCode()%list.length;
if(list[index] != null){
XLLinkedList xlList = list[index];
for(int i = 0;i < xlList.size();i++){
MyEntry entry = (MyEntry) xlList.get(i);
if(entry.getKey().equals(key)){
return entry.getValue();
}
}
}
return null;
}
}
相关文章推荐
- Java-Collection源码分析(十二)——SortedMap和NavigableMap
- 【Java】Java集合框架源码和数据结构简要分析——Set和Map
- JAVA集合源码之路-Map分析(一)
- Java-Collection源码分析(五)——AbstractSequentiaList和LinkedList
- Java-Collection源码分析(十二)——Set、AbstractSet、HashSet和LinkedHashSet
- Java-Collection源码分析(九)——WeakHashMap
- Java-Map源码分析及特性
- Java 容器源码分析之 Map
- Java-Collection源码分析(六)——Map接口
- Java-Collection源码分析(二)——Iterator和ListIterator
- Java遍历时删除List、Set、Map中的元素(源码分析)
- Java容器_Map_HashMap源码分析
- java源码分析之集合架构 Collection 02
- Java-Collection源码分析(七)——HashMap
- JAVA Collection 源码分析(二)之SubList
- Java 集合体系之 Map 源码分析
- java源码分析之集合框架SortedMap 、 NavigableMap 、Dictionary 09
- JAVA源码分析Collection之ArrayList
- Java-Collection源码分析(十)——hashTable
- Java-Collection源码分析(八)——LinkedHashMap