Java List集合

List集合

List集合是有序,可重复的集合。
每个元素都有其对应的顺序索引。
List 是 Collection 的子接口。

public interface List<E> extends Collection<E> {
    // Query Operations
}

List新增了一些根据索引操作元素的方法。

  • add(): 将元素插入到指定位置。
  • addAll(): 将集合所有元素插入到指定位置。
  • get(): 返回索引处元素
  • indexOf(): 第一次出现的索引
  • lastIndexOf(): 最后一次出现的索引
  • remove():删除并返回指定位置元素
  • set():指定位置元素替换
  • subList(): 截取子集合
  • sort(): 根据 Comparator 排序
  • replaceAll(): 根据计算规则重新设置List集合所有元素

List判断两个对象相等的标准是根据 equals()方法返回值。

class F{
    @Override
    public boolean equals(Object obj) {
        return true;
    }
}
public class HashSetTest {
    public static void main(String[] args){
        List list = new ArrayList();
        list.add(new String("A"));
        list.add(new String("B"));
        list.add(new String("C"));
        System.out.println(list);
        System.out.println(list.indexOf(new F()));

        list.remove(new F());
        System.out.println(list);
        list.remove(new F());
        System.out.println(list);
	}
}

//Output
[A, B, C]
0
[B, C]
[C]

由于F类重新了equals()方法,总是返回true, 所以 indexOf , remove等方法总是返回第一个元素。遍历对比,第一个元素就返回true了。

List排序sort()需要 Comparator 对象。
replaceAll()需要 UnaryOperator 对象,都是函数式接口, 可以使用Lambda表达式.

        List list = new ArrayList();
        list.add(new String("Apple"));
        list.add(new String("Pear"));
        list.add(new String("Orange"));

        list.sort(((o1, o2) -> ((String) o1).length() - ((String) o2).length()));
        System.out.println(list);
        list.replaceAll(o -> ((String) o).length());
        System.out.println(list);
 //Output
[Pear, Apple, Orange]
[4, 5, 6]       

除了 iterator(), List还提供了 listIterator()方法, 用于迭代。返回 ListIterator 对象, 继承了 Iterator 接口。
增加了下面方法:
hasPrevious() : 是否有上一个
previous(): 返回上一个
add():指定位置插入一个
增加了向前迭代功能。

        List list = new ArrayList();
        list.add(new String("Apple"));
        list.add(new String("Pear"));
        list.add(new String("Orange"));

        ListIterator lit = list.listIterator();
        while (lit.hasNext()){
            System.out.println(lit.next());
        }
        System.out.println("反向迭代");
        while (lit.hasPrevious()){
            System.out.println(lit.previous());
        }
 //Output
Apple
Pear
Orange
反向迭代
Orange
Pear
Apple

ArrayList和Vector实现类

ArrayList 和 Vector 是 List的两个实现类, 都是基于数组实现的List。封装了一个动态的,允许再分配的 Object[]数组。
使用 initialCapacity 参数设置数组的长度。当添加的元素超过数组长度时,它们的 initialCapacity 会自动增加。
当一次添加大量元素时, 可以使用 ensureCapacity() 方法一次性增加initialCapacity, 这样减少重分配的次数,从而提高性能。

trimToSize() : 调整ArrayList 和 Vector的 Object[] 数组长度为当前个数, 减少占用存储空间。

Vector和 ArrayList用法基本相同, 非常古老,性能较差, 一般不推荐使用。
ArrayList是线程不安全的, Vector是线程安全的。
为了线程安全,可以使用Collections工具类, 可以将ArrayList 变成线程安全的。
Vector还有一个 Stack 子类,模拟 栈数据结构, 后进先出LIFO, 同样不推荐使用, 要使用 栈数据结构,可以使用 ArrayDeque.

固定长度的List

数组工具类 Arrays, 提供一个asList() 方法,将数组转换成一个List集合。
这个List集合不是ArrayList或Vector的实现类, 而是 Arrays的内部类ArrayList 的实例。
Arrays.ArrayList是固定长度的List, 只能遍历, 不能增加和删除。

        List fixList = Arrays.asList("Apple", "Pear");
        System.out.println(fixList.getClass());
        fixList.forEach(System.out::println);
        fixList.add("Orange");
    
 //Output
 class java.util.Arrays$ArrayList
Apple
Pear

Exception in thread "main" java.lang.UnsupportedOperationException

调用 add()会抛出异常 UnsupportedOperationException。

地址:https://blog.csdn.net/yonggang7/article/details/86751836

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值