Java中的List接口及实现类

278 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

Java中的List接口、Set接口及实现类

掌握:

       List接口及其实现类的特点及相关方法的用法;

集合元素遍历的5种方式:

       1、普通for循环配合List接口中的size()和get()方法

       2、使用Iterator迭代器及其方法

              a:通过集合对象获取迭代器对象

              b:通过迭代器对象的hasNext()方法判断有没有元素

              c:通过迭代器对象的next()方法获取元素并移动到下一个元素位置

       3、使用增强for循环

       JDK5的新特性:

              自动拆装箱,增强for,泛型。

       增强for:

              是for循环的一种,本质上是迭代器。

       格式:

              for(元素数据类型  变量 : 数组或者Collection集合) {

                     使用变量即可,该变量就是元素

              }  

       好处:

              简化了数组和集合的遍历。的成员变量值是否相同。

       4、使用JDK 8——forEach

              forEach(Consumer action)方法是JDK 8中新增的遍历集合元素的方法,根据Lambda表达式特性,该方法所需要的参数是一个函数式接口。

              list.forEach((Object o)->{System.out.println("迭代集合元素:"+o);});

       5、JDK 8中还针对Iterator迭代器对象提供了一个forEachRemaining(Consumer action)方法来进行遍历,该方法同样需要一个函数式接口。

这里给出前三种遍历方法:

    System.out.println("----普通for-----");
    for (int i = 0; i < list.size(); i++) {
        Object o = list.get(i);
        System.out.println(o);
    }
    System.out.println("----迭代器-----");
    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
    String str =(String)iterator.next();
        System.out.println(str);
    }
    System.out.println("----增强for-----");
    for (Object o : list) {
        System.out.println(o);
    }

ArrayList:

       是由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。

去除集合中自定义对象的重复值(对象的成员变量值都相同):

       按照和字符串一样的操作,发现出问题了。

为什么呢?我们必须思考哪里会出问题?

       通过简单的分析,我们知道问题出现在了判断上。而这个判断功能是集合自己提供的,所以我们如果想很清楚的知道它是如何判断的,就应该去看源码。contains()方法的底层依赖的是equals()方法。而学生类中没有equals()方法,这个时候,默认使用的是它父亲Object的equals()方法,Object()的equals()默认比较的是地址值,所以,它们进去了。因为new的东西,地址值都不同。按照我们自己的需求,比较成员变量的值,重写equals()即可。

使用List集合从1-36之间选出7个数,要求不能重复:

思路及步骤:

       A:创建产生随机数的对象

       B:创建一个存储随机数的集合。

       C:定义一个统计变量。从0开始。

       D:判断统计遍历是否小于7

              是:先产生一个随机数,判断该随机数在集合中是否存在。

              如果不存在:就添加,统计变量++。

              如果存在:就不添加。

              否:循环结束

       E:遍历集合

    Random rd=new Random();
    List<Integer> numbers=new ArrayList<Integer>();
    int count=0;
    while(count<7){
        int number=rd.nextInt(36)+1;
        if(!numbers.contains(number)){
            numbers.add(number);
            count++;
        }
    }
    numbers.forEach(i->System.out.print(i+"\t"));

LinkedList :

       对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替)还具有下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

    LinkedList<String> list = new LinkedList<String>();
    list.add("list2");
    list.add("list3");
    list.addFirst("list1");
    list.addLast("list4");
    for(String str : list) {
        System.out.println(str);
    }
    System.out.println("链表头数据:"+ list.getFirst());
    System.out.println("链表尾数据:"+ list.getLast());