java集合中的list详解

1、List接口

该接口定义的元素是有序的且可重复的。相当于数学里面的数列,有序可重复

booleanaddAll(intindex,Collection<?extendsE>c);将指定集合中所有元素,插入至本集合第index个元素之后defaultvoidreplaceAll(UnaryOperatoroperator);替换集合中每一个元素值defaultvoidsort(Comparator<?superE>c);给集合中的元素进行排序Eget(intindex);获取集合中第index个元素Eset(intindex,Eelement);将集合中第index个元素替换成指定元素voidadd(intindex,Eelement);向集合中第index个位置添加一个元素Eremove(intindex);移除集合中第index个元素intindexOf(Objecto);得到指定元素在集合中的位置(第一次出现)intlastIndexOf(Objecto);得到指定元素在集合中的位置(最后一次出现)ListIteratorlistIterator();返回ListIteratorListIteratorlistIterator(intindex);返回ListIterator,并设置当前位置ListsubList(intfromIndex,inttoIndex);截取List,从fromIndex到toIndex

2、List子类

2.1、AbstractList抽象类

该类实现了基本的List集合功能,如果实现的是只读的List集合,继承自该抽象类的子类只需要实现get(intindex)和size()两个方法,如果是可操作的List集合,则必须重写add和set方法,否则执行add和set时会抛出UnsupportedOperationException异常

AbstractList抽象类中的迭代器通过get(intindex)访问元素,通过remove(Objecto)删除元素。

AbstractList抽象类包含了一个SubList子类,该子类通过包装一个AbstractList抽象类对象实现元素的添加、删除等功能。

该抽象类主要实现了如下方法:

booleanadd(Ee);添加元素e,内部调用add(intindex,Eelement)实现intindexOf(Objecto);得到指定元素第一次在集合中的位置,内部通过List迭代器实现intlastIndexOf(Objecto);得到指定元素在集合中的位置(最后一次出现),内部List迭代器实现,注意此处是从后往前迭代voidclear();清空List集合中的元素,内部通过List迭代器实现booleanaddAll(intindex,Collection<?extendsE>c);插入集合c中所有元素,内部调用add(intindex,Eelement)实现Iteratoriterator();返回一个迭代器对象,AbstractList抽象类内部实现了一个迭代器ListIteratorlistIterator();返回一个List迭代器对象,AbstractList抽象类内部实现了一个List迭代器booleanequals(Objecto);重写Object的equals方法,内部先判断是否同一个对象,是返回true,否则判断o是否是List对象,不是返回false,是的话迭代比较两个集合中每一个元素是否一致,都一致返回trueinthashCode();内部迭代集合中每一个元素计算出hashcode值ListsubList(intfromIndex,inttoIndex);得到List集合的子集合,内部通过构造AbstractList内部的SubList实现

2.2、ArrayList

ArrayList继承自AbstractList实现了List中所有方法,该集合可以插入任何元素包括null元素。

ArrayList内部使用数组保存元素,他的size、isEmpty、get、set、add等操作都是常数时间。在获取元素时会比LinkedList更有优势。

Arraylist有一个初始的大小,该大小会随着元素的增加而增长。

ArrayList不是线程安全的,在多线程环境下使用时需要注意,我们可以通过Collections.synchronizedList(newArrayList(…));操作得到一个线程安全的ArrayList

ArrayList中的迭代器在List集合结果变化后,我们调用迭代器中的方法时会快速抛出ConcurrentModificationException异常通知程序,以免造成损失。

ArrayList的扩展策略:

在初始集合为空时,加入元素时会初始化Math.max(DEFAULT_CAPACITY,minCapacity)个空间,即取插入元素个数和DEFAULT_CAPACITY中比较大的那个数

集合非空时插入元素,如果空间不够时,则取原集合大小扩展2倍和最小需求大小中较大的那个进行扩展

ArrayList重写了Iterator和ListIterator,内部直接通过遍历数组实现

ArrayList重写了SubList类,该类直接通过访问数组实现

ArrayList主要包括以下属性:

transientObject[]elementData;该对象数组用于存放集合中的元素intsize;该属性用于保存集合的大小transientintmodCount;记录ArrayList修改的次数,在集合迭代器中会使用该数字判断迭代时集合是否修改过

