Java-28 List接口

  • List接口:

  有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

  •  List集合特点
  1. 有序的集合,存储和取出元素顺序相同
  2. 允许存储重复的元素
  3. 有索引,包含一些索引的方法,可以使用普通的for循环遍历
/*
        List集合:
            特点:有序(存储和取出的顺序一致),元素可以重复的。
 */

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

public class ListDemo1 {
    public static void main(String[] args) {
        List l1 = new ArrayList();

        l1.add("hello");
        l1.add("world");
        l1.add("java");
        l1.add("hello");

        Iterator iterator = l1.iterator();

        while (iterator.hasNext()){
            Object next = iterator.next();
            String s = (String)next;
            System.out.println(s);
        }
    }
}

 

  • List集合的特有功能:(没有列出Collection也有的功能)

  A:添加功能 

    add(int index, E element)

    将指定的元素插入此列表中的指定位置(可选操作)。 

  B:获取功能 

    get(int index)

    返回此列表中指定位置的元素。 

  C:列表迭代器功能 

    listIterator(int index)

    从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。 
import java.util.ArrayList;
import java.util.List;

/*
List特有的迭代器,ListIterator
        ListIterator<E> listIterator()
        该迭代器继承了Iterator接口,在其中就可以使用hasNext()和next方法

        特有功能:
            E previous()返回列表中的上一个元素,并向后移动光标位置
            boolean hasPrevious()返回true如果遍历反向列表,列表迭代器有多个元素。

            注意事项:
                List集合想要反着遍历,就必须得先正向遍历一次,才能逆向遍历,因为光标就一个
                所以,列表迭代器一般情况下无意义,不使用
 */
public class ListIterator {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("hello");
        list.add("world");
        list.add("java");

        //ListIterator<E> listIterator()
        java.util.ListIterator listIterator = list.listIterator();
        while (listIterator.hasNext()){
            Object next = listIterator.next();
            String s = (String)next;
            System.out.println(s);
        }

//        Object previous = listIterator.previous(); //NoSuchElementException
//        System.out.println(previous);
//        Object previous1 = listIterator.previous();
//        System.out.println(previous1);
//        Object previous2 = listIterator.previous();
//        System.out.println(previous2);
//        Object previous3 = listIterator.previous(); //NoSuchElementException
//        System.out.println(previous3);
        //逆向遍历
        while (listIterator.hasPrevious()){
            Object previous4 = listIterator.previous();
            String s = (String)previous4;
            System.out.println(s);
        }
    }

}

  D:删除功能 

    remove(int index)

    删除该列表中指定位置的元素(可选操作)。 

  E:修改功能 

    set(int index, E element)

    用指定的元素(可选操作)替换此列表中指定位置的元素。 
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/*
List集合特有的功能:
            1、添加功能
                void add(int index, Object element) 将指定的元素插入此列表中的指定位置(可选操作)。
            2、获取功能
                E get(int index)返回此列表中指定位置的元素。
            3、ListIterator listIterator()
                List特有的迭代器
                返回列表中的列表迭代器(按适当的顺序)。
            4、删除功能
                E remove(int index) 删除该列表中指定位置的元素(可选操作)。
            5、修改功能
                E set(int index, Object element) 用指定的元素(可选操作)替换此列表中指定位置的元素。
 */
public class ListDemo2 {
    public static void main(String[] args) {
        List ll = new ArrayList();
        ll.add("hello");
        ll.add("world");
        ll.add("java");
        ll.add("idea");
        System.out.println(ll);//[hello, world, java, idea]

        //void add(int index, Object element) 将指定的元素插入此列表中的指定位置(可选操作)
        //index索引的范围是0-size()
        ll.add(2,"hello");
        System.out.println(ll);//[hello, world, hello, java, idea]
        ll.add(5,"。");//[hello, world, hello, java, idea, 。]
        System.out.println(ll);

        //E get(int index)返回此列表中指定位置的元素。
        Object o = ll.get(5);
        System.out.println(o);//// E remove(int index) 删除该列表中指定位置的元素(可选操作)。
        Object remove = ll.remove(5);
        System.out.println(remove);////E set(int index, Object element) 用指定的元素(可选操作)替换此列表中指定位置的元素。
        //返回的是被修改的元素
        System.out.println(ll.set(1, "hadoop"));//world
        System.out.println("=====================================");

        //ListIterator listIterator()
        // List特有的迭代器,返回列表中的列表迭代器(按适当的顺序)。
        ListIterator listIterator = ll.listIterator(2);
        while(listIterator.hasNext()){
            System.out.println(listIterator.next());
        }
    }
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*

