Java容器常见操作

一、针对List常见操作

1. List集合转数组

List集合中提供toArray方法,toArray有两个重载的方法:

  • list.toArray(),将list直接转为Object[] 数组;
  • list.toArray(T[] a),将list转化为你所需要类型的数组,但注意要和list数据类型一致。

list集合转数组

2. 判断List集合中是否存在某个字符串

使用 java.util.List.contains(Object)

  • list中接口方法contains
boolean contains(Object o);
  • ArrayList中接口方法的实现
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}
  • indexof方法
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

一般情况下我们没有重写equals()方法,这时就会调用继承自object类的equals()方法,而object的equals()方法,实际就是 ==,对于引用数据类型而言,==比较的是内存地址。

public boolean equals(Object obj) {
   return (this == obj);
}

所以对于一个对象而言,用contains判断List<Pojo>是否存在某一个对象是不行的,除非重写equals()方法,像List<String>,String类重写了equals()方法,比较的是对象的内容。
判断List集合中是否有某个字符串或整数

3. 针对ArrayList自定义排序的2种实现方法

  • 1)让需要进行排序的对象的类实现Comparable接口,重写compareTo(To)方法,在其中定义排序规则,然后就可以直接调用Collections.sort()来排序对象数组。
public class Student implements Comparable{
   ......
    @Override
    public int compareTo(Object o) {
      ......
    }
}
public class Test {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student(1, "A", 20, 180));
        list.add(new Student(2, "B", 21, 175));
        list.add(new Student(3, "C", 22, 190));
        list.add(new Student(4, "D", 21, 170));

        Collections.sort(list);
		......
    }
}
  • 2)实现比较器接口Comparator,重写compare方法,直接当做参数传进sort中。
public class Test {

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student(1, "A", 20, 180));
        list.add(new Student(2, "B", 21, 175));
        list.add(new Student(3, "C", 22, 190));
        list.add(new Student(4, "D", 21, 170));
        list.add(new Student(5, "E", 20, 185));
        
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                if(o1.getAge() >= o2.getAge()) {
                    return 1;
                }
                else {
                    return -1;
                }
            }
        });
       ......
    }
   
}

4. List集合去重

// 创建一个ArrayList 包含两个相同元素"111"
List<String> list = new ArrayList<String>();
list.add("111");
list.add("111");
list.add("222");
  • 使用Set集合特性
// 创建HashSet集合
Set set = new HashSet();
set.addAll(list);     // 将list所有元素添加到set中    set集合特性会自动去重复
list.clear();
list.addAll(set);    // 将list清空并将set中的所有元素添加到list中
  • 使用java8 stream api
// Collectors.toList方法是获取list类型的收集器  distinct方法进行去重  collect进行转换
// list2就是去重后得到的结果,可以看出java8的stream api使用很方便。
List<Object> list2 = list.stream().distinct().collect(Collectors.toList());

5. List集合如何遍历时删除数据?

  • 使用官方推荐的Iterator迭代器提供的Iterator.remove方法在遍历集合时删除集合元素;
  • 使用Java 8新增的removeIf方法在遍历集合时删除集合元素。
/**
 * 使用Iterator的方式也可以顺利删除和遍历,不会有任何问题,这才是删除变量List中元素的正确方式
 */
public static void iteratorRemove() {
    List<Student> list = new ArrayList<>();
    for (int i = 1; i <= LIST_SIZE; i++) {
        list.add(new Student(i, "Student" + i));
    }

    Iterator<Student> iterator = list.iterator();
    long millionSeconds = System.currentTimeMillis();
    while (iterator.hasNext()) {
        Student student = iterator.next();
        if (student.getId() % CONDITION_NUM == 0) {
            iterator.remove();
        }
    }
    System.out.println("iteratorRemove操作耗时:" + (System.currentTimeMillis() - millionSeconds));
}

/**
 * 也可以使用Java 8新增的removeIf方法在遍历时删除List中的元素,该方法也使用Iterator了,所以删除是安全的
 */
public static void ifRemove() {
    List<Student> list = new ArrayList<>();
    for (int i = 1; i <= LIST_SIZE; i++) {
        list.add(new Student(i, "Student" + i));
    }

    long millionSeconds = System.currentTimeMillis();
    list.removeIf(student -> student.getId() % CONDITION_NUM == 0);
    System.out.println("ifRemove操作耗时:" + (System.currentTimeMillis() - millionSeconds));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值