java核心知识之集合详解三(List集合)

List集合

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

import java.util.ArrayList;
import java.util.List;

/**
 * @author: 随风飘的云
 * @date 2022/03/19 10:43
 */
public class ListTest {
    
    
    public static void main(String[] args) {
    
    
        List list = new ArrayList();
        list.add(1);
        list.add(6);
        list.add(2);
        list.add(3);
        list.stream().forEach(System.out::println);
    }
}

结果:
在这里插入图片描述

List接口和Listlterator 接口

List接口API方法

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 0): 返回对象 。 在 List 集合中第一次出现的位置索引 。

int lastlndexOf(Object 0): 返回对象 。 在 List 集合中最后一次出现的位置索引 。

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

Object set(int index, Object element): 将 index 索引处的元素替换成element对象 ,返回被替换的旧元素 。(不能超出索引范围,不能改变索引长度)

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

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

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

List 集合可以根据位置索引来访问集合中的元素,因此 List 增加了 一种新的遍历集合元素的方法:使用普通的 for 循环来遍历集合元素 。List 判断两个对象相等的标准是只要通过 equals()方法比较返回 true 即可 。

实例代码:

import java.util.ArrayList;
import java.util.List;

/**
 * @author: 随风飘的云
 * @date 2022/03/19 11:24
 */

class student{
    
    
    public boolean equals(Object obj){
    
    
        return true;
    }
}

public class ListTest2 {
    
    
    public static void main(String[] args) {
    
    
        List list = new ArrayList();
        list.add(new String("我是谁?"));
        list.add(new String("你还是那个大爷"));
        list.add(new String("我是大爷?"));
        list.add(new String("哈哈哈哈"));
        // 输出全部
        System.out.println(list);
        System.out.println();
        // 删除第一个元素
        list.remove(new student());
        System.out.println(list);

        System.out.println();
        // 再次删除第一个元素
        list.remove(new student());
        System.out.println(list);
        System.out.println();

        // 在1的位置添加
        list.add(1,new String("我知道我是谁了"));
        // 循环输出
        for (int i = 0; i < list.size(); i++) {
    
    
            System.out.println(list.get(i));
        }
        System.out.println();
        // 两种方式遍历(创建list的时候没有指明泛型,所以只能用Object接收)
        for (Object str : list) {
    
    
            System.out.println(str);
        }
        System.out.println();
        // 删除位置1的数据并返回
        System.out.println(list.remove(2));
        // 输出第一个这个字符串的位置
        System.out.println(list.indexOf(new String("我是大爷?")));
        // 输出0到2位置的字符串
        System.out.println(list.subList(0,2));
    }
}

结果:
在这里插入图片描述
List 集合增加了 sort()和 replaceAll()两个常用的默认方法,其中 sort()方法需要一个Comparator 对象来控制元素排序,程序可使用 Lambda 表达式来作为参数:而 replaceAll()方法则需要UnaryOperator 来替换所有集合元素, UnaryOperator 也是一个函数式接口,因此程序也可使用 Lambda表达式作为参数。
实例代码

import java.util.ArrayList;
import java.util.List;

/**
 * @author: 随风飘的云
 * @date 2022/03/19 11:41
 */
public class ListTest3 {
    
    
    public static void main(String[] args) {
    
    
        List books = new ArrayList();
        // 向books集合中添加4个元素
        books.add(new String("很高兴认识你"));
        books.add(new String("你谁啊"));
        books.add(new String("我是你爸爸"));
        books.add(new String("儿子"));
        // 使用目标类型为Comparator的Lambda表达式对List集合排序
        books.sort((o1, o2)->((String)o1).length() - ((String)o2).length());
        System.out.println(books);
        // 使用目标类型为UnaryOperator的Lambda表达式来替换集合中所有元素
        // 该Lambda表达式控制使用每个字符串的长度作为新的集合元素
        books.replaceAll(ele->((String)ele).length());
        System.out.println(books);

    }
}

结果:
在这里插入图片描述

Listlterator 接口的API方法

List额外提供了一个listIteratorO方法,该方法返回一个Listlterator 对象,ListIterator接口继承了Iterator 接口,提供了专门操作 List 的方法 ,ListIterator 接口在Iterator 接口基础上增加了如下API方法 :

boolean hasPrevious(): 返回该迭代器关联的集合是否还有上一个元素 。
Object previous(): 返回该迭代器的上一个元素。
void add(Object 0): 在指定位置插入一个元素 。

Listlterator接口与Iterator接口对比

1、 Listlterator接口增加了向前迭代的功能。
2、Iterator接口只能向后迭代
3、ListIterator接口可以通过add方法向list集合中添加元素
4、Iterator接口只能删除元素

实例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/**
 * @author: 随风飘的云
 * @date 2022/03/19 11:51
 */
public class ListIteratorTest {
    
    
    public static void main(String[] args) {
    
    
        String[] books = {
    
    
                "12", "234",
                "3456"
        };
        List bookList = new ArrayList();
        for (int i = 0; i < books.length ; i++ )
        {
    
    
            bookList.add(books[i]);
        }
        ListIterator lit = bookList.listIterator();
        while (lit.hasNext())
        {
    
    
            System.out.println(lit.next());
            lit.add("-------分隔符-------");
        }
        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最显著的区别是ArrayList是线程不安全的,程序使用ArrayList类时,如果有超过一个线程改变了ArrayList,那就必须手动保证该集合的同步性。Vector类是线程安全的

1、void ensureCapacity(int minCapacity): 将 ArrayList 或 Vector 集合的Object[]数组长度增加大于或等于 minCapacity 值。
2、 void trimToSize(): 调整 ArrayList 或Vector 集合 的 Object[]数组长度为当前元素 的个数 。 调用该方法可减少 ArrayList 或 Vector集合对象占用的存储空间 。

固定List长度(Arrays工具类)

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

import java.util.Arrays;
import java.util.List;

/**
 * @author: 随风飘的云
 * @date 2022/03/19 13:44
 */
public class FixedSizeList {
    
    
    public static void main(String[] args){
    
    
        List fixedList = Arrays.asList("小红"
                , "小明是小红的同学");
        // 获取fixedList的实现类,将输出Arrays$ArrayList
        System.out.println(fixedList.getClass());
        // 使用方法引用遍历集合元素
        fixedList.forEach(System.out::println);
        // 试图增加、删除元素都会引发UnsupportedOperationException异常
        fixedList.add("老师");
        fixedList.remove("小红");
    }
}

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46198325/article/details/123586474