JAVA源码分析Collection之Map
来源:互联网 发布:我想开个网络棋牌室 编辑:程序博客网 时间:2024/06/05 10:15
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;//如果,新增的元素为第一个,初始化LinkedListif(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中相同的算法来获取indexint 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;}}
0 0
- JAVA源码分析Collection之Map
- JAVA源码分析Collection之ArrayList
- JAVA源码分析Collection之LinkedList
- Java-Collection源码分析(六)——Map接口
- jdk源码分析之Collection
- 源码分析-java-collection接口
- java源码分析之集合架构 Collection 02
- JAVA Map 源码分析
- Java集合Collection和Map分析解读
- Java学习笔记之集合Collection&Map
- Java集合之Collection和Map
- java集合之Collection---set/map/list
- JDK源码阅读之Collection分析
- java collection——源码分析
- Map之HashMap源码分析
- Map之hashmap源码分析
- Java集合框架之Map---HashMap和LinkedHashMap源码分析
- Java集合框架之Map--Hashtable和Properties源码分析
- laravel5.2学习笔记一:配置
- 算法竞赛
- hibernate 遇到的问题
- 2017寒假测试
- 三星高层正面回应 Note7爆炸事件,表态将加强后续产品安全管理
- JAVA源码分析Collection之Map
- 关于Java的语言问题汇总
- 9.3.6
- 【Android基础】RecyclerView的设计艺术
- 博为峰Java技术文章 ——JavaSE Swing JPanel II
- truncate 和 delete的区别
- Qt学习笔记-----QListWidget,QTableWidget和QTreeWidget
- 实践SEH攻击和虚函数攻击
- CF 238D Tape Programming