List集合
- List集合是一个元素有序,可重复的集合,集合中每个元素都有其对应的顺序索引
- List集合允许重复使用元素,可以通过索引来访问指定位置的集合元素
- List集合默认按照元素的添加顺序设置元素的索引,索引从0开始
- 以下是List接口的一些特殊方法体现
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List l = new ArrayList();
l.add("yjh728");
l.add("YJH");
l.add("728");
l.add("728");
System.out.println(l);
//remove()函数只会删除第一个相同的元素,不会删除所有相同的元素
l.remove("728");
System.out.println(l);
//List新增的一种遍历方式
for (Object obj : l) {
System.out.println((String) obj);
}
System.out.println(l);
l.add(1, "728");
System.out.println(l);
//输出某索引处元素
System.out.println(l.get(2));
//输出某元素第一次出现的索引值
System.out.println(l.indexOf("728"));
//输出某元素最后一次出现的索引值
System.out.println(l.lastIndexOf("728"));
//对指定索引出元素进行替换
l.set(1, "0728");
System.out.println(l);
//两个元素相等(equals返回true)即删除
l.remove("0728");
System.out.println(l);
//截取一个List集合,从第一个参数开始(包括), 第二个参数截至(不包括)
System.out.println(l.subList(0, 2));
}
/*
运行结果:
[yjh728, YJH, 728, 728]
[yjh728, YJH, 728]
yjh728
YJH
728
[yjh728, YJH, 728]
[yjh728, 728, YJH, 728]
YJH
1
3
[yjh728, 0728, YJH, 728]
[yjh728, YJH, 728]
[yjh728, YJH]
*/
}
- Java8为List结合增加了sort()和replaceAll()两个常用的默认方法
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
List l = new ArrayList();
l.add("yjh728");
l.add("YJH");
l.add("728");
//为List集合设置排序方法,参数为Compator,是一个函数式接口,Java8新增的方法
l.sort((o1, o2) -> ((String) o1).length() - ((String) o2).length());
System.out.println(l);
//替换全部元素,参数是UnaryOperator,也是一个函数式接口,以Lambda表达式作为替换规则
//Java8新增的方法
l.replaceAll(ele -> ((String) ele).length());
System.out.println(l);
}
/*
运行结果:
[yjh728, YJH, 728]
[YJH, 728, yjh728]
[3, 3, 6]
*/
}
- List相对于Set额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,该类在Iterator类的基础上增加了向前迭代的功能
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorTest {
public static void main(String[] args) {
List l = new ArrayList();
l.add("yjh");
l.add("728");
l.add("YJH728");
ListIterator lt = l.listIterator();
// ConcurrentModificationException异常
// 使用ListIterator或Iterator迭代器后不能对集合列表直接进行操作,只能通过迭代器来进行列表的修改
// l.add("99");
while (lt.hasNext()) {
System.out.println((String) (lt.next()));
lt.add("========================");
}
System.out.println("下面开始反迭代");
while (lt.hasPrevious()) {
System.out.println((String) (lt.previous()));
}
System.out.println(l);
}
/*
运行结果:
yjh
728
YJH728
下面开始反迭代
========================
YJH728
========================
728
========================
yjh
[yjh, ========================, 728, ========================, YJH728, ========================]
*/
}
ArrayList实现类
- ArrayList是线程不安全的
- ArrayList集合是List接口的典型实现,它是基于数组实现的List类
- ArrayList类封装了一个动态的、允许在分配的Object[]数组。
- 它的实例(对象)可以通过initialCapacity参数来设置该数组的长度
- 创建对象时若不指定initialCapacity参数,系统自动为数组设置长度为10
- 当元素超过数组长度时,initialCapacity会自动增加,但是当添加大量数据时会增加initialCapacity自动增加的次数,导致性能下降
- 因此,当大量改变元素的个数时,可以通过ensureCapacity()方法和trimToSize()方法来重新分配Object[]数组
- void ensureCapacity(int minCapacity):将赎罪长度增加大于或等于minCapacity值
- void trimToSize()调整数组长度为当前元素的个数,可以减少集合对象占用的储存空间
Vector实现类
- Vector是线程安全的,因此性能比ArrayList性能差
- Vector实现类与ArrayList实现类在用法上几乎完全相同,在这里不多做叙述
- Vector在JDK1.0就出现了,有很多的缺点,一般不建议使用Vector实现类、
- Vector还提供了一个Stack子类,可以实现栈的功能,因出现较早,所以性能较差,仍不建议使用,若想实现栈的功能,可以选择使用ArrayDeque类
数组长度固定的List
import java.util.Arrays;
import java.util.List;
public class FixedSizeList {
public static void main(String[] args) {
//这个List是Arrays内部类ArrayList的实例
//不是ArrayList实现类的实例,也不是Vector实现类的实例
List fixedSize = Arrays.asList("yjh", "728", "yjh728");
System.out.println(fixedSize);
//UnsupportedOperationException异常,该集合不允许删除元素
//fixedSize.remove(2);
//UnsupportedOperationException异常,该集合不允许添加元素
//fixedSize.add("990728");
}
//运行结果:[yjh, 728, yjh728]
}