西宁网站制作哪里好,做网站是如果盈利的,深圳企业网站制作公司单位,安徽网站推广营销设计List集合 List集合类中元素有序、且可重复#xff0c;集合中的每个元素都有其对应的顺序索引。 List容器中的元素都对应一个整数型的序号记载其在容器中的位置#xff0c;可以根据序号存取容器中的元素。 JDK API中List接口的实现类常用的有#xff1a;ArrayList、LinkList和…List集合 List集合类中元素有序、且可重复集合中的每个元素都有其对应的顺序索引。 List容器中的元素都对应一个整数型的序号记载其在容器中的位置可以根据序号存取容器中的元素。 JDK API中List接口的实现类常用的有ArrayList、LinkList和Vector。 List集合里添加了一些根据索引来操作集合元素的方法 一、ArrayList
ArrayList是List接口的典型实现类本质上ArrayList是对象引用的一个变长数组。
ArrayList是List接口的可变数组的实现。实现了所有可选列表操作并允许包括null在内的所有元素。除了实现List接口外此类还提供了一些方法来操作内部用来存储列表的数组的大小。
每个ArrayList实例都有一个初始容量该容量用来储存列表元素的数组大小。默认初始容量为10。
ArrayList底层采用数组实现。数组都有一个重大的缺陷这就是从数组的中间位置删除一个元素要付出很大的代价其原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。在数组中间位置插入一个元素也是如此数据的copy。
注Arrays.asList(…) 方法返回的 List 集合既不是 ArrayList 实例也不是 Vector 实例。 Arrays.asList(…)返回值是一个固定长度的 List 集合。
1.ArrayList的存取实现
1.1存储
ArrayList提供了一下添加元素的方法
**add(E element)**方法将指定的元素添加到列表的尾部
**add(int index, E element)**方法将指定的元素插入此列表的指定位置如果当前位置有元素则向右移动当前位于该位置的元素以及所有后续元素将其索引值加1
**set(int index, E element)**方法替换数组中已经存在的元素内容
**addAll(Collection? extends E c)**方法按照指定Collection的迭代器所返回的元素顺序将该Collection中的所有元素添加到此列表的尾部。
**addAll(int index, Collection? extends E c)**方法从指定的位置开始将指定collection中的所有元素插入到此列表中
1.2读取
**get(int index)**方法获取指定位置上的元素
2.总结
ArrayLlist内部是由数组来实现的。在存放数据的数组长度不够时会进行扩容即增加数组长度。扩展为原来的1.5倍。由于是数组来实现所以优点是查找元素很快。可以通过下标查找元素查找效率高。缺点是每次添加和删除元素都会进行大量的数组元素移动。长度不够会扩容。效率底下。ArrayList每次的增、删、改操作都伴随着数组的复制和元素的移动。这意味着新的内存空间的开辟。
二、LinkedList
LinkedList其实也就是我们在数据结构中的链表这种数据结构有这样的特性
分配内存空间不是必须是连续的插入、删除操作很快只要修改前后指针就OK了时间复杂度为O(1)访问比较慢必须得从第一个元素开始遍历时间复杂度为O(n)
在Java中LinkedList提供了丰富的方法可以模拟链式队列链式堆栈等数据结构为用户带来了极大的方便下面看看这些方法的用法
add
boolean add(E e)在链表后添加一个元素如果成功返回true否则返回false
void addFirst(E e)在链表头部插入一个元素
addLast(E e)在链表尾部添加一个元素
void add(int index, E element)在指定位置插入一个元素。remove
E remove()移除链表中第一个元素
boolean remove(Object o)移除链表中指定的元素
E remove(int index)移除链表中指定位置的元素
E removeFirst()移除链表中第一个元素与remove类似
E removeLast()移除链表中最后一个元素
boolean removeFirstOccurrence(Object o)移除链表中第一次出现所在位置的元素
boolean removeLastOccurrence(Object o)移除链表中最后一次出现所在位置的元素get:
E get(int index)按照下边获取元素
E getFirst()获取第一个元素
E getLast()获取最后一个元素push、pop、poll:
void push(E e)与addFirst一样实际上它就是addFirst
E pop()与removeFirst一样实际上它就是removeFirst
E poll()查询并移除第一个元素pushpop的操作已经很接近stack的操作了。如果链表为空的时候poll返回null而pop则产生异常。
peek:
E peek()获取第一个元素但是不移除
E peekFirst()获取第一个元素但是不移除
E peekLast()获取最后一个元素但是不移除offer:
boolean offer(E e)在链表尾部插入一个元素
boolean offerFirst(E e)与addFirst一样实际上它就是addFirst
boolean offerLast(E e)与addLast一样实际上它就是addLast其他:
boolean contains(Object o) 如果此列表包含指定的元素方法返回true。
E element() 此方法返回此列表的头部
E set(int index,E element) 此方法替换在与指定元素在此列表中指定位置的元素。
subList(int index, int index) 方法是在给定的ArrayList集合中获取给定下标的子集合。注意范围是[)。三、Vector
Vector 可实现自动增长的对象数组。
java.util.vector提供了向量类(Vector)以实现类似动态数组的功能。 创建了一个向量类的对象后可以往其中随意插入不同类的对象即不需顾及类型也不需预先选定向量的容量并可以方便地进行查找。
对于预先不知或者不愿预先定义数组大小并且需要频繁地进行查找插入删除工作的情况可以考虑使用向量类。
向量类提供了三种构造方法
public vector()
public vector(int initialcapacity,int capacityIncrement)
public vector(int initialcapacity)使用第一种方法系统会自动对向量进行管理若使用后两种方法则系统将根据参数initialcapacity设定向量对象的容量即向量对象可存储数据的大小当真正存放的数据个数超过容量时。系统会扩充向量对象存储容量。
参数capacityincrement给定了每次扩充的扩充值。当capacityincrement为0的时候则每次扩充一倍利用这个功能可以优化存储。
在Vector类中提供了各种方法方便用户的使用
1.插入功能
1public final synchronized void adddElement(Object obj)
将obj插入向量的尾部。obj可以是任何类型的对象。对同一个向量对象亦可以在其中插入不同类的对象。但插入的应是对象而不是数值所以插入数值时要注意将数组转换成相应的对象。
2public final synchronized void setElementAt(Object obj,int index)
将index处的对象设置成obj原来的对象将被覆盖。
3public final synchronized void insertElementAt(Object obj,int index)
在index指定的位置插入obj原来对象以及此后的对象依次往后顺延。
2.删除功能
1public final synchronized void removeElement(Object obj)
从向量中删除obj,若有多个存在则从向量头开始试删除找到的第一个与obj相同的向量成员。
2public final synchronized void removeAllElements();
删除向量所有的对象
3public fianl synchronized void removeElementAt(int index)
删除index所指的地方的对象
3.查询搜索功能
1public final int indexOf(Object obj)
从向量头开始搜索obj,返回所遇到的第一个obj对应的下标若不存在此obj,返回-1.
2public final synchronized int indexOf(Object obj,int index)
从index所表示的下标处开始搜索obj.
3public final int lastIndexOf(Object obj)
从向量尾部开始逆向搜索obj.
4public final synchornized int lastIndex(Object obj,int index)
从index所表示的下标处由尾至头逆向搜索obj.
5public final synchornized firstElement() 获取向量对象中的首个obj
6public final synchornized Object lastElement() 获取向量对象的最后一个obj
4.其他功能
1public final int size(); 此方法用于获取向量元素的个数。它们返回值是向量中实际存在的元素个数而非向量容量。可以调用方法capacity()来获取容量值。
2public final synchronized void setSize(int newsize); 此方法用来定义向量的大小若向量对象现有成员个数已经超过了newsize的值则超过部分的多余元素会丢失。
程序中定义Enumeration类的一个对象Enumeration是java.util中的一个接口类
3public final synchronized Enumeration elements();
此方法将向量对象对应到一个枚举类型。java.util包中的其他类中也都有这类方法以便于用户获取对应的枚举类型。
在Enumeration中封装了有关枚举数据集合的方法。 方法 hasMoreElement() 来判断集合中是否还有其他元素。
方法 nextElement() 来获取下一个元素
PS同时也有一个结论 Vector是有序的可以重复的。
四、ArrayList、LinkedList、Vector的底层实现和区别
List 有序 可重复 有索引。三者均为可伸缩数组。
ArrayList底层数据结构是数组结构。 线程不安全的。 所以ArrayList的出现替代了Vector 但是查询的速度很快。默认扩充为原来的1.5倍。
LinkedList底层是链表数据结构。 线程不安全的 同时对元素的增删操作效率很高。但查询慢。
Vector底层数据结构是数组结构。 jdk1.0版本。 线程安全的。 无论增删还是查询都非常慢。默认扩充为原来的2倍。
Vector 和 ArrayList都是基于存储元素的Object[ ] array来实现的。
LinkedList是采用双向列表来实现的。
1、 线程同步Vector线程安全ArrayList线程不安全。
2、 效率问题Vector效率低ArrayList效率高。
3、 增长数量Vector以1.5倍增长ArrayList以2倍增长。
List集合子类Vector这个类已经不常用了 我就说里面的一个方法 Elements方法 这个方法的返回值是枚举接口 里面有两个方法 判断和获取。此接口Enumeration的功能与 Iterator 接口的功能是重复的。Enumeration的名称和方法的名称过程 书写很麻烦。 所以被Iterator所取代。
ArrayList是实现了基于动态数组的数据结构LinkedList基于双线链表的数据结构。
ArrayList可以随机定位对于新增和删除操作add和removeLinedList比较占优势
具有Collection接口必备的iterator()方法外List还提供一个listIterator()方法ListIterator多了一些add()之类的方法允许添加删除设定元素还能向前或向后遍历。
Vector与ArrayList唯一的区别是Vector是线程安全的即它的大部分方法都包含有关键字synchronized因此若对于单一线程的应用来说最好使用ArrayList代替Vector因为这样效率会快很多类似的情况有StringBuffer线程安全的与StringBuilder线程不安全的而在多线程程序中为了保证数据的同步和一致性可以使用Vector代替ArrayList实现同样的功能。