网站首页 > java教程 正文
List概述
List属于Java集合系统一员。List本身是一个interface继承了Collection接口。List中定义各种对集合的操作,List的具体实现包括ArrayList、Vector和LinkedList等,List所处位置如下图所示(非完整图):
List提供了特殊迭代器ListIterator,该迭代器提供了双向迭代访问集合的功能。 接口方法如下所示:
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
List具体实现类
List实现类主要包括ArrayList、Vector和LinkedList。
ArrayList
ArrayList类关系图如下所示:
注意:
其中RandomAccess接口只是个标记表面该接口的具体实现可以支持随机访问,RandomAccess本身不定义任何东西;
Cloneable接口作为支持field-for-field拷贝标记,如果实现该接口,会报”CloneNotSupportedException”错误;
Serializable序列号接口标记;serialVersionUID建议显示指定,因为不同的java编译器自动生成serialVersionUID的时候可能不一样,会报”InvalidClassException”错误
ArrayList底层数据结构为数组,因此支持随机访问
Object[] elementData
contain方法是通过遍历实现,因此时间复杂度线性的
扩容机制
ArrayList的扩容机制相对来说比较简单,如下所示:
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
通常情况下一次扩容后大小为原来的三倍。
fail-fast
fail-fast是Java集合的一种错误检测机制。在用迭代器对List进行遍历的时候,如果有其它线程对List进行了结构性修改,则会报: ConcurrentModificationException。
不要在foreach中对元素进行remove/add操作。如果需要remove元素请用iterator方式,并发操作的时候需要加锁。
modCount
记录对list进行结构化修改的次数,所谓结构化修改(Structurally modified)即改变list大小的操作
removeAll()
删除指定的集合元素
方法定义:
public boolean removeAll(Collection<?> c)
底层调用batchRemove方法,batchRemove方法基本思想就是会一边遍历List一边把不在指定集合中的原始往前挪,源代码如下所示:
private boolean batchRemove(Collection<?> c, boolean complement) {
final Object[] elementData = this.elementData;
int r = 0, w = 0;
boolean modified = false;
try {
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
} finally {
// Preserve behavioral compatibility with AbstractCollection,
// even if c.contains() throws.
if (r != size) {
System.arraycopy(elementData, r,
elementData, w,
size - r);
w += size - r;
}
if (w != size) {
// clear to let GC do its work
for (int i = w; i < size; i++)
elementData[i] = null;
modCount += size - w;
size = w;
modified = true;
}
}
return modified;
}
获取子串subList
由源码可知获取子串是由定义的SubList类实现,其实获取并未重新开辟空间,引用的还是原始的数据;
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
Spliterator可拆分迭代器
Spliterator用于遍历和对源数据进行分区,源数据可以是数组,集合,IO通道或者是生成函数;Spliterator可以单独遍历元素(tryAdvance)或者批量遍历元素(forEachRemaining)
主要方法
1) trySplit
并行操作时,可以通过trySplit方法将spliterator划分为另外一个spliterator
2) characteristics
包括spliterator特性,特性包括:DISTINCT, SORTED,SIZED,NOTNULL, IMMUTABLE,CONCURRENT,SUBSIZED
该特性被定义为4个字节的int类型,如:
public static final int DISTINCT = 0x00000001;
public static final int SORTED = 0x00000004;
public static final int SIZED = 0x00000040;
具体使用时候通过按位与判断数据所具有的特性,如ArrayListSpliterator中该方法定义如下:
public int characteristics() {
return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED;
}
3)estimateSize
评估剩余访问元素的大小
ArrayListSpliterator
略
非线程安全
ArrayList本身是非线程安全的。
Vector
Vector和ArrayList实现类似,底层数据结构也是数组,Vector是线程安全的而ArrayList是非线程安全的;Vector方法由synchronized修饰,从而保证线程安全;
扩容策略
当变量capacityIncrement <= 0时候 扩容为原先数组大小的两倍,否则扩容capacityIncrement
LinkedList
LinkedList双端链表,实现了List和deque接口,非线程安全,如果要支持线程安全,需要从外部进行保证,如可以通过Collections.sychronizedList进行封装,如下所示:
List list = Collections.synchronizedList(new LinkedList());
linkedList在集合系统中所处位置如下所示:
ListIterator迭代器
ListIterator继承Iterator实现了List的迭代访问,ListIterator主要定义了hasNext(), next(), hasPrevious(), previous()等一系列方法,LinkedList定义内部累ListItr改类实现ListIterator接口,通过ListItr达到链表双向访问的目的
toArray方法
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
其它
Arrays.copyOf
Arrays.copyOf(T[] original, int newLength) 在调用的时候会创建新的数组,底层实际上是通过调用System.arraycopy实现的
Arrays.sort
底层为归并排序
猜你喜欢
- 2024-11-02 java中判断list不为空的工具类(java list 判断空)
- 2024-11-02 如何在Java 8中处理对象类型的List集合:交集、并集、差集及去重
- 2024-11-02 java 集合类之List(二)(java中集合类有哪些)
- 2024-11-02 面试官问线程安全的List,看完再也不怕了
- 2024-11-02 Java List集合遍历数据的八种方式
- 2024-11-02 Java代码更高效地遍历List(java怎么遍历list)
- 2024-11-02 java集合框架(List集合的特有功能概述和测试)
- 2024-11-02 Java中List 和 Map、Set 的区别(java中list,set,map的区别)
- 2024-11-02 java集合List接口(java集合linkedlist)
- 2024-11-02 Java 17 List 接口详解(java list 排序)
你 发表评论:
欢迎- 07-15采用Oracle OSB总线进行服务注册和接入
- 07-15javaEE 新闻管理系统 oracle11+tomcat6
- 07-15从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 07-15如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 07-15【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 07-15【mykit-data】 数据库同步工具(数据库表同步工具)
- 07-15[Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- 07-15Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- 最近发表
-
- 采用Oracle OSB总线进行服务注册和接入
- javaEE 新闻管理系统 oracle11+tomcat6
- 从Oracle演进看数据库技术的发展(oracle数据库发展史)
- 如何升级oracle数据库安全补丁(oraclepsu补丁升级)
- 【权威发布】关于Oracle WebLogic Server未授权远程代码执行高危漏洞的预警通报
- 【mykit-data】 数据库同步工具(数据库表同步工具)
- [Java速成] 数据库基础,Connector/J、JDBC、JPA的关系(day 7)
- Google前工程主管“入住”Oracle(google浏览器找不到以前的书签)
- Oracle数据库云服务系列新增前所未有的企业级功能
- 直播预告丨如何实现Oracle存储过程到java的一键转化
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)