     需求:
        现在有一个集合。集合中有一些字符串的元素,我想判断一下里面有没有"bigdata"这个字符串
        如果有,我们就添加一个"yes"

           ConcurrentModificationException:并发修改异常
                    当方法检测到对象并发修改的时候,但是不允许这种修改就抛出此异常


                原因分析:
                    迭代器是依赖与集合而存在的,在遍历迭代器中元素的时候,判断成功后,我们往集合中添加
                    新的元素,但是呢,迭代器并不知道你添加了新的元素。所以就报错了。

                    这个问题简单描述:在迭代器遍历的时候,不能去通过集合去修改元素

               怎么解决呢?
                    1、迭代器遍历,迭代器修改
                        在该元素的后面添加
                    2、集合遍历,集合修改(普通的for循环)
                        在末尾添加
 */
public class ListDemo3 {
    public static void main(String[] args) {
        List list = new ArrayList();

        list.add("hello");
        list.add("world");
        list.add("bigdata");
        list.add("data");
        list.add("bigdata");

//        Iterator iterator = list.iterator();
//        while(iterator.hasNext()){
//            Object next = iterator.next();
//            String s = (String)next;
//            if ("bigdata".contains(s)){
//                list.add("yes");
//            }
//        }
        //ConcurrentModificationException 并发修改异常
        //当方法检测到对象并发修改的时候,但是不允许这种修改就抛出此异常

        //解决方法1:迭代器遍历,迭代器修改
        ListIterator listIterator = list.listIterator();
        wc:while (listIterator.hasNext()){
            Object next = listIterator.next();
            String s = (String)next;
            if("bigdata".equals(s)){
                listIterator.add("yes");//ListIterator中有void add(E e)方法    将指定的元素插入列表(可选操作)
break wc;
            }
        }
        System.out.println(list);//[hello, world, bigdata, yes, data, bigdata]

        //解决方法2:集合遍历,集合修改
        wc:for(int i=0;i<list.size();i++){
            Object o = list.get(i);
            String s = (String)o;
            if("bigdata".equals(s)){
                list.add(list.size(),"yes");
                break wc;
            }
        }
        System.out.println(list);//[hello, world, bigdata, yes, data, bigdata, yes]
    }
}

 

  

      List集合的特有遍历功能:size()和get()方法结合使用:

1 //List集合特有的遍历方式
2         for(int i = 0;i<l1.size();i++) {
3             String s = (String)l1.get(i);
4             System.out.println(s);
5         }

 

  List是Collection的子接口,当然它也可以用Iterator迭代器进行遍历输出:

1 Iterator it = list.iterator();
2         while(it.hasNext()) {
3             String s = (String)it.next();
4             System.out.println(s);
5         }

 

List(接口)
    ArrayList
      底层数据结构是数组,查询快,增删慢
      线程不安全,效率高
    Vector
      底层数据结构是数组,查询快,增删慢
      线程安全的,效率低
    LinkedList
      底层数据结构是链表,查询慢,增删快
      线程不安全,效率高

 

ArrayList

 

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListDemo {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList arr = new ArrayList();

        //创建学生对象
        Student s1 = new Student("张三",18);
        Student s2 = new Student("李四",19);
        Student s3 = new Student("王五",14);
        Student s4 = new Student("赵六",19);
        Student s5 = new Student("田七",60);

        //添加元素
        arr.add(s1);
        arr.add(s2);
        arr.add(s3);
        arr.add(s4);
        arr.add(s5);

        //集合遍历
        Iterator iterator = arr.iterator();
        while(iterator.hasNext()){
            Object next = iterator.next();
            Student s = (Student)next;
            System.out.println(s);
        }


        //List特有方法get和size方法for循环遍历
        for (int i=0;i<arr.size();i++){
            Object o = arr.get(i);
            Student s = (Student)o;
            System.out.println(s);
        }
    }
}

 

 

