List 接口有两个实现类,ArrayList 与LinkedList
如果排序用ArrayList 如果经常删写改 操作用 LinkedList,为什么会有这样一说法呢,我们从两个类的源码来分析。
ArrayList:
如果排序用ArrayList 如果经常删写改 操作用 LinkedList,为什么会有这样一说法呢,我们从两个类的源码来分析。
ArrayList:
数据存储类型是:
private transient Object[] elementData;//就是一个普通的对象数据。 public boolean add(E e) {//增加对象的方法,可以看出是把数组的大小改变为size+1,然后把老的对象数据复制到新的对象数据 ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e;//最后把新添加进来的值放到最后一个位置 return true; }
public void add(int index, E element) { //从index开始把位置往后移一位,所以效率会比较低
if (index > size || index < 0)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
LinkedList:
数据存储类型是:<!--WizRtf2Html Charset=0 -->private transient Entry<E> header = new Entry<E>(null, null, null);
以对象链表存储数据
private static class Entry<E> {
E element;//当前
Entry<E> next;//下
Entry<E> previous;//前
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;this.next = next;this.previous = previous;}
}
private Entry<E> addBefore(E e, Entry<E> entry) {//所有的ADD方法都是调用这个,
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
private E remove(Entry<E> e) { //删除的话只是把前一个和后一个的对象重新指向一个,然后把当然要删除的对象置为空
if (e == header)
throw new NoSuchElementException();
E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
e.next = e.previous = null;
e.element = null;
size--;
modCount++;
return result;
}
所以总结出来,排序用ArrayList(对象数组) 经常删写改 操作用 LinkedList(链表)
相关推荐
// 常用的list接口的实现类有ArrayList和LinkedList // 学习map对象容器的使用 // map对象容器里面储存的元素是(key,value)形式的键值对,比如(a,1)(b,20)(c,55) // key不可以重复,value可以重复 // 常用的map接口...
List相关实现类的源码解析(JDK1.8) 2018.9.22- List的架构图 ArrayList 继承关系: ArrayList -> AbstractList 实现 List接口 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态...
Java集合类是Java.util包中的重要内容,它提供了一套性能优良、使用方便的接口...List接口的实现类包括ArrayList、LinkedList等。 Set接口是无序的集合,元素不能重复。Set接口的实现类包括HashSet、LinkedHashSet等。
- 常见实现类有ArrayList、LinkedList和Vector等。 2. Set(集合): - 不允许重复元素。 - 不维护元素的插入顺序,元素存储的顺序可能发生变化。 - 提供了高效的查找和去重功能。 - 常见实现类有HashSet、TreeSet和...
1、List,Set,map都是继承自Collection接口,... 3、List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet Collection / / /
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中操作字符串都有哪些类?它们之间有什么区别? 如何将字符串反转? String 类的常用方法都有那些? 接口和抽象...
18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可...
在Java中,容器(Container)指的是...Map用于存储键值对(Key-Value Pair)的数据,它的实现类有HashMap、TreeMap、LinkedHashMap等。Map中的键是唯一的,每个键对应一个值。通过键可以快速查找对应的值,这使得Map
java线程中容器使用技术,比如List接口是在Collection的基础上添加了大量方法,有两种基本类型:ArrayList,它擅⻓于随机访问元素,但是List中间插入或移除元 素时较慢;LinkedList,它和ArrayList的特性正好相反。...
List被AbstractList实现,然后分为3个子类,ArrayList,LinkedList和VectorList List是一种有序链表,本身是一个泛型接口,元素可以重复,可以是 null 包含以下方法: 遍历List // for循环 List list = ...; for...
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...
18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 9 19、是否可以继承String 类? 9 20、以下二条语句返回值为true 的有: 10 21、当一个对象被当作参数传递到一个方法后,此方法可...
11.3.1 实现类ArrayList277 11.3.2 实现类LinkedList279 11.3.3 实现类Vector281 11.4 Map接口283 11.4.1 实现类HashMap284 11.4.2 实现类LinkedHashMap285 11.4.3 实现类TreeMap286 11.4.4 实现类Properties287 ...
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它...
对于List接口, ArrayList是最常用的实现。 对于Map接口, HashMap是最常用的实现。 对于Queue接口, LinkedList是最常用的实现。 对于Deque接口, ArrayDeque是最常用的实现。 还包括针对Vecto
使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的destroy()方法有什么后果? 58.多线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 59.使用socket建立客户端...
69、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的...
辨别抽象类与接口的异同点。 清楚如何通过向上转型(引用的隐式转型),方法重写,运行期绑定来实现多态性。 体会多态性如何使系统可扩展和可维护。 理解运行时判定引用对象的类型...