ArrayList主要包含以下构造函数:ArrayList(intinitialCapacity);构造初始大小为initialCapacity的集合对象ArrayList();构造一个空的数组元素ArrayList(Collection<?extendsE>c);使用传入集合c构造一个集合对象

ArrayList主要包括以下函数:

voidtrimToSize();将集合中数组大小恢复至当前集合大小,该操作可以压缩集合使用空间voidensureCapacity(intminCapacity);通过传入的minCapacity判断集合是否需要扩展,需要的话则扩展数组大小,已足够存放元素intindexOf(Objecto);得到指定元素第一次在集合中的位置,重写了AbstractList类的方法,内部直接遍历元素数组实现intlastIndexOf(Objecto);同上Objectclone();重写了clone方法,并且将元素数组复制一份出来,且将modCount致0,注意此处数组中元素并没有clone,也就是说克隆后的集合和元集合使用同一份具体元素Object[]toArray();直接返回本集合中的数组Eget(intindex);直接访问数组Eset(intindex,Eelement);直接设置数组元素值booleanadd(Ee);直接操作数组,想数组添加一个元素Eremove(intindex);直接操作数组booleanremove(Objecto);一样遍历数组,注意该操作会导致数组移动voidclear();遍历将数组致空,同时设置size大小为0booleanaddAll(Collection<?extendsE>c);通过数组直接添加voidsort(Comparator<?superE>c);实现集合中元素排序功能,接收一个Comparator用以比较集合中元素的大小

2.3、AbstractSequentialList抽象类

AbstractSequentialList是一个抽象类,继承自AbstractList抽象类

AbstractSequentialList内部基于链表实现,主要针对顺序访问list集合的情况,它在随机访问时表现较差

AbstractSequentialList的实现者需要提供listIterator和size两个实现,AbstractSequentialList内部本身通过listIterator实现了其他函数

ArrayList主要包含以下函数:

Eget(intindex);获取第index个元素,内部通过ListIterator实现Eset(intindex,Eelement);替换集合的第index个元素,内部通过ListIterator实现voidadd(intindex,Eelement);想list集合中插入元素,内部通过voidadd(intindex,Eelement)实现Eremove(intindex);删除list中第index个元素,内部通过ListIterator实现booleanaddAll(intindex,Collection<?extendsE>c);添加另一个集合中的所元素,内部通过ListIterator实现Iteratoriterator();直接调用listIterator()方法

2.4、LinkedList

LinkedList继承自AbstractSequentialList抽象类,实现了List、Deque、Cloneable、和Serializable接口

LinkedList内部基于双向链表实现,允许插入任何元素,包括null

LinkedList不是线程安全的,在多线程环境下使用时需要注意,我们可以通过Collections.synchronizedList(newLinledList(…));操作得到一个线程安全的ArrayList

LinkedList中的迭代器在List集合结果变化后,我们调用迭代器中的方法时会快速抛出ConcurrentModificationException异常通知程序,以免造成损失。

LinkedList内部使用Node类存储元素,该类包含下面三个属性,

Eitem;保存元素值得对象

Nodenext;下一个节点对象

Nodeprev;上一个节点对象

LinkedList重写了ListIterator,内部直接通过遍历链表实现迭代器功能

LinkedList主要包含以下属性

transientintsize=0;集合当前大小transientNodefirst;链表的首元素transientNodelast;链表的尾元素

LinkedListList主要包含以下构造函数:LinkedList();空构造函数LinkedList(Collection<?extendsE>c);使用另外一个集合的构造函数,会将另一个集合所有元素加入本集合中

LinkedList主要包含以下函数:

自有函数

voidlinkFirst(Ee);插入元素至第一个位置voidlinkLast(Ee);插入元素至最后一个位置voidlinkBefore(Ee,Nodesucc);在某个元素之前插入一个元素EunlinkFirst(Nodef);移除第一个元素EunlinkLast(Nodel);移除最后一个元素Eunlink(Nodex);移除指定元素EgetFirst();得到第一个元素EgetLast();得到最后一个元素EremoveFirst();移除第一个元素EremoveLast();移除最后一个元素voidaddFirst(Ee);插入第一个元素voidaddLast(Ee);插入最后一个元素Nodenode(intindex);返回index对应的Node节点

List函数