import java.util.ArrayList;
import java.util.Iterator;

/*
去除集合中字符串的重复值(字符串的内容是否相同)
 */
public class ArrayListDemo1 {
    public static void main(String[] args) {
       two();
       one();
    }

    //去除集合中字符串的重复值(字符串的内容是否相同)
    //创建新的集合
    public static void two(){
        ArrayList arrayList = new ArrayList();

        arrayList.add("hello");
        arrayList.add("world");
        arrayList.add("java");
        arrayList.add("flink");
        arrayList.add("java");
        arrayList.add("hello");
        arrayList.add("hadoop");

        ArrayList arrayList1 = new ArrayList();

        Iterator iterator = arrayList.iterator();
        while(iterator.hasNext()){
            Object next = iterator.next();
            String s = (String)next;
            if (!arrayList1.contains(s)){
                arrayList1.add(s);
            }
        }
        System.out.println(arrayList1);
    }

    public static void one(){
        ArrayList arrayList = new ArrayList();

        arrayList.add("hello");
        arrayList.add("world");
        arrayList.add("java");
        arrayList.add("flink");
        arrayList.add("java");
        arrayList.add("hello");
        arrayList.add("hello");
        arrayList.add("hadoop");

        for (int i = 0 ; i<arrayList.size();i++){
            for (int j = i+1; j<arrayList.size();j++){
                if (arrayList.get(i).equals(arrayList.get(j))){
                    arrayList.remove(j);
                    j--;
                }
            }
        }

        Iterator iterator = arrayList.iterator();
        while(iterator.hasNext()){
            Object next = iterator.next();
            String s = (String)next;
            System.out.println(s);
        }
    }
}

 

import java.util.ArrayList;
import java.util.Iterator;

/*
        去除集合中自定义对象的重复值(对象的成员变量值都相同)
            通过观察源码发现,contains()方法的底层是依赖与equals方法的,由于我们Student类中
            并没有重写equals方法,所以它默认调用的是父亲Object类中的equals方法,而默认的equals
            方法比较的是地址值,对象s1和s6都是new出来,他们的地址值必然不一样,所以永远是false

        怎么解决呢?
            重写equals方法,不需要我们自己重写,自动生成即可

            建议,每次创建类的时候重写一下。


 */
public class ArrayListDemo4 {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList arrayList = new ArrayList();

        //创建学生对象
        Student s1 = new Student("范闲", 24);
        Student s2 = new Student("鸡腿菇凉", 23);
        Student s3 = new Student("五竹叔", 2000);
        Student s4 = new Student("庆帝", 50);
        Student s5 = new Student("范若若", 18);
        Student s6 = new Student("范闲", 24);
        Student s7 = new Student("范闲", 28);


        //添加元素
        arrayList.add(s1);
        arrayList.add(s2);
        arrayList.add(s3);
        arrayList.add(s4);
        arrayList.add(s5);
        arrayList.add(s6);
        arrayList.add(s7);

        //创建一个新的集合
        ArrayList arrayList2 = new ArrayList();

        //遍历旧的集合,获取每个元素
        Iterator iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            Student s = (Student) next;

            //拿着获取到的元素去新的集合找,如果存在就不加入,如果不存在就加入
            if (!arrayList2.contains(s)) {
                arrayList2.add(s);
            }
        }

        Iterator iterator1 = arrayList2.iterator();
        while (iterator1.hasNext()) {
            Object next = iterator1.next();
            Student s = (Student) next;
            System.out.println(s.getName() + "---" + s.getAge());
        }

    }
}

 

LinkedList

 

 

import java.util.LinkedList;

/*
        LinkedList的特有功能:
            1、添加功能:
                public void addFirst(Object obj):在该集合开头插入指定的元素
                public void addLast(Object obj)将指定的元素追加到此列表的末尾。
                这个方法相当于add(Object) 。
            2、获取功能:
                public Object getFirst():返回此集合中的第一个元素。
                getLast():返回此列表中的最后一个元素。
            3、删除功能:
                public Object removeFirst():移除集合中第一个元素
                public Object removeLast():移除集合中最后一个元素
 */
