集合(3)——List集合

List集合

List集合代表一个元素有序,可重复的集合,集合中每个元素都有其对应的顺序索引.List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元素索引为1.

1.List接口和ListIterator接口

List作为Collection的子接口,当然可以使用Collection接口里的全部方法,而且由于List是有序集合,因此List集合中添加了一些根据索引来操作集合元素的方法。

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在List集合中最后一次出现的位置索引。

Object remove(int index):删除兵返回index索引处的元素

Object set(int index,Object element):将index索引处的元素替换成element对象,返回被替换的旧元素。

List subList(int fromIndex,int toIndex):返回从索引fromIndex到索引toIndex处所有集合元素组成的子集合。

void replaceAll(UnaryOperator operator):根据operator指定的计算规则重新设置List集合的所有元素。

void sort(Comparator c):根据Comparator参数对List集合的元素排序。

import java.util.*;

public class ListTest
{
    public static void main(String[] args) {
        List<String> books = new ArrayList<String>();
        //向books集合中添加三个元素
        books.add(new String("龙珠"));
        books.add(new String("犬夜叉"));
        books.add(new String("网球王子"));
        books.add(null);

        System.out.println(books);
        //将新字符串对象插入在第二个位置
        books.add(1, new String("海贼王"));
        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("海贼王")));
        //将第二个元素替换成新的字符串对象
        books.set(1,new String("海贼王"));
        System.out.println(books);
        //将books集合的第二个元素(包括)到第三个元素(不包括)截取成子集合
        System.out.println(books.subList(1,2));
    }
}

测试结果:

注意:List判断两个对象是否相等的标准,只要两个对象通过equals()方法返回true即可。

import java.util.*;
class A{
    public boolean equals(Object obj) {
        return true;
    }
}

public class ListTest2{
    public static void main(String[] args) {
        List<Object> list = new ArrayList<Object>();
        list.add(new String("龙珠"));
        list.add(new String("棋魂"));
        list.add(new String("游戏王"));
        System.out.println(list);
        //list删除一个A对象,将list中的第一个元素删除
        list.remove(new A());
        System.out.println(list);
        //将再次删除第一个元素
        list.remove(new A());
        System.out.println(list);
    }
}

测试结果:

通过上面这段代码可以看出,List集合是通过equals()方法判断两个元素是否相同。

Java8为List集合增加了sort()和repalceAll()两个常用的默认方法,其中sort()方法需要一个Comparator对象来控制元素排序,程序可使用Lambda表达式来作为参数;而replaceAll()方法则需要一个UnaryOperator来替换所有集合元素,UnaryOperator也是一个函数式接口,因此程序也可使用Lambda表达式作为参数。

import java.util.*;

public class ListTest3{
    public static void main(String[] args) {
        List<Object> list = new ArrayList<Object>();
        list.add("死神");
        list.add("海贼王");
        list.add("灌篮高手");
        list.add("进击的巨人");
        list.add("钢之炼金术师");
        list.add("棋魂");
        //将list按字符串长度顺序排序
        list.sort((o1,o2) -> ( ((String)o1).length() - ((String)o2).length()));
        System.out.println(list);
        //将list集合中的字符串替换成对应的字符串长度
        list.replaceAll(ele -> (((String)ele).length()));
        System.out.println(list);
    }
}

测试结果:

上面程序对List集合进行了排序,传给sort()方法的Lambda表达式指定的排序规则是:字符串长度越长,字符串越大。

与Set只提供了一个iterator()方法不同,List还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口基础上增加了如下方法:

boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素

Object previous():返回该迭代器的上一个元素。

void add(Object o):在指定位置插入一个元素。

import java.util.*;

public class ListIteratorTest{
    public static void main(String[] args) {
        String[] arr = {"龙珠","犬夜叉","游戏王","海贼王","死神","灌篮高手"};
        List<String> list = new ArrayList<String>();
        for(int i = 0; i < arr.length; i++) {
            list.add(arr[i]);
        }
        ListIterator lit = list.listIterator();
        while(lit.hasNext()) {
            System.out.println(lit.next());
        }

        //开始反向遍历
        System.out.println("===================");
        while(lit.hasPrevious()) {
            System.out.println(lit.previous());
        }

    }
}

测试结果:

猜你喜欢

转载自www.cnblogs.com/blogforvi/p/9359755.html