booleancontains(Objecto);是否包含某个元素intsize();返回集合大小,直接返回size变量booleanadd(Ee);添加一个元素,调用linkLast(e);booleanremove(Objecto);删除指定元素,通过遍历链表删除booleanaddAll(Collection<?extendsE>c);将集合c插入至本集合,链表插入voidclear();遍历链表,清空所有元素,将首尾元素制空Eget(intindex);获取第index个元素,通过node(index)得到node节点Eset(intindex,Eelement);替换第index个元素,通过node(index)得到node节点,然后设置值voidadd(intindex,Eelement);在第index位置插入元素,调用linkBefore(element,node(index));Eremove(intindex);删除第index个元素,通过unlink(node(index));实现intindexOf(Objecto);得到o对象在集合中的位置(第一次出现),通过遍历链表实现,从头部开始遍历intlastIndexOf(Objecto)得到o对象在集合中的位置(最后一次出现),通过遍历链表实现,从尾部开始遍历

Deque函数Epeek();返回第一个元素,但不删除。直接去first首元素,集合空时,返回nullEelement();返回第一个元素,但不删除。集合空时抛出异常,调用getFirst();Eremove();获得并移除队列顶部元素,如果队列为空抛出异常,调用removeFirstEpoll();获得并移除队列顶部元素,如果队列为空返回null调用unlinkFirst(f)booleanoffer(Ee);队列尾部插入元素,调用add(e)booleanofferFirst(Ee);队列首部插入元素,调用addFirst(e);booleanofferLast(Ee);队列尾部插入元素,调用addLast(e)EpeekFirst();返回首元素EpeekLast();返回最后一个元素,不删除,空时返回nullEpollFirst();获得并移除队列顶部元素,如果队列为空返回null调用unlinkFirst(f)EpollLast();获得并移除队列尾部元素,如果队列为空返回null调用unlinkLast(f)voidpush(Ee);向首部插入元素,调用addFirst(e);,栈方法Epop();返回并移除首元素,调用removeFirst();,栈方法booleanremoveFirstOccurrence(Objecto);删除第一次出现o的元素,调用remove(o);函数booleanremoveLastOccurrence(Objecto);删除最后一次出现o的元素,从后向前遍历链表,匹配后移除

2.5、Vector

功能和ArrayList类似,不同的是Vector是线程安全的,其大部分方法都加了synchronized关键字以保证多线程环境下线程安全问题。不过在可以确保没有线程安全问题的情况下,我们还是应该选择ArrayList,因为ArrayList的效率要比Vector高。

2.6、CopyOnWriteArrayList

CopyOnWriteArrayList继承Object,实现了List,RandomAccess,Cloneable,java.io.Serializable接口

CopyOnWriteArrayList是

CopyOnWriteArrayList内部使用数组保存元素,但是它的数组大小等于集合的大小,因为它的增加、删除、修改元素都是新copy一份数组

CopyOnWriteArrayList是线程安全的,他的写操作加锁,读操作没有加锁,适用于读多写少的情况

CopyOnWriteArrayList实现了Iterator和ListIterator,内部通过遍历数组实现,但是它的迭代器不支持操作元素。会抛出UnsupportedOperationException

CopyOnWriteArrayList主要包含以下属性:

finaltransientReentrantLocklock;CopyOnWriteArrayList内部使用的线程同步锁transientvolatileObject[]array;集合内部用于保存元素的地方

CopyOnWriteArrayList主要包含以下构造函数:

CopyOnWriteArrayList();构造一个空的集合CopyOnWriteArrayList(Collection<?extendsE>c);创建一个包括闯入集合所有元素的集合CopyOnWriteArrayList(E[]toCopyIn);创建一个包含传入数组所有元素的集合,注:此处会copy原有数组。

CopyOnWriteArrayList主要包括以下函数:

