- 浏览: 333604 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (140)
- oracle (2)
- j2se (18)
- 应用服务器 (2)
- 操作系统 (21)
- j2ee (3)
- web (9)
- Junit (0)
- 项目 (0)
- IDE (0)
- 五花八门 (1)
- excel导入导出 (0)
- DWR (0)
- display标签总结 (0)
- JS (7)
- FCKeditor (0)
- Spring (3)
- webservice (1)
- JVM (14)
- 传输协议 (6)
- maven (3)
- 服务器 (2)
- 数据结构 (11)
- HTTPClient (2)
- JQUERY (9)
- 设计模式 (4)
- 数据库 (6)
- 看书笔记 (0)
- 工具 (4)
- MINA (3)
- mysql (5)
- jetty (1)
- JAVA网络编程 (7)
- Hessian (1)
- ibatis (1)
- socket (4)
- Native (1)
- http (2)
- nosql (2)
- linux (1)
- hadoop (1)
最新评论
-
applezjv:
可以...
maven常见问题 -
andyboy_bin:
p
Jetty -
ye_wx:
...
TableSpace -
ye_wx:
TableSpace -
极限_裁决:
引用第二:不要把“好像”;“有人会……”;“大概”;“晚些时候 ...
可以让你少奋斗10年的工作经验
主要包括Java类库中提供的几个具体的类:
LinkedList
ArrayList
HashMap
HashSet
TreeMap
TreeSet
PriorityQueue(顺序按下面的讲解顺序)
-----------------------------------------------------------------------------------------------------
1、java.util.LinkedList<E>
当我们创建一个LinkedList类的对象,并且试图增加一个新的元素的时候,到底是如何组织我们传进去的数据的呢?
打开add方法的源码看看:
我们惊喜的发现,原来就是把我们传去的e对象包装成了Entry<E>,然后通过Entry<E>的next和previous两个属性形成了一个以包装后的e对象(即Entry<E>)为节点的双向链表。
于是我们彻底明白了LinkedList果然名副其实,就是一个链表嘛!
-----------------------------------------------------------------------------------------------------
2、java.util.ArrayList<E>
我们看看在ArrayList对象调用add();方法时,底层到底是如何执行的
于是我们发现:原来ArrayList也是如名字说的,用Array组织数据。不过它内部定义的那个调整elementData数组的方法copy太多,显然当数据量大的时候,性能不会很好。
-----------------------------------------------------------------------------------------------------
3、java.util.HashMap<K,V>
想必大家看这段代码都看到晕了吧,为了让大家能够更加形象的人知道HashMap对数据的的组织形式,上了一个HaspMap数据结构图:
这里解释一下,这个图的最左边的一些就是上面源码中的table也就是HashMap的一个属性Entry[] table。将一个新的键值对插入需要经过这几步:
---给key值计算哈码(计算在这一步int hash = hash(key.hashCode());),
---得出在table数组的中index:int i = indexFor(hash, table.
length);
---将键值对插入index确定的上图所示的一个横向的链表中。如果在这个链表中有要插入的pair的key经过hashcode()的一系列运算和equals()的一系列运算相同的元素,就替换原来的value。(这也就是我们自己定义的类要用到HashMap存储的时候,必须重写hashcode()和equals()方法,并且要保证对同一对象两个方法计算结果要相同的原因。因为如果不相同,在一个同一对象为key插入值的时候就不会像你期望的那样后插入的value覆盖前面的value了,而是会重新开辟一个空间存储)
于是,到这里我们明白了,原来HashMap就是通过散列表这种数据结构组织数据的!
-----------------------------------------------------------------------------------------------------
4、java.util.HashSet<E>
小样直接自己不解决,抛给HashMap类的put()方法,也就是用一个散列表存数据。详解见第三条对HashMap的讲解
-----------------------------------------------------------------------------------------------------
5、java.util.TreeMap<E>
我们又可以开心的大笑了,原来就是如此简单,就是按照一定的规律形成一棵二叉树来存数据。
大笑过后,我们再次静下心来观察,源码中出现了这样一句:k.compareTo(t.key);是说用key对应的类中实现的compareTo()方法来判断两个key的先后顺序。有若干标准的java平台类都实现了Compatable接口(Compatator可以自己定义不同的比较规则,不过这个接口的比较规则只有一个,是定义key的类的时候定义的,没有可变性),如String类:
所以,我们自己定义key的类的时候,要特别注意compareTo()方法中算法的选择,以便有一个最好的插入、查找、遍历的性能。一般而言将元素添加到树集的速度快于数组和链表,慢于散列表(素服比较:数组、链表<树集<散列表)。
-----------------------------------------------------------------------------------------------------
6、java.util.TreeSet<E>
相信大家看到源码立马就能明白了吧,向HashSet一样TreeSet也偷懒了(至于为什么要偷懒,感兴趣的朋友可以去研究,这里不展开了),也是用二叉树的结构存数据,不多说!
-----------------------------------------------------------------------------------------------------
7、java.util.PriorityQueue<E>
PriorityQueue<E>重新写了一份:
我们看看调用add()方法在底层到底发生了什么事情!
嗯,这个类用了一种“堆”(逻辑上是二叉树,存储上用数组,树中的元素有大小关系,越小在数组中的index也越小)的数据结构。
典型应用是存储有优先级的任务,因为每次调用remove移除最小的元素(优先级最高的元素),都会自动排序,保证每次移除的都是优先级最高的任务。
同样,TreeMap逻辑上也是通过有序二叉树来组织数据的,不过,TreeMap通过节点的链接来组织存储结构,而PriorityQueue是通过数组的一些列计算确定逻辑上的树的节点的存放位置。
发表评论
-
java枚举Enum
2013-01-14 14:43 1227public class TestEnum { /* ... -
Java 动态代理机制分析及扩展,第 1 部分
2012-03-26 12:47 782引言 Java 动态代理机制的出现,使得 Java 开 ... -
详解reflect Java的反射机制
2012-03-23 13:09 1027一、类型识别的两种方式: 首先了解一下“运 ... -
Annotation 之 jdk1.5内建的Annotation实例
2011-11-15 20:25 894一、限定Override父类方法@Override ja ... -
自定义Annotation
2011-11-15 20:24 726自定义Annotation 自定义Annotation早 ... -
Java Annotation
2011-11-14 22:04 0Java Annotation手册 ... -
ArrayList和Vector以及HashTable和HashMap区别
2011-10-12 10:40 1035ArrayList和Vector以及HashTable和Has ... -
JVM优化配置
2011-08-20 22:32 850JVM 优化配置 ... -
JVM慢慢琢磨
2011-08-20 22:05 935原文:http://www.iteye.com/ ... -
堆栈区别
2011-08-18 22:23 871原文:http://www.iteye.com/topi ... -
JVM闲谈
2011-08-18 22:01 789java中内存分为堆内存和栈内存。 Java把内存划分成两 ... -
堆和栈的区别
2011-08-03 00:27 857堆和栈的区别 一、预备知识—程序的内存分配 一个由 ... -
JVM 四
2011-08-02 18:22 796转自:http://blog.csdn.net/cute ... -
JVM
2011-08-02 18:20 164本文转自:http://blog.csdn.net/cu ... -
关于byte
2011-08-02 18:16 10301GB=1024MB=1024*1024KB=1024*102 ... -
jvm垃圾回收
2011-07-31 23:13 753Java里的对象并非总是被 ... -
String与StringBuffer的区别
2011-06-22 14:37 460String和StringBuffer的区别,网上资料可以说是 ... -
序列化
2009-10-11 22:13 1775序列化 (serialization) 将对象的状 ... -
去字符串中的回车 换行 空格的方法
2009-10-09 17:37 0import java.util.List; import ... -
去字符串中的回车 换行 空格的方法
2009-10-09 17:37 0import java.util.List; import ...
相关推荐
在给定的压缩包文件中,包含了一些关键的集合类源码,如`TreeMap`、`Hashtable`、`ArrayList`、`HashMap`、`LinkedList`、`List`、`Map`、`TreeSet`、`LinkedHashMap`和`Set`。这些类都是Java集合框架的重要组成部分...
当你需要基本数据类型的集合时,你需要自定义集合类,或使用第三方库,如 Trove 。出于性能考虑,使用TIntObjectHashMap,效率会高于直接使用...该资源为源码包,可以自己打为JAR包使用,也可以参考实现自定义的集合类。
java.util 中的集合类包含 Java 中某些最常用的类。 最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。 List 适用...
集合类的框架为集合的实现者提供了大量的接口和抽象类,并对其中的某些机制给予了描述,例如,Iterator(迭代协议)。实现Comparable接口或Comparator接口,用户可以根据需要对集合中的元素进行排序。为了方便用户...
Set接口在Java集合框架中扮演着重要角色,它是一个不包含重复元素的集合。Set接口继承自Collection接口,提供...了解和掌握这两种集合类的源码分析有助于深入理解Java集合框架的底层实现,从而更好地应用在实际开发中。
Java集合类源码分析之Set详解 Java集合类中的Set Interface是用于存储无序、不可重复元素的集合接口。Set Interface继承自Collection Interface,提供了基本的集合操作,如add、remove、contains等。Set Interface...
集合源码 JDK-Collection集合入门 总的list和set类结构大致如下所示 Map不继承Collection,其结构如下 首先介绍下迭代器的概念 迭代器无非是一个接口,假设我们有一个数组,如果我们要实现迭代器,只需要根据该接口定义...
所有集合类都提供了迭代器接口,用于遍历集合中的元素。迭代器通过`hasNext()`检查是否有下一个元素,`next()`获取并移除下一个元素。`remove()`方法可以删除当前元素,这是安全的,因为其他线程无法同时修改迭代器...
java所有集合类底层源码解析汇总,包括ArrayList、HashMap、HashSet、LinkedList、TreeMap、HashSet、ConcurrentHashMap等集合框架的底层实现源码大白话解读。
本篇文章将深入探讨`JavaCollection`类源码,了解其背后的实现原理。 首先,我们要明确`JavaCollection`是`java.util`包中的接口,它是所有集合的父接口,包括`List`, `Set`和`Queue`等。`Collection`接口提供了...
集合类源码的深入研究 探索JAVA的本质 提高代码质量
下面将详细讨论Java 8中集合类的源码分析和相关知识点。 1. **接口的默认方法** Java 8为集合接口如`List`, `Set`, `Map`等引入了默认方法,这是一种不需实现类显式覆盖的接口方法。例如,`forEach(Consumer)`和`...
本篇文章将深入探讨这些集合类的源码,揭示其内部实现机制。 首先,我们来看`List`接口,它代表了有序的元素集合,允许有重复元素。`ArrayList`和`LinkedList`是`List`接口的主要实现。`ArrayList`基于动态数组实现...
2023全新小西瓜API系统集合系统源码安装教程:访问 http://你的域名/install 进行安装
易语言源码易语言数组排序算法集合源码.rar 易语言源码易语言数组排序算法集合源码.rar 易语言源码易语言数组排序算法集合源码.rar 易语言源码易语言数组排序算法集合源码.rar 易语言源码易语言数组排序算法集合...
例如,通过研究.NET中的集合类源码,可以了解如何实现高效的数据结构;查看控件的源码,可以学习到UI设计和事件处理的细节。 在这个压缩包中,有一个名为“.net面试题目.doc”的文件,这很可能是针对.NET开发者的一...
本文将深入探讨XUtils的源码,帮助你理解其内部机制,提升你的Android开发技能。 XUtils是一个集成了网络请求、图片加载、数据库操作、SharedPreferences管理、文件操作等功能于一体的全能型工具类库。它的设计理念...
在这个主题中,“修改phprpc源码以支持集合类的string类型的转换”涉及到对Phprpc框架的源代码进行定制化改造,以适应处理集合类中的字符串类型转换需求。在IT行业中,这样的改造通常是出于特定业务场景的需求,比如...
2. `ArrayList` 和 `LinkedList` 类:这两个类都是`List`接口的实现,用于存储有序的元素集合。`ArrayList`基于动态数组,适用于随机访问,而`LinkedList`基于双向链表,适合于频繁插入和删除。通过源码分析,我们...
源码阅读对于理解Java集合类的内部工作原理至关重要。例如,通过查看ArrayList的扩容机制,我们可以了解到为什么在预估集合大小时提前分配足够空间能提高性能。LinkedList的实现揭示了如何通过双向链表实现高效的...