- 浏览: 497524 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
gaoke:
"我觉得这是java动态生成代码的方式得到的,因为使 ...
InvocationHandler中invoke()方法的调用问题 -
lyandyhk:
可以,反正对于我这个水平来说刚刚好,正好全部看懂,满分
InvocationHandler中invoke()方法的调用问题 -
593844923:
Subject subject=(Subject) Proxy ...
InvocationHandler中invoke()方法的调用问题 -
hl174:
写的不错 源码确实有点长 第一次大致看还有些没看怎么明白
InvocationHandler中invoke()方法的调用问题 -
draem0507:
129应该表示为00000000 10000001,转成byt ...
Java的补码表示
这里随手做一些记录,以便有空时整理。
HashMap
HashMap是这么设计的,key和value实际上是存在于一个内部类Entry中,作为这个内部类的成员变量,有多少key-value就生成多少个Entry对象。这些Entry对象又存放在一个名为table的数组中。所以,HashMap实际的存储结构就是一个存有Entry对象的数组。
HashMap中有一个hash算法(HashTable则没有这个算法,而是直接用key的hashcode)来对key进行hash计算,这决定了这个Entry对象放到table的哪个位置。但是会出现hash值相同的key,table的同一个位置会对应多个不同的Entry对象,因此Entry内部类中还有一个成员变量next,存放的是Entry类型的引用。所以,table的同一位置如果有多个Entry对象,这些对象会通过其next引用来构成一个链表。
这是hash算法
存放元素的put方法,当key值存在时,更新value。如果不存在,调用addEntry方法
addEntry方法
以上大体就是HashMap的框架,等有时间再做详细补充。
LinkedHashMap
LinkedHashMap继承了HashMap,绝大多数的实现都是继承了HashMap,而没有进行重写。但是由于LinkedHashMap除了使用HashMap的Entry数组来保存其元素之外,还将各元素连接为一个链表。
HashMap的Entry中有next成员变量,保存的是Entry类型的引用。LinkedHashMap中的Entry内部类继承了HashMap的Entry,而且还多了两个Entry类型的引用,before和after。
HashMap的put方法在添加一个新元素(不是key值相同的元素更新,而是新添加的元素)实际调用的是addEntry方法,由于LinkedHashMap的Entry中多了两个成员变量,因此为了维护before和after,LinkedHashMap重写了addEntry方法。当然在删除元素时也需要维护这两个成员变量,所以删除方法也进行了重写。
重写的addEntry方法
HashSet
HashSet其实就是用HashMap实现的,只不过将HashMap的value统一用一个Object对象填充。也就是说,HashSet是只用了key的HashMap。
ArrayDeque
发现一个不错的类,貌似是1.6加入的。在使用上相比LinkedList没什么特别,但是在队列性能上貌似要好于LinkedList,用做stack也比Stack好。
ArrayDeque是用环形数组实现的,有头尾两个指示器(通过在数组上加两个指示器,类似形成了一个环状结构),通过检查头尾指示器是否相等来判断数组是否已满。下面是API上文档的一段介绍:
Resizable-array implementation of the Deque interface. Array deques have no capacity restrictions; they grow as necessary to support usage. They are not thread-safe; in the absence of external synchronization, they do not support concurrent access by multiple threads. Null elements are prohibited. This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.
HashMap
HashMap是这么设计的,key和value实际上是存在于一个内部类Entry中,作为这个内部类的成员变量,有多少key-value就生成多少个Entry对象。这些Entry对象又存放在一个名为table的数组中。所以,HashMap实际的存储结构就是一个存有Entry对象的数组。
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; final int hash; ……………… }
HashMap中有一个hash算法(HashTable则没有这个算法,而是直接用key的hashcode)来对key进行hash计算,这决定了这个Entry对象放到table的哪个位置。但是会出现hash值相同的key,table的同一个位置会对应多个不同的Entry对象,因此Entry内部类中还有一个成员变量next,存放的是Entry类型的引用。所以,table的同一位置如果有多个Entry对象,这些对象会通过其next引用来构成一个链表。
这是hash算法
static int hash(int h) { // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 at default load factor). h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }
存放元素的put方法,当key值存在时,更新value。如果不存在,调用addEntry方法
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); 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; }
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); if (size++ >= threshold) resize(2 * table.length); }
以上大体就是HashMap的框架,等有时间再做详细补充。
LinkedHashMap
LinkedHashMap继承了HashMap,绝大多数的实现都是继承了HashMap,而没有进行重写。但是由于LinkedHashMap除了使用HashMap的Entry数组来保存其元素之外,还将各元素连接为一个链表。
HashMap的Entry中有next成员变量,保存的是Entry类型的引用。LinkedHashMap中的Entry内部类继承了HashMap的Entry,而且还多了两个Entry类型的引用,before和after。
HashMap的put方法在添加一个新元素(不是key值相同的元素更新,而是新添加的元素)实际调用的是addEntry方法,由于LinkedHashMap的Entry中多了两个成员变量,因此为了维护before和after,LinkedHashMap重写了addEntry方法。当然在删除元素时也需要维护这两个成员变量,所以删除方法也进行了重写。
重写的addEntry方法
void addEntry(int hash, K key, V value, int bucketIndex) { createEntry(hash, key, value, bucketIndex); // Remove eldest entry if instructed, else grow capacity if appropriate Entry<K,V> eldest = header.after; if (removeEldestEntry(eldest)) { removeEntryForKey(eldest.key); } else { if (size >= threshold) resize(2 * table.length); } }
HashSet
HashSet其实就是用HashMap实现的,只不过将HashMap的value统一用一个Object对象填充。也就是说,HashSet是只用了key的HashMap。
ArrayDeque
发现一个不错的类,貌似是1.6加入的。在使用上相比LinkedList没什么特别,但是在队列性能上貌似要好于LinkedList,用做stack也比Stack好。
ArrayDeque是用环形数组实现的,有头尾两个指示器(通过在数组上加两个指示器,类似形成了一个环状结构),通过检查头尾指示器是否相等来判断数组是否已满。下面是API上文档的一段介绍:
Resizable-array implementation of the Deque interface. Array deques have no capacity restrictions; they grow as necessary to support usage. They are not thread-safe; in the absence of external synchronization, they do not support concurrent access by multiple threads. Null elements are prohibited. This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.
发表评论
-
Hive自定义UDAF详解
2014-07-25 14:14 14628遇到一个Hive ... -
编译libhdfs
2014-02-25 15:32 3719Mysql Applier是Mysql向hdf ... -
Java序列化机制对同一对象的处理
2012-04-20 18:47 0以下例子参考http://developer. ... -
Java的补码表示
2012-04-20 17:19 3828最近发现一个比较低级的问题,就是java中的数 ... -
同步锁的失败可能
2012-04-20 10:29 1039以下例子参考http://developer.51cto.co ... -
SpringExt 扩展原理
2011-07-25 11:27 8945这篇文章是基于webx框架官方文档整理的。具体 ... -
优化多线程执行效率
2011-05-22 21:38 1663摘抄自http://zhmocean.itey ... -
ExecutorService与Executors例子的简单剖析
2011-05-11 00:13 6546对于多线程有了一点了解之后,那么来看看java ... -
java深度历险
2011-04-17 20:57 1224InfoQ上面有几篇文章不错,适合已经对jav ... -
Java引用类型
2011-04-05 19:00 5430Java有四种引 ... -
double类型运算精度丢失
2011-04-04 15:45 5585前段时间看了一点python入门,写了几个运算 ... -
Java变量初始化
2011-03-29 15:01 1428先看一个例子: public class Te ... -
Java实现循环移位
2011-03-25 20:56 5904做MD5算法时遇到了循环移位,在网上找了写资料 ... -
Java的栈和堆
2011-03-12 21:18 1292学的越多, ... -
String的一点东西
2011-03-12 20:24 988关于String类的一点东西,算是对容易疏忽的 ... -
Html转换为PDF
2011-03-11 13:37 26521、html文件转为xhtml文件 ... -
Understand the Serializable and serialVersionUID
2011-03-08 12:54 1496看了一篇简单介绍serialVersionUI ... -
Overriding and Hiding Methods
2011-03-05 16:18 1619方法的override体现在实例方法(inst ... -
Java的参数传递
2011-03-02 16:32 1180关于java参数传递这个问题,伴随着java的 ... -
Java引用类型
2011-02-01 22:58 1036摘自http://www.infoq.com/ ...
相关推荐
英语音标简记法英语音标简记法英语音标简记法英语音标简记法英语音标简记法英语音标简记法
NULL 博文链接:https://joard.iteye.com/blog/403031
NULL 博文链接:https://chengjianxiaoxue.iteye.com/blog/2428561
这是群主Earnest为大家出过的习题及答案,第一期共两个题~。
简记个人博客网站源码为博主现有博客网站,前端采用LayUI框架,此分享版本为asp + access。所有功能齐全,欢迎使用。 使用方法:上传至空间或服务器,通过IIS发布网站即可。 演示地址:...
497476974884240简记.apk
简记一次Java求职面试,上海地区java高级面试题目回忆
从数据头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021。
高中化学各简记规律.docx
jsp标准语法中7大动作 简记(经典) jsp标准语法中7大动作 简记(经典)
Programming 简记 LP)则是数学规划的一个重要分支。自从 1947 年 G. B. Dantzig 提出 求解线性规划的单纯形方法以来,线性规划在理论上趋向成熟,在实用中日益广泛与深 入。特别是在计算机能处理成千上万个约束条件...
七年级英语音标简记法PPT教案.pptx
简记个人博客网站源码 v2.10.01.rar
考试_上课简记&qq群消息汇总.pdf
高中历史之历史百科简记美国“飞虎队”在云南素材
第一章:这是 USACO 的第一篇文章,《杂题》,所谓杂题,广义上讲:就是没有任何套路的题目,通常这种题目使用的是构造法,而模拟策略又居多,文章言简意赅的叙述了
中考知识要点简记归纳之人教版初一数学知识点总结.pdf
title: GAMESS2013编译使用简记- 科2014-02-23 21:14:14 初稿2014-03-08 12:09:09 修订编译解压 tar -
此篇文字没有包含完成编程任务的所有过程和细节,也就是说可大胆忽略或脑补不清晰或断节之处。这篇文字记录的是 第一次从头到尾构建C程序工程过程中所涉及到的 有助于程序更合理的一些技术或编程规范。...
NULL 博文链接:https://mabei.iteye.com/blog/601424