finalObject[]getArray();得到集合持有的数组对象voidsetArray(Object[]a);设置集合的数组对象intsize();返回集合大小,直接返回数组的长度booleanisEmpty();判断集合是否为空booleancontains(Objecto);判断集合是否包含某元素intindexOf(Objecto);得到传入元素在集合中第一次出现的位置索引intindexOf(Ee,intindex);得到传入元素在集合中第一次出现的位置索引,从index开始查找intlastIndexOf(Objecto);得到传入元素在集合中最后一次出现的位置索引,从集合尾部开始查找lastIndexOf(Ee,intindex);得到传入元素在集合中出现的位置索引,从集合index开始往前查找Objectclone();返回集合的clone,集合的元素没有被cloneObject[]toArray();转换成数组,此处返回的是数组的copyT[]toArray(Ta[]);转换成数组,如果传入数组小于当前集合,重新申请一块空间,否则使用数组a,当数组a大于集合长度时将数组a的临近集合元素的第一个元素设置成null,可以方便用户在知道集合不含null元素时判断集合的大小Eget(intindex);获取集合的index索引元素Eset(intindex,Eelement);设置集合的index元素的值booleanadd(Ee);往集合中添加元素voidadd(intindex,Eelement);插入元素至指定位置Eremove(intindex);移除指定位置的元素booleanremove(Objecto);移除第一次出现元素ovoidremoveRange(intfromIndex,inttoIndex);移除范围内的所有元素booleanaddIfAbsent(Ee);当集合中不包含该元素时,添加该元素booleanaddIfAbsent(Ee,Object[]snapshot);当集合中不包含该元素且传入数组中也不包含该元素时,添加该元素booleancontainsAll(Collection<?>c);判断集合是否全部包含传入集合的元素booleanremoveAll(Collection<?>c);移除集合中c中所有元素booleanretainAll(Collection<?>c);移除集合中所有不在c中的元素intaddAllAbsent(Collection<?extendsE>c);遍历c,当c中元素不在集合中时,加入至集合voidclear();清空集合booleanaddAll(Collection<?extendsE>c);将集合c中所有元素加入至集合中booleanaddAll(intindex,Collection<?extendsE>c);将集合c中所有元素插入至index后

2.7、Stack

Stack继承自Vector,他表示一种后进先出的数据结构,即栈。他拥有五种基本的操作即push、pop、peek、empty、search

Stack继承自Vector,所以它也是线程安全的

Stack继承自Vector,所以它内部也是用数组存储元素的

Stack自定义函数如下

Epush(Eitem);向栈顶添加一个元素Epop();从栈顶取出并删除一个元素Epeek();得到栈顶元素booleanempty();判断栈是否为空intsearch(Objecto);查找o的位置,存在返回距栈顶位置,否则返回-1

总结

以上就是本文关于java集合中的list详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java编程通过list接口实现数据的增删改查代码示例、Java实现跳跃表(skiplist)的简单实例、详解java各种集合的线程安全等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

(0)

