ArrayList、LinkedList、HashMap底层实现
2016-03-28 21:40
597 查看
ArrayList 底层的实现就是一个数组(固定大小),当数组长度不够用的时候就会重新开辟一个新的数组,然后将原来的数据拷贝到新的数组内。
LinkedList 底层是一个链表,是由java实现的一个双向链表其节点如下:
class Node
{
private Node privious;//指向前一个节点
private Object value;//当前节点的value值
private Node next;//指向下一个节点的值,类似于指针。
}
然后实现其增删改查操作,和数据结构中链表的增删改查完全相同,而且插入是有序的。
HashMap底层是一个数组+链表实现。其基本原理是:定义一个LinkedList的数组,然后将数据存储到这个链表数组内,例如:LinkedList []list = new LinkedList[1000];这样就定义了一个如下图所示的数据结构:
其中上面一行是一个数组,数组中的一个元素对应一个链表。在插入元素的时候,首先根据key值来计算hash值h,然后计算h%1000得到一个数字,然后把该对象插入到对应的数组元素内:如:h%1000得到10,那就将对象插入到list[10]这个链表内。插入的
内容是一个数据项,其结构如下:
class{
String key;
Object value;
}
HashSet的底层实现是通过Map来实现的,Set中不允许有重复的元素,类似于集合,在HashSet的实现的时候,通过Map来实现,每次往Set里添加数据,都会将数据设置为Map的键值,Map的值设置一个默认值,因为Map的键值不能重复,所以每次添加到Set内的
数据也不能重复。
以上只是我简单的理解,具体的代码实现可以观看源码进行学习和分析。
LinkedList 底层是一个链表,是由java实现的一个双向链表其节点如下:
class Node
{
private Node privious;//指向前一个节点
private Object value;//当前节点的value值
private Node next;//指向下一个节点的值,类似于指针。
}
然后实现其增删改查操作,和数据结构中链表的增删改查完全相同,而且插入是有序的。
HashMap底层是一个数组+链表实现。其基本原理是:定义一个LinkedList的数组,然后将数据存储到这个链表数组内,例如:LinkedList []list = new LinkedList[1000];这样就定义了一个如下图所示的数据结构:
其中上面一行是一个数组,数组中的一个元素对应一个链表。在插入元素的时候,首先根据key值来计算hash值h,然后计算h%1000得到一个数字,然后把该对象插入到对应的数组元素内:如:h%1000得到10,那就将对象插入到list[10]这个链表内。插入的
内容是一个数据项,其结构如下:
class{
String key;
Object value;
}
HashSet的底层实现是通过Map来实现的,Set中不允许有重复的元素,类似于集合,在HashSet的实现的时候,通过Map来实现,每次往Set里添加数据,都会将数据设置为Map的键值,Map的值设置一个默认值,因为Map的键值不能重复,所以每次添加到Set内的
数据也不能重复。
以上只是我简单的理解,具体的代码实现可以观看源码进行学习和分析。
相关文章推荐
- iOS之UITableView的上拉刷新
- java实用教程
- 第四周项目1-求最大公约数
- ooVoo(视频通讯)
- POJ2387 Til the Cows Come Home
- 文件与流
- Scala 之 trait 关键字
- Weka – 分类
- gulp自己主动化任务脚本在HybridApp开发中的使用
- Virtual Box创建共享目录
- 面试大全1
- 1到a的奇数的和
- 多重背包二进制
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
- 设计模式之职责链模式
- Material Design 实现之主题使用Theme
- php的一些小笔记-文件函数(1)
- ooVoo(视频通讯)
- LoadRunner性能测试工具---(三)测试结果样例分析
- MySQL 使用序列化表的方法实现行转列