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)的简单实例、等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!