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 1.6中,ArrayList提供了线程不安全的高效操作,适合于非并发环境下的高性能读写操作。其优点在于随机访问快速,因为数组支持索引直接访问;缺点是插入和删除元素需要移动后续元素,效率较低。 Vector与...
### ArrayList、Vector、LinkedList 的区别与用法详解 在Java编程中,选择合适的数据结构对于程序的性能至关重要。本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解...
List相关实现类的源码解析(JDK1.8) 2018.9.22- List的架构图 ArrayList 继承关系: ArrayList -> AbstractList 实现 List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态...
jdk1.8.0_151-源码的中文翻译和一些自己的理解 声明 作者现在大四快要毕业,在实习中,为了在未来成为一名架构师,下定决心开始读Java的源代码;读源码的过程非常难熬,我在以前也曾读过源码,但都坚持的不久,也...
- 在JDK 1.6中,无参构造函数会创建一个初始容量为10的数组。 - 在JDK 1.7及以后,无参构造的ArrayList的初始容量为0,实际容量会在添加元素时分配。 - JDK 1.8中扩容是通过调用Arrays.copyOf和System.arraycopy方法...
作者目录Java基础Java基础学习(1)——引用Java基础学习(2)——注解Java基础学习(3)——泛型Java基础学习(4)——动态代理《Java多线程核心技术》读书笔记JDK源Java集合框架源码解读(1)——ArrayList、LinkedList和...
2. **集合框架**:虽然 JDK 1.2 才完整引入了集合框架,但 JDK 1.1 已经引入了 `Vector` 和 `Stack` 类,它们是后来的 `ArrayList` 和 `LinkedList` 的前身,为存储和操作对象数组提供了便利。 3. **接口**:JDK ...
- a) Vector 和 ArrayList 都是实现了基于动态数组的数据结构,如果集合中元素的个数大于目前集合数组的长度时,Vector 增长率为目前数组长度的 100%,ArrayList 则为目前数组长度的 50%,如果集合中使用数据量比较...
2. **并发容器**:Java提供了多种并发容器,如ArrayList, Vector, LinkedList, ConcurrentHashMap等,它们在并发环境下有着不同的性能表现和适用场景。 3. **并发工具类**:如CountDownLatch, CyclicBarrier, ...
### JDK8集合基础知识点 #### 一、集合体系图(熟记) - **集合体系**:在Java中,集合框架主要包括两大接口:`Collection`和`Map`。 - `Collection`接口:处理一组对象,进一步分为`List`和`Set`。 - `List`...
- JDK 1.6之前使用循环链表,JDK 1.7取消循环。 ##### 2. `Set` - **HashSet** - 基于`HashMap`实现,使用`HashMap`存储元素。 - 特点:插入、删除和查找速度非常快,但不保证元素的顺序。 - **LinkedHashSet**...
ArrayList是Java集合框架中常用的动态数组,它是List接口的一个实现,允许存储包括null在内的所有元素。ArrayList的主要特点是通过...根据实际需求,可以选择ArrayList或其他更合适的数据结构,如LinkedList或Vector。
为什么ArrayList,Vector等都不支持循环中remove1 ...其实,在Vector,ArrayList,LinkedList中,删除有两种方式进行删除: 1.循环中删除 2.直接删除 1 Vector 直接删除 直接删除首先调用indexOf方法,得到目标元素
首先,List接口继承于Collection接口,其中的所有方法都被继承,而Collection是无序、无下标,元素不可重复的,List是有序,有下标,元素可以重复,所以,List就有一些自己独有的方法。...JDK1.2版本,运行效率快、线
- Java中常见的List实现类有ArrayList、LinkedList和Vector。ArrayList基于动态数组实现,适合随机访问;LinkedList是双链表结构,适用于频繁插入和删除操作;而Vector与ArrayList类似,但它是线程安全的。 2. **...
- 线程安全性:两者都不是线程安全的,但在JDK 1.0中,`Vector`(`ArrayList`的前身)是线程安全的,性能相对较差。 【HashMap与HashTable的区别】 1. 线程安全:`HashMap`是非线程安全的,`HashTable`是线程安全的...
5. **集合框架**:涵盖ArrayList、LinkedList、Vector、HashMap、HashSet、TreeMap和TreeSet等集合类的使用,以及集合接口(List、Set、Map)的实现和操作。 6. **I/O流**:解释输入输出流的概念,包括字节流和字符...
10. **ArrayList与LinkedList、Vector的区别**: - ArrayList在随机访问时效率高,插入和删除元素时效率低。 - LinkedList在插入和删除元素时效率高,但随机访问效率低。 - Vector与ArrayList类似,但它是线程...
- 集合框架:如ArrayList、Vector、LinkedList、HashSet、TreeSet、LinkedHashSet、HashMap等,用于存储和操作对象。 - 泛型:提供类型安全,允许在类、接口和方法中指定参数类型。 - 反射:运行时动态获取类的...
总的来说,`Vector`在早期的Java开发中广泛使用,但在现代Java编程中,由于性能原因,它已经逐渐被`ArrayList`和`LinkedList`等其他集合类所取代。然而,了解`Vector`的工作原理和使用方法仍然有助于理解Java集合...