public class LinkListDemo {
    public static void main(String[] args) {
        //创建集合对象,因为使用linkedlist特有功能所有不使用多态
        LinkedList linkedList = new LinkedList();

        //添加功能
        linkedList.add("hello");
        linkedList.add("world");
        linkedList.add("java");
        linkedList.add("bigdata");
        linkedList.add("hive");

        System.out.println(linkedList);//[hello, world, java, bigdata, hive]

        //public void addFirst(Object obj):在该集合开头插入指定的元素
        linkedList.addFirst("spark");
        System.out.println(linkedList);//[spark, hello, world, java, bigdata, hive]

        //public void addLast(Object obj)将指定的元素追加到此列表的末尾。
        linkedList.addLast("flink");
        System.out.println(linkedList);//[spark, hello, world, java, bigdata, hive, flink]

        //public Object getFirst():返回此集合中的第一个元素。
        Object first = linkedList.getFirst();
        System.out.println(first);//spark
        System.out.println(linkedList);//[spark, hello, world, java, bigdata, hive, flink]

        //getLast():返回此列表中的最后一个元素。
        Object last = linkedList.getLast();
        System.out.println(last);//flink
        System.out.println(linkedList);//[spark, hello, world, java, bigdata, hive, flink]

        //public Object removeFirst():移除集合中第一个元素
        Object o = linkedList.removeFirst();
        System.out.println(o);//spark
        System.out.println(linkedList);//[hello, world, java, bigdata, hive, flink]

        //public Object removeLast():移除集合中最后一个元素
        Object o1 = linkedList.removeLast();
        System.out.println(o1);//flink
        System.out.println(linkedList);//[hello, world, java, bigdata, hive]

    }
}

 

面试题

/*
 请用LinkedList模拟栈数据结构的集合,并测试
        栈:先进后出
 */
public class MyStackDemo {
    public static void main(String[] args) {
        //创建集合对象
        MyStack myStack = new MyStack();

        //添加元素
        myStack.add("hello");
        myStack.add("world");
        myStack.add("bigdata");
        System.out.println(myStack);

//        System.out.println(myStack.get());
//        System.out.println(myStack.get());
//        System.out.println(myStack.get());
//        System.out.println(myStack.get()); //NoSuchElementException


        while (!myStack.isEmpty()){
            Object o = myStack.get();
            String s = (String)o;
            System.out.println(s);
        }


    }
}




import java.util.LinkedList;

public class MyStack {
    private LinkedList linkedList;

    public MyStack(){
        linkedList = new LinkedList();
    }

    public void add(Object object){
        linkedList.addFirst(object);
    }

    public Object get(){
//        return linkedList.getFirst();
        return linkedList.removeFirst();
    }

    public boolean isEmpty(){
        return linkedList.isEmpty();
    }

    @Override
    public String toString() {
        return "MyStack{" +
                "linkedList=" + linkedList +
                '}';
    }
}

 

Vector
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;

/*
        Vector类概述
            底层数据结构是数组,查询快,增删慢
            线程安全,效率低

        Vector类的特有方法:
            public void addElement(Object obj)
                在集合末尾添加元素,功能和add()方法一样
            public Object elementAt(int index)
                该方法的功能与get(int)方法相同
            public Enumeration elements()
                返回此向量的组件的枚举。 返回的Enumeration对象将生成此向量中的所有项。 产生的第一项是在索引的项0 ,则在索引项1 ,依此类推


 */
public class VectorDemo {
    public static void main(String[] args) {
        //创建Vector集合对象
        Vector vector = new Vector();

        //添加元素
        vector.add("hello");
        vector.addElement("world");
        vector.addElement("java");


//        public Object elementAt(int index)
        Object o = vector.get(0);
        System.out.println(o);//hello

        Object o1 = vector.elementAt(1);
        System.out.println(o1);//world

        Object o2 = vector.elementAt(2);
        System.out.println(o2);//java

        Enumeration elements = vector.elements();
        System.out.println(elements);

        //遍历
//        Iterator iterator = vector.iterator();
//        while (iterator.hasNext()){
//            Object next = iterator.next();
//            String s = (String)next;
//            System.out.println(s);
//        }


    }
}

 

 

 

posted @ 2021-10-13 22:32  艺术派大星  阅读(45)  评论(0)    收藏  举报
levels of contents