Java学习笔记一List集合

List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List判断两个对象相等只要通过equals方法比较返回true即可

List接口

Java 8改进了List接口和ListIterator接口:List作为Collection接口的子接口,当然可以使用Collection接口里额全部方法。而且由于List是有序集合,因此List集合里增加了一些根据索引来操作集合元素的方法,还为List接口添加了如下两个默认方法:
void replaceAll(UnaryOperator operator):根据operator指定的计算规则重新设置List集合的所有元素。void sort(Comparator c):根据Comparator参数对List集合的元素排序。sort方法需要一个Comparator对象来控制元素排序,程序可使用Lambda表达式来作为参数;而replaceAll方法需要一个UnaryOperator来替换所有集合元素,UnaryOperator也是一个函数式接口,因此程序也可使用Lambda表达式作为参数。

import java.util.ArrayList;
import java.util.List;
public class ListTest {
    public static void main(String[] args) {
        List books = new ArrayList();
        // 向books集合中添加三个元素
        books.add(new String("轻量级Java EE企业应用实战"));
        books.add(new String("疯狂Java讲义"));
        books.add(new String("疯狂Andriod讲义"));
        System.out.println(books);
        // 将新字符串对象插入在第二个位置
        books.add(1, new String("疯狂Ajax讲义"));
        for(int i = 0; i < books.size(); i++){
            System.out.println(books.get(i));
        }
        // 删除第三个元素
        books.remove(2);
        System.out.println(books);
        // 判断指定元素在List集合中的位置:输出1,表明位于第二位
        System.out.println(books.indexOf(new String("疯狂Ajax讲义")));
        // 将第二个元素替换成新的字符串对象
        books.set(1, new String("疯狂Java讲义"));
        System.out.println(books);
        // 将books集合的第二个元素(包括)到第三个元素(不包括)截取成子集合
        System.out.println(books.subList(1, 2));
    }
}

在这里插入图片描述

List book1 = new ArrayList();
// 向book1集合中添加4个元素
book1.add(new String("轻量级Java EE企业应用实战"));
book1.add(new String("疯狂Java讲义"));
book1.add(new String("疯狂Andriod讲义"));
book1.add(new String("疯狂iOS讲义"));
// 使用目标类型为Comparator的Lambda表达式对List集合排序
book1.sort((o1,o2)->(((String)o1).length()-((String)o2).length()));
System.out.println(book1);
// 使用目标类型为UnaryOperator的Lambda表达式来替换集合中所有元素
// 该Lambda表达式控制使用每个字符串的长度作为新的集合元素
book1.replaceAll(ele->((String)ele).length());
System.out.println(book1);

在这里插入图片描述

程序试图删除一个A对象,List将会调用该A对象的equals方法依次与集合元素进行比较,如果该equals方法以某个集合元素作为参数时返回true,List将会删除该元素-A类重写了equals方法,该方法总是返回true。所有每次从List集合中删除A对象时,总是删除List集合中的第一个元素。

class A
{
    @Override
    public boolean equals(Object obj) {
        return true;
    }
}
public class ListTest {
    public static void main(String[] args) {
        List bookA = new ArrayList();
        bookA.add(new String("轻量级Java EE企业应用实战"));
        bookA.add(new String("疯狂Java讲义"));
        bookA.add(new String("疯狂Andriod讲义"));
        System.out.println(bookA);
        //删除集合中的A对象,将导致第一个元素被删除
        bookA.remove(new A());
        System.out.println(bookA);
        //删除集合中的A对象,再次删除集合中的第一个元素
        bookA.remove(new A());
        System.out.println(bookA);
    }

}

在这里插入图片描述

ListIterator

与Set只提供了一个iterator()方法不同,LIst还额外提供了一个listIterator方法,该方法返回一个ListIterator对象,ListIterator接口继承自Iterator接口,提供了专门操作List方法。ListIterator接口在Iterator接口基础上增加了如下方法:boolean has Previous()返回该迭代器关联的集合是否还有上一个元素,Object previous()返回该迭代器的上一个元素,void add(Object o)在指定位置插入一个元素。ListIterator增加了向前迭代的功能(Iterator只能向后迭代),而且ListIterator还可以通过add()方法向List集合中添加元素(Iterator只能删除元素)。

String[] book = {"轻量级Java EE企业应用实战", "疯狂Java讲义", "疯狂Andriod讲义", "疯狂iOS讲义"};
List bookList = new ArrayList();
for(int i = 0; i < book.length; i++)
	bookList.add(book[i]);
ListIterator lit = bookList.listIterator();
while(lit.hasNext())
    System.out.println(lit.next());
System.out.println("===反向迭代===");
while(lit.hasPrevious())
	System.out.println(lit.previous());

在这里插入图片描述

ArrayList和Vector实现类

ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector封装了一个动态的允许再分配的Object[]数组。ArrayList和Vector对象使用initialCapacity参数来设置该数组的长度,当向ArrayList和Vector中添加元素超出了该数组的长度时,它们的initialCapacity会自动增加。如果向ArrayList和Vector集合中添加大量元素时,可使用ensureCapacity(int minCapacity)方法一次性地增加initialCapacity。这样可以减少重分配的次数,提供性能。如果开始就知道ArrayList和Vector集合要保存多少个元素,则可再创建它们时就指定initialCapacity大小。如果创建空的ArrayList或Vector集合时不指定initialCapacity参数,则Object[]数组的长度默认为10。ArrayList和Vector提供了如下两个方法重新分配Object[]数组:void ensureCapacity(int minCapacity()将ArrayList和Vector集合的Object[]数组长度增加大于或等于minCapacity值,void trimToSize()调整ArrayList和Vector集合的Object[]数组长度为当前元素的个数。调用该方法可减少ArrayList和Vector集合对象占用的存储空间。
Vector是一个古老的集合(从JDK 1.0就有了),那时候还没有提供集合框架,所以Vector里提供了一些方法名很长的方法,例如addElement(Object obj),实际上这个方法与add(Object obj)没有任何区别。从JDK 1.2以后,Java提供了系统的集合框架,就将Vector改为实现List接口,作为List的实现之一,从而导致Vector里有一些功能重复的方法。Vector的系列方法中方法名更短的方法属于后来新增的方法,方法名更长的方法则是Vector原有的方法。而ArrayList开始就作为List的主要实现类,因此没有那些方法名很长的方法。ArrayList是线程不安全的,必须手动保证该集合的同步性;但Vector集合是线程安全的,无序保证同步性。
Vector还提供了一个Stack子类,用于模拟栈,提供可如下方法peek、pop、push。由于Stack继承了Vector,因此也是古老的Java集合类,它同样是线程安全的、性能较差的。

固定长度的List

工具类Arrays提供了asList(Object… a)方法,把一个数组或指定个数的对象转换一个List集合,这个List集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例。Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。

public class FixedSizeList
{
	public static void main(String[] args)
	{
		List fixedList = Arrays.asList("疯狂Java讲义", "轻量级Java EE企业应用实战");
		// 获取实现类,输出Arrays$ArrayList
		System.out.println(fixedList.getClass());
		// 使用方法引用遍历集合元素
		fixedlist.forEach(System.out::println);
		// 试图增加、删除元素都会引发UnsupportedOperationException异常
		fixedList.add("疯狂Andriod讲义");
		fixedList.add("疯狂Java讲义");
	}
}

在这里插入图片描述

发布了136 篇原创文章 · 获赞 143 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/asmartkiller/article/details/105091508