- 浏览: 505152 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 14707遇到一个Hive ... -
编译libhdfs
2014-02-25 15:32 3774Mysql Applier是Mysql向hdf ... -
Java序列化机制对同一对象的处理
2012-04-20 18:47 0以下例子参考http://developer. ... -
Java的补码表示
2012-04-20 17:19 3963最近发现一个比较低级的问题,就是java中的数 ... -
同步锁的失败可能
2012-04-20 10:29 1095以下例子参考http://developer.51cto.co ... -
SpringExt 扩展原理
2011-07-25 11:27 9032这篇文章是基于webx框架官方文档整理的。具体 ... -
优化多线程执行效率
2011-05-22 21:38 1709摘抄自http://zhmocean.itey ... -
ExecutorService与Executors例子的简单剖析
2011-05-11 00:13 6595对于多线程有了一点了解之后,那么来看看java ... -
java深度历险
2011-04-17 20:57 1291InfoQ上面有几篇文章不错,适合已经对jav ... -
Java引用类型
2011-04-05 19:00 5480Java有四种引 ... -
double类型运算精度丢失
2011-04-04 15:45 5622前段时间看了一点python入门,写了几个运算 ... -
Java变量初始化
2011-03-29 15:01 1476先看一个例子: public class Te ... -
Java实现循环移位
2011-03-25 20:56 5950做MD5算法时遇到了循环移位,在网上找了写资料 ... -
Java的栈和堆
2011-03-12 21:18 1367学的越多, ... -
String的一点东西
2011-03-12 20:24 1034关于String类的一点东西,算是对容易疏忽的 ... -
Html转换为PDF
2011-03-11 13:37 26971、html文件转为xhtml文件 ... -
Understand the Serializable and serialVersionUID
2011-03-08 12:54 1533看了一篇简单介绍serialVersionUI ... -
Overriding and Hiding Methods
2011-03-05 16:18 1664方法的override体现在实例方法(inst ... -
Java的参数传递
2011-03-02 16:32 1225关于java参数传递这个问题,伴随着java的 ... -
Java引用类型
2011-02-01 22:58 1072摘自http://www.infoq.com/ ...
相关推荐
此外,"Java 简记.md"可能是一个Markdown格式的文档,总结了Java语言的关键概念、语法或技巧,便于快速查阅。"README.md"是常见的项目介绍文件,通常会提供项目概述、安装指南、运行说明等信息。 通过这个代码库,...
本文将围绕“Java字符集编码简记”这一主题,深入探讨相关知识点,并结合标签“源码”和“工具”,探讨在实际开发中如何运用和处理字符编码问题。 首先,我们需要理解字符集的概念。字符集是一系列符号的集合,例如...
Java中的Pattern和Matcher是正则表达式的核心工具类,它们在处理字符串匹配和模式查找时起着关键作用。本文将深入解析这两个类的功能、用法以及相关知识点。 首先,Pattern类是Java.util.regex包下的一个类,它代表...
从数据头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021。
这四大概念通常被简记为“A-PIE”。抽象是指在设计对象时只展示其重要特征而不包括背景细节。多态是指一个接口对应多个实现。继承是指一个类的对象能够获取另一个类对象的属性。封装则是隐藏对象的属性和行为,只...
标题中的“log4jdbc-log4j2配置简记”指的是在Java开发中使用log4jdbc-log4j2库来监控和记录SQL查询的过程。log4jdbc是一个开源项目,它允许开发者通过日志系统来追踪数据库操作,而log4j2是log4j的升级版,提供了更...
在JavaServer Pages (JSP) 技术中,七大标准动作是开发动态网页的重要组成部分。这些动作提供了在页面上操作数据、控制流程和与服务器交互的功能。以下是对JSP七大标准动作的详细解释: 1. **** 这个动作用于在...
【学习简记】这篇文档主要涵盖了多个IT领域的学习记录,包括设计模式、Java 8、RocketMQ、RPC机制、Scala编程语言以及前端框架Vue.js。接下来,我们将详细探讨这些知识点。 首先,设计模式是软件工程中的一种最佳...
Android我是在Mac上学习Android,因此会跟windows有些不同,有不正确处请斧正:grinning_face:ContentsBroadcast-ReceiverContent-ProviderUI布局xmlnsFragmentcom.android.support 兼容包...
crc16校验工具类,从消息头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021
人和电梯的各种动作均要耗费一定的时间单位(简记为t)比如: 有人进出时,电梯每隔40t测试一次,若无人进出,则关门; 关门和开门各需要20t; 每个人进出电梯均需要25t; 如果电梯在某层静止时间超过300t,...
本文实例讲述了JavaScript设计模式—单例模式.分享给大家供大家参考,具体...第一种,最简单的单体,只被实例化一次 我简记为json对象 (1)基本结构 var userInfo={//已经自行被实例化 其实是一json对象 name:测试
1.设计一个学生类Student。 1)数据成员包括: 学生学号、姓名、数学、英语、c语言成绩;(用字符指针存储学号和姓名,通过动态存储空间分配的方式为指针开辟指向的空间,保证空间大小没有浪费) 2)成员函数包括: ...