- 浏览: 109629 次
- 性别:
- 来自: 江西
文章分类
- 全部博客 (79)
- java (8)
- java虚拟机 (3)
- 学习类 (4)
- Java SE (26)
- java引用 (1)
- 工作总结。 (2)
- JSF (1)
- 软件架构 (1)
- Javascript (10)
- struts2 (1)
- eclipse (1)
- mysql (1)
- ArcGis (4)
- dojo (1)
- Extjs (1)
- jquery (4)
- 软件包 (1)
- 控件 (1)
- tuijian (0)
- 命令 (1)
- JAVAEE (1)
- goagent教程详细版猫理会 (0)
- python (0)
- tomcat (1)
- eclipse 出 can not create virtual machine (1)
- spring (3)
- 设计模式 (3)
- hibernate (1)
- dd (0)
- 样式 (0)
- http://blog.csdn.net/wisgood/article/details/11762427 (0)
最新评论
-
bz5011:
node.eachChild() 要延迟,等node.expa ...
EXTJS学习笔记----EXTJs中带复选框的tree,选中父节点时所有子节点也被选中 -
hvang1988:
[img][/img][url][/url][flash= ...
jquey 取值 -
xiaguangme:
写的很不错
java需要关注的知识点---HashMap -
perfect613:
sinly 写道perfect613 写道你好,有个问题请教一 ...
JS动态创建表格,动态设置属性,动态添加事件 . -
aiyingpower:
把哥的代码拿过来也不注明一下?
arcgis地图————————基础操作
做了两年的java,感觉技术上没多大提升,特别是呆了一年外企,整理感觉自己都萎靡,不爱学习!
所以,写个帖子记下在网上看到的东西以及自己要去学习的内容!
努力奋斗!
1.HashMap的实现--------------------<在看>
1.1 HashMap 的默认size是16,默认临界值是 12,默认的基数0.75。
1.2 HashMap 的最大size是1<<30
1.3 HashMap 中 transfer方法理解:
void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; for (int j = 0; j < src.length; j++) { Entry<K,V> e = src[j];//标记1 if (e != null) { src[j] = null;//标记2 do { Entry<K,V> next = e.next;//标记3 int i = indexFor(e.hash, newCapacity);//标记4 e.next = newTable[i];//标记5 newTable[i] = e;//标记6 e = next;//标记7 } while (e != null); } } }
标记1:从Entry 数组中获取到 oldTable中需要往newTable 插入的entry实例e。
标记2:回收oldTable的内存。
标记3:使用临时变量存储e.next的值,以便下次获取链表的下个需要遍历的值,直到e.next的值为空。
标记4:根据e的hash值和新表中的容量计算e需要放置在新数组中的index值。
标记5:把新数组index位置的值传递给e.next.
标记6:把e放置在新数组index的位置下。
标记7:重新设置e的值,把老数组e的next值传递给e.继续下一轮循环,直到e的next为空。
1.4 HashMap 中 put 方法:
public V put(K key, V value) { if (key == null) return putForNullKey(value); //根据hash算法获取需要插入数据的hash值 int hash = hash(key.hashCode()); //根据hash值,计算将要插入数组的index值 int i = indexFor(hash, table.length); //如果该index下,存在链表值,遍历该链表,对比 //链表中的每一个entry的实例的hash值和key //是否和需要插入的key和key的hash值相同。 //如果相同:跟新原entry下的value;保持key,index和hash值不 //变。 //如果不相同:把新纪录插入到数组中。 for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
1.5 HashMap中的addEntry方法:
void addEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<K,V>(hash, key, value, e); //如果数组table的长度大于临界值,将table进行扩容,长度为原来的 //两倍。 if (size++ >= threshold) resize(2 * table.length); }
1.6 HashMap中的静态内部类Entry:
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; final int hash; /** * h:新创建的entry实例的hash值。 * k:键值 * v:值 * n:链表中但前entry实例的下一个entry的值。 */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } public final K getKey() { return key; } public final V getValue() { return value; } public final V setValue(V newValue) { V oldValue = value; value = newValue; return oldValue; } public final boolean equals(Object o) { if (!(o instanceof Map.Entry)) return false; Map.Entry e = (Map.Entry)o; Object k1 = getKey(); Object k2 = e.getKey(); if (k1 == k2 || (k1 != null && k1.equals(k2))) { Object v1 = getValue(); Object v2 = e.getValue(); if (v1 == v2 || (v1 != null && v1.equals(v2))) return true; } return false; } public final int hashCode() { return (key==null ? 0 : key.hashCode()) ^ (value==null ? 0 : value.hashCode()); } public final String toString() { return getKey() + "=" + getValue(); } void recordAccess(HashMap<K,V> m) { } void recordRemoval(HashMap<K,V> m) { } }
1.7 HashMap中的remove()方法:
final Entry<K,V> removeEntryForKey(Object key) { //获取hash值,如果key是null,hash值为0. int hash = (key == null) ? 0 : hash(key.hashCode()); //获取该key的下标值。 int i = indexFor(hash, table.length); Entry<K,V> prev = table[i]; Entry<K,V> e = prev; while (e != null) { Entry<K,V> next = e.next; Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { modCount++; size--; if (prev == e) //移动数组,用需要删除数组后一位置的值覆盖当前位置 table[i] = next; else //把需要删除的值,用当前链表中的下一个值 //进行覆盖,依次用下一个覆盖上一个,直到 //需要删除纪录后的每一数据都向前移动一位。 prev.next = next; e.recordRemoval(this); return e; } prev = e; e = next; } return e; }
有代码可得知:hashmap的删除不知是单单的把需要删除的纪录内存释放(设置为null)。而是
移动需要删除纪录后的每一个元素来覆盖前元素,释放最后一个值。
1.8 HashMap 中的get()方法:
public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; }
从上面代码可以得知,当key为空的时候,hashmap从table[0]的位置获取专门存取null键的位置获取值,key不为空的时候,根据传入key的hash值,获取index值(数组下标),然后 遍历该index下的entry链表,比对该hash值下所有的key,如果有key和传入的key相同,
获取该key下的value.
1.9 HashMap的结构图(见附件)
[img]
[/img]
发表评论
-
日志记录工具类
2012-11-09 15:51 1987import org.apache.log4j.Log ... -
重入锁
2012-02-08 14:18 1154重入锁(ReentrantLock)是一种递归无阻塞的同步机制 ... -
java需要关注的知识点---并发之加入一个新线程
2012-01-03 11:29 876package com.thread; public ... -
java需要关注的知识点---并发之后台线程
2011-12-30 16:07 904所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的线 ... -
java需要关注的知识点---并发之从任务中产生返回值
2011-12-29 16:04 705class TaskWithResult implemen ... -
java需要关注的知识点---并发之使用Executor
2011-12-29 16:00 948public class CachedthreadPool ... -
java需要关注的知识点---并发之定义任务
2011-12-29 12:53 7761:定义任务: public class LiftOff ... -
java需要关注的知识点---I0之XML的生成
2011-12-27 17:47 916package com.io; import java. ... -
java需要关注的知识点---I0之对象序列化
2011-12-27 10:59 9531。对象序列化: 序列化是什么: 序列化就是将一个对象的状 ... -
java需要关注的知识点---I0之压缩
2011-12-26 15:38 8961.GZIP压缩: public class GZIPPc ... -
java需要关注的知识点--新I0(NIO)之大文件读取
2011-12-22 14:43 2841在读取大文件的时候,采用管道方式进行分流,使用byteBuff ... -
java需要关注的知识点---Charset
2011-12-21 10:25 8481.Charset 名称必须以字母或数字开头。空字符串不是合法 ... -
java需要关注的知识点---I0之获取特殊属性
2011-12-20 17:51 7261.获取文本的编码方式: String encoding ... -
java需要关注的知识点---I0之新IO(NI0)
2011-12-20 15:40 1180缓冲器操纵数据: ByteBuffer是数据移进移出通道的唯一 ... -
java需要关注的知识点---标准I0流
2011-12-20 11:16 679System.in public class System ... -
java需要关注的知识点---IO流
2011-12-16 17:06 8781.无论何时使用readLine(). ... -
TreeeMap的底层实现
2011-11-28 17:46 1099treeMap插入元素的图解法: 插入前: 插入过程: ... -
java需要关注的知识点---HashSet
2011-11-28 15:20 10041.构造方法: public HashSet() { ... -
java需要关注的知识点---Vector
2011-11-24 17:53 9991.默认初始大小 10. 2.Vector是一个object数 ... -
java需要关注的知识点---LinkedList
2011-11-24 10:19 3217LinkedList是采用双向链表来存储数据: Linked ...
相关推荐
HashMap知识点整理,分条列点,详述hashmap的实现原理
介绍一下putVal()的5个参数:hash,hash值,就是通过这个值确定键值对放在数组哪个位置,公式是(数组长度-1)&hash。onlyIfAbsent,
提供了20道高难度的Java HashMap面试题及详细答案解析,涵盖了HashMap的内部实现原理、哈希冲突处理、扩容机制、线程安全性等方面的知识点,适合准备Java面试的开发者参考。
Java 基础常见知识点&面试题总结(上) Java 基础常见知识点&面试题总结(中) Java 基础常见知识点&面试题总结(下) 重要知识点详解 : 为什么 Java 中只有值传递? Java 序列化详解 泛型&通配符详解 Java 反射机制详解...
Java 基础常见知识点&面试题总结(上) Java 基础常见知识点&面试题总结(中) Java 基础常见知识点&面试题总结(下) 重要知识点详解: 为什么 Java 中只有值传递? Java 序列化详解 泛型&通配符详解 Java 反射机制详解 ...
记录一下java学习过程的重要知识点 1.在java中如果被除数或者除数有一个为浮点类型,0或者0.0是可以用作除数的,结果得正负无穷;取余操作亦是如此。 2.java在7.0之后switch语句case后面支持String类型。 3.java嵌套...
虽然JAVASE看完了,但仔细一想,好像有很多似懂非懂的知识点,好像会,但仔细一想,却不会。 因此重修JAVA 着重看集合,IO,多线程 泛型例子-->来自java编程思想--P397 Holder.java CovariantArrays.java ...
随着Java学习的不断深入,发现很多知识在脑海里都是一个个碎片,建此仓库的目的希望把零碎的知识点都整合起来,提高自己的学习效率。欢迎志同道合的朋友,一起来维护该仓库 目录 网络基础 WEB TCP协议 HTTP/HTTPS ...
java进阶知识点 目录 网络知识 关系型数据库 缓存知识考点 Linux JVM GC 消息队列 Java常用类库 Spring 分布式架构 多线程 实用tips 网络知识 TCP的三次握手 TCP是属于传输层的协议,抓包的工具Wireshark 三次握手的...
java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集: JAVA核心知识点整理-282页 Java与哈希算法.docx Java中Lambda表达式的使用.docx JAVA多线程之线程间的通信方式.docx Java注解详解.docx ...
Java面试题20.jsp和Servlet的相同点和不同点 Java面试题21.内置对象和四大作用域和页面传值 Java面试题22.Session和Cookie的区别和使用场景 Java面试题23.mvc模式和mvc各部分的实现 Java面试题24.数据库分类和常用...
·自Java语言起源始,循序渐进,知识点剖析细致且每章配备大量随堂练习,让你步步为营,学得透彻、练得明白 ·拒绝晦涩难懂的呆板教学,宋老师语言生动幽默,举例形象生动深入浅出,迅速让你把握问题本质,四两拨千...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...
hashmap源码 注解 理解Java注解 注解就相当于对源代码打的标签,给代码打上标签和删除标签对源代码没有任何影响。有的人要说了,你尽几把瞎扯,没有影响,打这些标签干毛线呢?其实不是这些标签自己起了什么作用,...
本教程结合 Java 应用开发的知识点,将内容分为七大模块,从上到下依次详解 Java 应用服务的每一层优化实战: 模块一,概述。 模块二,Java 编程性能调优。 模块三,多线程性能调优。 模块四,JVM 性能监测及调优。...
就是一些通用java集合知识点整理,ArrayList LinkedList,HashMap,HashTable ,ConcurrentHashMap,HashSet,LinkedHashSet类通过线程安全否: 底层: 初始值: 扩容 : 区别(对比优势) 图解
HashMap是线程安全的吗?线程安全的Map都有哪些?HashMap的数据结构是怎样的?HashMap的链表结构设计是用来解决什么问题的?HashMap中的g
7.所使用的知识点是spark core,spark SQL,spark streaming等三个技术框架。 8.主要是数据倾斜,线上故障,性能调优,troubleshooting等经验。 9.使用模拟数据,希望达到的效果。 10.需求分析,方案设计,数据设计,...