什么是List集合?
List集合代表一个元素有序、可重复的集合,集合中的每个元素都有其对应的顺序索引。可以通过索引来访问指定位置的集合元素。默认暗元素的添加顺序设置元素的索引,索引从0开始。
java8中改进的List接口和Listlterator接口
void add(int index,Object element)
:将元素element插入到List集合的index处;boolean addAll(int index,Collection c)
:将集合c所包含的所有元素插入到List集合的index处。Object get(int index):
返回集合index索引处的元素。int indexOf(Object o):
返回对象o在List集合中第一次出现的位置索引。int lastIndexOf(Object o):
返回对象o在集合中最后一次出现的位置。Object remove(int index):
删除并返回index索引处的元素。Object set(int index ,Object element):
将index出的元素替换成element对象。如果索引超出范围,则不会改变list。List subList(int fromIndex,int toIndex):
返回从索引fromIndex到索引toIndex出所有集合元素组成的子集合,含头不含尾。void replaceAll(UnaryOperator operator)
:根据operator指定的计算规则重新设置List集合的所有元素。void sort(Comparator c):
根据Comparator参数对List集合的元素进行排序。
Java8为List集合增加了sort()和replaceAll()两个常用的默认方法,其中sort方法需要一个Cmpatator对象来控制元素排序,程序可使用Lambda表达式来作为参数。而replaceAll()方法则需要一个UnaryOperator来替换所有集合元素UnaryOperator也是一个函数式接口,所以可以使用Lambda表达式作为参数。
List books= new ArrayList();
books.add("Java");
books.add("Python");
books.add("C++");
books.add("go语言");
//使用目标类型为Comperator的Lambda表达式来对List集合进行排序
//比较对象字符串长度
books.sort((a,b)->((String)a).length()-((String)b).length());
System.out.println(books);//[C++, Java, go语言, Python]
//使用目标类型为UnaryOperator的Lambda表达式来替换集合中的所有元素
//替换每个字符串为字符串长度
books.removeAll(ele->((String)ele).length());
迭代
与Set只提供一个iterator()方法不同,List额外提供了一个listIterator()方法,该方法发法返回ListIterator对象。
boolean hasPrevious()
:返回迭代器关联的集合是否还有上一个元素。Object previous()
:返回该迭代器的上一个元素。void add(Object o)
:在指定位置插入一个元素。
与普通Iterator相比listIterator增加了向前迭代的功能,而且还提供了add方法向List集合中添加元素。
List books= new ArrayList();
books.add("Java");
books.add("Python");
books.add("C++");
books.add("go语言");
ListIterator lit = books.listIterator();
while (lit.hasNext()){
System.out.println(lit.next());
lit.add("------分隔符---------");
}
System.out.println("——-----下面开始反推迭代———----");
while (lit.hasPrevious()){
System.out.println(lit.previous());
}
/*Java
Python
C++
go语言
——-----下面开始反推迭代———----
------分隔符---------
go语言
------分隔符---------
C++
------分隔符---------
Python
------分隔符---------
Java*/
ArrayList和Vector实现类
ArrayList和Vector作为List类的两个实现类,完全支持前面介绍的List接口的全部功能。
ArrayList和Vector类封装了一个动态的、允许再分配的数组。ArrayList或Vector对象使用initalCapacity参数来设置该数组的长度,当向这两个对象中添加元素时,initalCapacity会自动增加。通常无序关心这个参数,但是如果向ArrayList或Vector集合中添加大量元素时可使用ensureCapacity(int minCapacity)
方法一次性地增加initalCapacity。这样减少分配次数,提高性能。
如果知道集合需要保存元素个数,则可以在创建时指定initCapacity,如果不指定。默认为10。
除此之外还提供了两个方法来重新分配Object()数组:
void ensureCapacity(int minCapacity)
:将ArrayList和Vector集合的Object[]数组长度增加大于或等于minCapacity值。void trimToSize()
:调整集合的Object[]数组长度为当前元素的个数。调用该方法可以减少集合对象占用的存储空间。
ArrayList和Vector的区别
ArrayList是线性不安全的,不同步,但是性能比较后者好;
Vector是线性安全的,同步,性能较差,以前的Vector的方法名较长。
建议优先考虑ArrayList实现类。
Vector还提供了一个Stack子类,它用于模拟"栈"这种数据结构。
提供如下方法:
Object peek():
返回“栈”的第一个元素,但并不将该元素"pop"出栈;Object pop()
:返回“栈”的第一个元素,并将该元素“pop”出栈。void push(Object item)
:将一个元素“push”出栈,最后一个进“栈”的元素总是位于“栈”顶。
固定长度的List
操作数组的工具类:Arrays,该工具类里提供了asList(Obeject…a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合。这个List集合是Arrays的内部类ArrayList的实例。
Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。
List list = Arrays.asList("python", "java", "C++");
//获取fixedList的实现类,将输出Array$ArrayList
System.out.println(list.getClass());
//使用方法引用遍历集合元素
list.forEach(System.out::println);
//增加删除元素会引发UnsupportedOperationException异常
list.add("go语言");
list.remove("python");