一个ordered collection,也叫sequence(序列)。该界面的用户可以精确控制列表中每个元素的插入位置,用户可以通过其整数索引(列表中的位置)访问元素,并在列表中搜索元素。
与Sets不同,List通常允许重复的元素(List判断两者相等的标准是equals())。更正式地说,列表通常允许成对的元素e1和e2,使得e1.equals(e2),并且如果它们完全允许空元素,则它们通常允许多个空元素。
List作为Collection的子接口,除了Collection中的所有方法外,还新加了一些根据索引来操作集合元素的方法:
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List lt = new ArrayList();
lt.add("All");
lt.add("around");
lt.add("the");
lt.add("world");
System.out.println(lt);
lt.add(1,"the"); //在index为1的地方插入"the"
for (int i =0;i<lt.size();i++){
System.out.println(lt.get(i)); //返回index为i的元素
}
//删除index为1的元素
lt.remove(1);
System.out.println(lt);
//返回"the"的index
System.out.println(lt.indexOf("the"));
//将index为2的元素替换为"THE"
lt.set(2,"THE");
System.out.println(lt);
//截取子集合 2(包括) 到 4(不包括)
System.out.println(lt.subList(2,4));
}
}
输出结果
[All, around, the, world]
All
the
around
the
world
[All, around, the, world]
2
[All, around, THE, world]
[THE, world]
无论是添加操作还是删除操作,List只要是需要判断两者是否为同一个对象,或者是否相等时,都是通过equals方法(可以由添加的对象的类中进行重写)来判断的。
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class ListTest {
public static void main(String[] args){
List ls = new ArrayList();
ls.add("What");
ls.add("do");
ls.add("you");
ls.add("mean");
/**
* sort方法需要一个Comparator对象来控制元素排序,可以使用lambda表达式作为参数
* List默认是由从小到大来排的,但可以通过Comparator对象来改变排序规则
*/
ls.sort((o1,o2)-> ((String)o1).length()>((String)o2).length()? 1:((String)o1).length()==((String)o2).length()?1:-1);
System.out.println(ls);
/**
* replaceAll方法需要一个UnaryOperator来替换所有的集合元素,UnaryOperator也是一个函数式接口,
* 也可以用lambda表达式作为参数
*/
//使用目标类型为UnaryOperator的lambda表达式来替换集合中的所有元素
//该lambda表达式控制使用每个字符串的长度作为新的集合元素
ls.replaceAll(ele->((String)ele).length());
System.out.println(ls);
}
}
输出结果
[do, you, What, mean]
[2, 3, 4, 4]
与Set只提供了一个Iterator()方法不同,List还额外提供了一个listIterator()方法,该方法返回一个listIterator对象。ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口的基础上增加了以下用法:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListTest2 {
public static void main(String[] args) {
String[] ly = {
"my","mom","don't","like","you",",but","she","likes","everyone"
};
List ls = new ArrayList();
for (int i = 0;i<ly.length;i++){
ls.add(ly[i]);
}
ListIterator listIterator = ls.listIterator();
while (listIterator.hasNext()){
System.out.println(listIterator.next());
//ListIterator还可以通过add()方法向List集合中添加元素
//Iterator只能删除元素(remove())
listIterator.add("--");
}
System.out.println("=====================下面开始反向迭代======================");
while (listIterator.hasPrevious()){ //boolean hasPrevious():返回迭代器关联的集合是否还有上一个元素
System.out.println(listIterator.previous()); //Object previous():返回该迭代器的上一个元素
}
}
}
输出结果
my
mom
don't
like
you
,but
she
likes
everyone
=====================下面开始反向迭代======================
--
everyone
--
likes
--
she
--
,but
--
you
--
like
--
don't
--
mom
--
my
ArrayList和Vector都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的、允许再分配的Object[]数组。
ArrayList和Vector对象使用initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组的长度时,它们的initialCapacity会自动增加(也就是再分配),一般来讲,不用关心initialCapacity。但如果向Vector或ArrayList添加大量元素时,可以使用ensureCapacity(int minCapacity)
方法来一次性地增加initialCapacity,这可以减少重分配的次数,从而提高性能。
当创建ArrayList和Victor不指定initialCapacity参数,则默认为10
还有一个方法:trimToSize()
:调整ArrayList或Vector集合的Object[]数组长度为当前元素个数。这可以减少ArrayList和Vector集合对象占用的存储空间。
Vector和ArrayList在用法上几乎完全相同,但由于Vector是一个古老的集合(since
1.0),那时Java还没有提供系统的集合框架,所以Vector里提供了一些方法名很长的方法,例如:addElement(Object o)其实和add(Object
o)没有任何区别。从JDK1.2后,Java提供了系统的集合框架,就将Vector改为实现List的接口,作为List的实现之一,从而导致Vector里有一些功能重复的方法。Vector的系列方法中方法名更短的方法属于后来新增的方法,方法名更长的则是Vector原有的方法。Java改写了Vector原有的方法,将其方法名缩短是为了简化编程。而ArrayList开始就作为List的主要实现类,因此没有那些方法名很长的方法。
除此之外,ArrayList和Vector的显著区别是:
ArrayList是线程不安全的(也就是说不同步的),当多个线程访问同一个ArrayList集合时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。
但Vector是线程安全的,无须保证该集合的同步性,但由于要维护同步,Vector的性能要比ArrayList低。
参考学习:
arrayList和vector的区别
import java.util.Arrays;
import java.util.List;
/**
* 有一个操作数组的工具类:Arrays,该工具类中提供了asList(Object o1,o2...)方法
* 该方法可以把一个数组或指定个数的对象转换为一个List集合,
* 但这个集合既不是Arraylist实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类Arraylist的实例
*
* Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。
*/
public class ArrayListTest {
public static void main(String[] args) {
List fixed = Arrays.asList(1,2);
//获取fixed的实现类将输出java.util.Arrays$ArrayList
System.out.println(fixed.getClass());
System.out.println(fixed);
//使用方法遍历元素
fixed.forEach(System.out::println);
//进行添加或删除操作,会抛出UnsupportedOperationException异常
fixed.add(3);
fixed.remove(1);
}
}
List 集合 和 ArrayList Vector ListIterator等相关
原文:https://www.cnblogs.com/woshi123/p/12503169.html