ArrayList类:该类继承list,该类中是单向链表,里面存在一个object[]数组,elementData[],在调用get方法是对数组进行获取elementData[index]的方法,所以使用ArrayList来读取数据,它的效率是非常高的,但是它在add(E)和add(int E)的时候却需要对数组进行扩展,使用System.arraycopy进行数组扩展。
ArrayList特点 写道
所以在进行多条数据进行添加的时候效率会比较低。并且注意了:ArrayList是并非线程安全的
public E get(int index) {
RangeCheck(index);//验证索引是否超过数组长度
return (E) elementData[index];
}
//add(E)方法
public boolean add(E e) {
ensureCapacity(size + 1); // 验证数组是否需要扩容
elementData[size++] = e;
return true;
}
//add(int E)方法
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
ensureCapacity(size+1); // 验证数组是否需要扩容
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
LinkedList类:该类可能很多人都知道它是双链表,那么它究竟是怎么实现的呢?在LinkedList.java文件中有另外一个class Entry<E>该类有三个元素:当前元素,上一级元素,下一级元素
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
所以在构建整个LinkedList的时候只要一个头head即可构建双链表。即a<->b<->c,由于这种模型的特殊性,所以对LinkedList进行插入的时候只需要改变previous和next的执行就可以了,而无需进行数组的扩容,所以对于LinkedList而言它进行多数据插入和删除的时候具有及高的效率。但是对于查询而言,它则需要进行for循环进行遍历。
LinkedList特点 写道
所以LinkedList适合那种多插入删除少修改查询的数据存储。当然它也是线程非安全的
public boolean add(E e) {
addBefore(e, header);
return true;
}
调用addBefore方法
private Entry<E> addBefore(E e, Entry<E> entry) {
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
从上面可以看出来添加是改变Entry的指针不需要数组扩容看,所以非常方便(删除也一样),但是使用get方法:
public E get(int index) {
return entry(index).element;
}
//调用entry方法
private Entry<E> entry(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
Entry<E> e = header;
if (index < (size >> 1)) {//这里是一个小技巧,右移1位,相当于使用了二分法
for (int i = 0; i <= index; i++)
e = e.next;
} else {
for (int i = size; i > index; i--)
e = e.previous;
}
return e;
}
可见在LinkedList中获取一个数据是非常麻烦的事情需要进行for循环。
Vector类:该类和ArrayList的区别与hashtable和hashmap的区别一样,它其实实现了ArrayList的线程同步问题。具体代码基本一样。读者可以自己仔细去看看
分享到:
相关推荐
这是我从JDK中拿出的Arraylist,Vector,LinkedList源码,自己看源码的时候弄出来的,并写了一点自己的分析,仅供源码分析者使用
List相关实现类的源码解析(JDK1.8) 2018.9.22- List的架构图 ArrayList 继承关系: ArrayList -> AbstractList 实现 List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态...
jdk1.8.0_151-源码的中文翻译和一些自己的理解 声明 作者现在大四快要毕业,在实习中,为了在未来成为一名架构师,下定决心开始读Java的源代码;读源码的过程非常难熬,我在以前也曾读过源码,但都坚持的不久,也...
为什么ArrayList,Vector等都不支持循环中remove1 ...其实,在Vector,ArrayList,LinkedList中,删除有两种方式进行删除: 1.循环中删除 2.直接删除 1 Vector 直接删除 直接删除首先调用indexOf方法,得到目标元素
首先,List接口继承于Collection接口,其中的所有方法都被继承,而Collection是无序、无下标,元素不可重复的,List是有序,有下标,元素可以重复,所以,List就有一些自己独有的方法。...JDK1.2版本,运行效率快、线
Java集合框架源码解读(1)——ArrayList、LinkedList和Vector Java集合框架源码解读(2)——HashMap Java集合框架源码解读(3)——LinkedHashMap Java集合框架源码解读(4)——WeakHashMap Java集合框架源码解读
剖析⾯试最常⻅问题之 Java 集合框架 集合概述 Java 集合概览 从下图可以看出,在 Java 中除了以 ...LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环) Set HashSet (⽆序,唯⼀): 基于 HashMap 实
学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,关注微信公众号,及时得到文章推送,谢谢支持。 说明:如无特别说明,所有代码都基于JDK8 JavaSE(Java基础) Java Core 关键字 synchronized...
Vector different with ArrayList 2018/3/26 ChangeLogs LinkedList ctor-2 addFirst addLast addAll add indexOf lastIndexOf peek 获取第一个元素,是 null 就返回 null peekFirst/Last 获取第一个最后一个元素 ...
文章目录Collection源码剖析(一)简介(二)源码分析 Collection源码剖析 (一)简介 Collection接口是集合层次结构中的根接口。 (1)下面是常用集合类关系图 Collection |___List 有序,可重复 |___...
LinkedList: 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环) List,Set,Map三者的区别 List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(注重独一无二的...
(这个类是大致相当于Vector,不同之处在于它是不同步的)。 该size,isEmpty,get,set,iterator和listIterator操作在固定时间内运行。 add操作以摊余常数运行 ,即添加n个元素需要O(n)个时间。 所有其他操作...
1.什么是容器在Java当中,有一个类专门用来存放其它类的...Arraylist:Object数组Vector:Object数组LinkedList:双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)2.Set一个不包含重复元素的collection。更确切地讲,
ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 PriorityQueue HashMap TreeMap 类 LinkedHashMap 类 Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图 泛形 ...
ArrayList的特点 Vector的特点 LinkedList的特点 Set ConcurrentModificationException异常 线程安全的集合 线程安全的 List CopyOnWriteArrayList 线程安全的Set 线程安全的Map ConcurrentHashMap ...
数据结构Java 主要数据结构——java中的简单实现如何使用集合:-> JDK(Java集合)-> Guava(谷歌)-> Commons-collections(Apache) 主要抽象数据结构——ADS列表(ArrayList、LinkedList、Vector)栈(FIFO)队列...
集合源码 基本 List, Set, Queue, Map ArrayList, LinkedList, Vector, CopyOnWriteArrayList HashMap JDK7, JDK8 ConcurrentHashMap JDK7, JDK8 HashTable, ThreadLocalMap, WeakHashMap Leetcode 刷题记录 栈实现...
Vector和LinkedList 4. 6 生成不重复的随机数序列 4. 7 自定义队列 4. 8 对List排序 4. 9 HashSet. LinkedHashSet和TreeSet 4. 10 列表. 集合与数组的互相转换 4. 11 HashMap. Hashtable. ...
第四题 ArrayList LinkedList Vector的区别.pdf docker讲得最清楚.doc Dubbo是什么?能做什么?.doc java 基于TCP协议的Socket编程和通信.doc Java面试高级篇—说说TCP,UDP和socket,Http之间联系和区别.doc MySQL...
14、JAVA集合框架之list接口、LinkedList类、ArrayList类、Vector类 15、JAVA集合框架之Set接口、HashSet类、TreeSet类 16、JAVA集合框架之Map接口、HashMap类、Trelap类、Hashtable类 17、JAVA异常Exception 18...