A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 若意锐锐 初级黑马   /  2019-4-3 18:33  /  910 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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实现了其他函数

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马