相关推荐

  • java实现jdbc查询结果集result转换成对应list集合

    代码非常的简单,这里就不多废话了,直接奉上 public static <T> List<T> convertToList(ResultSet rs,Class<T> t) throws SQLException { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); ResultSetMetaData md = (ResultSet

  • java中List集合及其遍历详解

    1. 首先List<E>集合继承与Collection<E>,是一个接口. ①  Collection (集合框架是JDK1.2版本出现的) ②   list:是有序的,元素可以重复,以为该集合体系有索引.    经常用到的是实现该接口的ArrayList和LinkedList类 ③   Arraylist:  底层的数据结构使用的是数组结构, 特点: 查询速度很快,但是增删稍慢.线程不同步 LinkedList: 底层使用的是链表数据结构. 特点: 增删速度很快,查询稍慢. Ve

  • Java中对List集合的常用操作详解

    目录: 1.list中添加,获取,删除元素: 2.list中是否包含某个元素: 3.list中根据索引将元素数值改变(替换): 4.list中查看(判断)元素的索引: 5.根据元素索引位置进行的判断: 6.利用list中索引位置重新生成一个新的list(截取集合): 7.对比两个list中的所有元素: 8.判断list是否为空: 9.返回Iterator集合对象: 10.将集合转换为字符串: 11.将集合转换为数组: 12.集合类型转换: 备注:内容中代码具有关联性. 1.list中添加,获取,

  • java ArrayList集合中的某个对象属性进行排序的实现代码

    开发中有时候需要自己封装分页排序时,List如何对某一属性排序呢,分享一个小实例,大家共勉,希望能对大家有用,请多多指教. 1.Student的Bean如下: public class Student { private int age; private String name; private String weight; public String getWeight() { return weight; } public void setWeight(String weight) { th

  • 解析Java中的队列和用LinkedList集合模拟队列的方法

    API中对队列的说明: public interface Queue<E> extends Collection<E> 在处理元素前用于保存元素的 collection.除了基本的 Collection 操作外,队列还提供其他的插入.提取和检查操作.每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作).插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的:在大多数实现中,插入操作不会失败. 队列通常(但

  • Java中Json字符串直接转换为对象的方法(包括多层List集合)

    使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-beanutils.jar,commons-httpclient.jar,commons-lang.jar,ezmorph.jar,morph-1.0.1.jar 下面是例子代码: // JSON转换 JSONObject jsonObj = JSONObject.fromObject(jsonStr

  • java集合中的list详解

    1.List接口 该接口定义的元素是有序的且可重复的.相当于数学里面的数列,有序可重复 booleanaddAll(intindex,Collection<?extendsE>c);将指定集合中所有元素,插入至本集合第index个元素之后defaultvoidreplaceAll(UnaryOperatoroperator);替换集合中每一个元素值defaultvoidsort(Comparator<?superE>c);给集合中的元素进行排序Eget(intindex);获取集合

  • java 虚拟机中对象访问详解

    java 虚拟机中对象访问详解 对象访问会涉及到Java栈.Java堆.方法区这三个内存区域. 如下面这句代码: Object objectRef = new Object(); 假设这句代码出现在方法体中,"Object objectRef" 这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现.而"new Object()"这部分将会反映到Java堆中,形成一块存储Object类型所有实例数据值的结构化内存,根据具体类型以及虚拟机实现的

  • Java JVM中线程状态详解

    目录 线程在JVM中的状态 线程在JVM中的状态转换 前言: 在Java面试中,线程的状态也是被经常考察的知识点,今天我们就来聊一聊线程状态的那些事! 线程在JVM中的状态 查看线程在JVM中有哪些不同的状态,最简单的方式是查看Jdk源码的Thread.State类.以下内容来自JDK文档.在JVM中,一个线程可能处于下面的六种状态中的一种: NEW A thread that has not yet started is in this state. 没有开始执行的线程处于这种状态 RUNNA

  • java多线程中线程封闭详解

    线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现.也是最糟糕的一种线程封闭.所以我们直接把他忽略掉吧. 2:栈封闭 栈封闭是我们编程当中遇到的最多的线程封闭.什么是栈封闭呢?简单的说就是局部变量.多个线程访问一个方法,此方法中的局部变量都会被拷贝一分儿到线程栈中.所以局部变量是不被多个线程所共享的,也就不会出现并发问题.所

  • Java集合之HashMap用法详解

    本文实例讲述了Java集合之HashMap用法.分享给大家供大家参考,具体如下: HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap 中作为键的对象必须重写Object的hashCode()方法和equals()方法 import java.util.Map; import java.util.HashMap; public class lzwCode { public static void main(String [] args) { M

  • Java集合Stack源码详解

    概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. 第1部分 Stack介绍 Stack简介 Stack是栈.它的特性是:先进后出(FILO, First In Last Out). java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表.当然,我们也可以

  • java/jsp中 中文问题详解

    预备知识: 1.字节和unicode Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式 是使用字节流的. 因此Java要对这些字节流经行转化.char是unicode的,而byte是字节. Java中byte/char互转的函数在sun.io的包中间有.其中ByteToCharConverter类是中调度, 可以用来告诉你,你用的Convertor.其中两个很常用的静态函数是 public static ByteToCharConverter getD

  • HttpClient 在Java项目中的使用详解

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性.因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入. 一.简介 HttpClient是Apache Jakarta Common下的子项目,用

  • 四种引用类型在JAVA Springboot中的使用详解

    目录 概念介绍 01.  强引用 02.  软引用 03.  弱引用 04.  虚引用 对象可达性 Springboot源码中的使用 总结 概念介绍 不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响. 01.  强引用 这个就是我们创建的普通对象了~ 当该对象被显示地赋值为 null 时,或者没有被其他存活的对象继续引用时,它就会成为垃圾收集器的目标,等待被收回 02.  软引用 软引用( SoftReference ) , 当内存不足 时会被回收 比如

  • Java集合框架之Map详解

    目录 1.Map的实现 2.HashMap和Hashtable的区别 3.介绍下对象的hashCode()和equals(),使用场景 4.HashMap和TreeMap应该怎么选择,使用场景 5.Set和Map的关系TODO 6.常见Map的排序规则是怎样的? 7.如果需要线程安全,且效率高的Map,应该怎么做? 8.介绍下HashMap 9.什么是Hash碰撞?常见的解决办法有哪些,hashmap采用哪种方法? 10.HashMap底层是数组+链表+红黑树,为什么要用这几类结构呢? 11.为

随机推荐