java 数据类型:集合接口Collection之List~ArrayList:remove移除;replaceAll改变原有值;sort排序;迭代器listIterator();  什么是List集合: Arrays.ArrayList: 长度不可变

java 数据类型:集合接口Collection之List~ArrayList:remove移除;replaceAll改变原有值;sort排序;迭代器listIterator();
 什么是List集合:
Arrays.ArrayList: 长度不可变

特点:

  • 元素有序可重复的集合。
  • 集合中每个元素都有其对应的顺序索引。
  • List集合默认按元素的添加顺序设置元素的索引,索引从0开始。
 
List接口的常用方法:
List可以使用Collection的所有方法。但是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集合中第一次出现的位置
  • 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集合中的所有元素(java8+)。
  • void sort(Comparator c) : 根据Comparator参数对List集合的元素排序。

remove移除

移除指定下标或相同对象(对象的equal方法判断)的第一个元素;有限精确匹配,传入数字优先判断下标

原理:List在remove的时候,就是调用equals方法来判断两个元素是否相等的,并且是调用remove方法参数的equals:

import java.util.ArrayList;

/**
 * @ClassName ArrayListRemoveExample
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/10.
 */
public class ArrayListRemoveExample {
    private static class TestObj{
        @Override
        public boolean equals(Object obj) {
            return true;
        }
    }
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add("张三");
        arrayList.add("李四");
        arrayList.add("王五");
        arrayList.add("赵六");
        System.out.println(arrayList);
        arrayList.remove(1); //精确匹配原则,数字优先匹配下标
        arrayList.remove("王五"); //其次匹配对象
        System.out.println(arrayList);

        //测试移除原理,是调用需要移除对象的equal方法判断是否和已有元素相等
        arrayList.remove(new TestObj());
        System.out.println(arrayList); //张三被移除
    }
}

replaceAll处理数据并改变原有值

import java.util.ArrayList;
import java.util.function.UnaryOperator;

/**
 * @ClassName ArrayListReplaceAllExample
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/10.
 */
public class ArrayListReplaceAllExample {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        //数据处理
        arrayList.replaceAll( o -> {
            int tmpNum = (int)o;
            return tmpNum * tmpNum;
        });
        System.out.println(arrayList); //[1, 4, 9]
    }
}

sort对ArrayList集合内元素重新排序

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.NavigableMap;

/**
 * @ClassName ArrayListSortExample
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/10.
 */
public class ArrayListSortExample {
    public static void main(String[] args) {
        List nums = new ArrayList();
        nums.add(3);
        nums.add(2);
        nums.add(4);
        nums.add(1);
        System.out.println(nums);   //[3, 2, 4, 1]
        //自定义排序
        nums.sort(new Comparator() {
            @Override
            public int compare(Object o, Object t1) {
                return  (int)o - (int)t1;
            }
        });
        System.out.println(nums); //[1, 2, 3, 4]
        nums.sort((o1, o2) ->  (int)o2 - (int)o1);  //lambda方式
        System.out.println(nums);   //[4, 3, 2, 1]
    }
}

List迭代器listIterator():

除了继承Collection接口的iterator()方法,List还提供了一个listIterator()方法,该方法返回一个ListIterator()对象。ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator在Iterator的基础上增加了三个方法:
  • boolean hasPrevious() : 返回迭代器关联的结合是否还有上一个元素
  • boolean previous(): 返回迭代器的上一个元素
  • void add(Object o): 在当前游标所在位置插入一个元素
import java.util.ArrayList;
import java.util.ListIterator;

/**
 * @ClassName ArrayListListIteratorExample
 * @projectName: object1
 * @author: Zhangmingda
 * @description: XXX
 * date: 2021/4/10.
 */
public class ArrayListListIteratorExample {
    public static void main(String[] args) {
        ArrayList persons = new ArrayList();
        persons.add("张三");
        persons.add("李四");
        persons.add("王五");
        ListIterator listIteratorPersons = persons.listIterator();
        listIteratorPersons.add("赵六");  //游标位置0
        System.out.println(persons);//[赵六, 张三, 李四, 王五]
        while (listIteratorPersons.hasNext()){
            System.out.println(listIteratorPersons.next());
        }
        listIteratorPersons.add("赵六");//游标位置: 对象.length-1
        System.out.println(persons); //[赵六, 张三, 李四, 王五, 赵六]
    }
}

Arrays.ArrayList: 长度不可变

我们还可以用Arrays.asList来创建一个List
List persons = Arrays.asList("李一桐", "刘亦菲", "鞠婧祎"); persons.forEach(person -> System.out.println(person));
 
persons.add("易烊千玺"); //这行代码直接报错
 
这个List是一个ArrayList,但是我们要注意,这个是Arrays类里面一个叫做ArrayList的内部类,不是我们前面学的java.util包下面的ArrayList。这个List长度是固定不可变的。如果我们调用add方法添加元素,直接抛出异常。