JAVA集合(二)List接口详解

List接口和常用方法:

List接口是Collection接口的子接口:List.java

(1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复

(2)List集合中的每个元素都有其对应的顺序索引,即支持索引。

(3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素

(4)JDK API 中List接口的实现类有:

JDK官方文档地址(所有版本):Java SE Specifications

我们进入手册进行查看:

我们可以看到所有已知实现类: 

 常用的有: 

代码示例如下所示:

package com.rgf.list;

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

public class List_ {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        //(1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
        List list = new ArrayList();
        list.add("jdk");
        list.add("jdbc");
        list.add(15);
        list.add(15);
        System.out.println("list="+list);
        //(2)List集合中的每个元素都有其对应的顺序索引,即支持索引。
        //(3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
        //索引是从0开始的
        System.out.println(list.get(1));//返回"jdbc"
        System.out.println(list.get(2));//返回15
    


    }
}

运行界面如下所示:

 List接口的常用方法:

List集合里添加了一些根据索引来操作集合元素的方法:

package com.rgf.list;

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

public class ListMethod {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("沃尔");
        list.add("快船");
        //1.void add(int index,Object ele):在index位置插入ele元素
        //在index=1的位置插入一个对象
        list.add(1,"乔治");
        System.out.println("list="+list);
        //2.boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来
        List list1 = new ArrayList();
        list1.add("小卡");
        list1.add("祖八茨");
        list.addAll(1,list1);
        System.out.println("list="+list);
        //3.Object get(int index):获得指定index位置的元素
        System.out.println(list.get(1));
       // 4.int indexOf(Object obj):返回obj在集合中首次出现的位置,如果不存在,返回-1.
        System.out.println(list.indexOf("沃尔"));//返回0
      // 5.int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置,如果不存在,返回-1.
        list.add("沃尔");
        System.out.println("list="+list);
        System.out.println(list.lastIndexOf("沃尔"));//返回5
      //  6.Object remove(int index):移除指定index位置的元素,并返回此元素
        list.remove(5);
        System.out.println("list="+list);
        //7.Object set(int index,Object ele):设置指定index位置的元素为ele,相当于是替换
        list.set(2,"小莫里斯");
        //如果我们的索引为10,即不存在的时候,我们会发现出现异常IndexOutOfBoundsException,索引越界的异常
        //如果我们索引为5,即放在最后,也是不可以的,索引必须是存在的。
        System.out.println("list="+list);
       // 8.List subList(int formIndex,int toIndex):返回从formIndex到toIndex位置的子集合,元素为在toIndex之前的。
        //注意返回的子集合formIndex=<returnlist<toIndex,不包含toIndex位置的元素。
        List returnlist = list.subList(0, 3);
        System.out.println("returnlist="+returnlist);

    }
}

运行界面如下所示:

list接口实例练习1:

添加10个以上的元素(比如String "hello"),在2号位插入一个元素”快船总冠军“,获得第五个元素,删除第六个元素,修改第七个元素,在使用迭代器遍历集合,要求:使用List的实现类ArrayList完成。

我们的代码设计如下所示:

package com.rgf.list;

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

public class ListExercise {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
//        添加10个以上的元素(比如String "hello"),在2号位插入一个元素”快船总冠军“,获得第五个元素,
//        删除第六个元素,修改第七个元素,在使用迭代器遍历集合,要求:使用List的实现类ArrayList完成。
        //要求:使用List的实现类ArrayList完成
        List list = new ArrayList();
        List list1 = new ArrayList();
       // 添加10个以上的元素(比如String "hello")
        for (int i = 0; i < 12; i++) {
            list1.add("hello"+i);
        }
        System.out.println(list1);
        //我们也可以进行如下创建的list。
        list.add(new String("快船"));
        list.add(12);
        list.add(new String("沃尔为首发控卫"));
        list.add(32);
        list.add(new String("小卡复出"));
        list.add(31);
        list.add(new String("乔大将军"));
        list.add(25);
        list.add(new String("争夺总冠军"));
        list.add(3);
        list.add(new String("泰伦卢"));
        System.out.println("list="+list);
        //在2号位(第二号元素,并不是索引为2)插入一个元素”快船总冠军“
        list.add(1,"快船总冠军");
        System.out.println("list="+list);
       // 获得第五个元素,索引为4
        System.out.println("第五个元素="+list.get(4));
        //删除第六个元素,索引为5
        list.remove(5);
        System.out.println("list="+list);
        //修改第七个元素,因为上面删除了一个元素,修改第七个元素变成了修改第六个,即索引为5.看题要根据全题进行查看
       list.set(5,"保罗乔治");
        System.out.println("list="+list);
        //在使用迭代器遍历集合
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object obj =  iterator.next();
            System.out.println("obj="+obj);
        }


    }
}

运行界面如下所示:

 总结:List的常用方法:
增:add(Object obj)

删:remove(int index/remove(Object obj)

改:set(int index,Object ele)

查:get(int index)

插:add(int index,Object ele)

长度:size

遍历:(1)iterator迭代器方式

(2)增强for循环

(3)普通for循环。

 List(List的三个子类)ArrayList、LinkedList、Vector)的三种遍历方式:

我们使用LinkedList完成,使用方式和Arraylist一样。

(1)方式一:使用iteratot.

 Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object obj =  iterator.next();
            System.out.println("obj="+obj);
        }

(2)方式二:使用增强for循环

 for (Object obj:list) {
            System.out.println("list="+obj);
            
        }

(3)方式三:使用普通for循环

for (int i = 0; i < list.size(); i++) {
            Object o = list.get(i);
            System.out.println("o="+o);
        }

我们进行代码示例如下所示:

package com.rgf.list;

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

public class ListFor {

    @SuppressWarnings({"all"})
    public static void main(String[] args) {
     //   List 接口的实现子类 Vector  LinkedList  ArrayList 
        List list = new ArrayList();
        list.add("jdbc");
        list.add("jdk");
        list.add(15);
        System.out.println("list="+list);
        //使用iterator(迭代器)进行遍历
        System.out.println("=========iterator迭代器==========");
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Object o = it.next();
            System.out.println("list1=" + o);
        }
        System.out.println("=======增强for循环=========");
            //使用增强for循环进行遍历
        for (Object o1 :list) {
                System.out.println("list2="+o1);
            }
           //使用普通for循环进行遍历
        System.out.println("========普通for循环==========");
        for (int i = 0; i < list.size(); i++) {
                Object o2 = list.get(i);
                System.out.println("list3="+o2);
            }

        }
    }

List接口的实现子类 ArrayList  LinkedList  Vector

我们看看其他类怎么样。我们的代码如下所示:LinkedList

package com.rgf.list;

import java.util.*;

public class ListFor {

    @SuppressWarnings({"all"})
    public static void main(String[] args) {
     //   List 接口的实现子类 Vector  LinkedList  ArrayList
        List list = new LinkedList();
        list.add("jdbc");
        list.add("jdk");
        list.add(15);
        System.out.println("list="+list);
        //使用iterator(迭代器)进行遍历
        System.out.println("=========iterator迭代器==========");
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Object o = it.next();
            System.out.println("list1=" + o);
        }
        System.out.println("=======增强for循环=========");
            //使用增强for循环进行遍历
        for (Object o1 :list) {
                System.out.println("list2="+o1);
            }
           //使用普通for循环进行遍历
        System.out.println("========普通for循环==========");
        for (int i = 0; i < list.size(); i++) {
                Object o2 = list.get(i);
                System.out.println("list3="+o2);
            }

        }
    }

 Vector类:

package com.rgf.list;

import java.util.*;

public class ListFor {

    @SuppressWarnings({"all"})
    public static void main(String[] args) {
     //   List 接口的实现子类 Vector  LinkedList  ArrayList
        List list = new Vector();
        list.add("jdbc");
        list.add("jdk");
        list.add(15);
        System.out.println("list="+list);
        //使用iterator(迭代器)进行遍历
        System.out.println("=========iterator迭代器==========");
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Object o = it.next();
            System.out.println("list1=" + o);
        }
        System.out.println("=======增强for循环=========");
            //使用增强for循环进行遍历
        for (Object o1 :list) {
                System.out.println("list2="+o1);
            }
           //使用普通for循环进行遍历
        System.out.println("========普通for循环==========");
        for (int i = 0; i < list.size(); i++) {
                Object o2 = list.get(i);
                System.out.println("list3="+o2);
            }

        }
    }

运行之后,我们发现我们的结果都是如下所示:

 

List接口实例练习2:

使用List的实现类添加三本图书,并遍历,打印如下效果:

名称:xx      价格:xx   作者:xx

名称:xx      价格:xx   作者:xx

名称:xx      价格:xx   作者:xx

要求:

(1)按价格排序,从低到高(使用冒泡法)

(2)要求使用ArrayList、LinkedList和Vector三种集合实现

我们先进行new一个类:ArrayList,然后新建一个Book类,然后进行创建它的构造方法,设置它的getter和setter,同时设置它的toString方法。我们的初步代码如下所示:

package com.rgf.list;

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

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

    }
}
class  Book{
    private String name;
    private  int price;
    private  String author;

    public Book(String name, int price, String author) {
        this.name = name;
        this.price = price;
        this.author = author;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                '}';
    }
}

我们编写的main方法如下所示:

  public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Book("水浒传",50,"施耐庵"));
        list.add(new Book("西游记",80,"吴承恩"));
        list.add(new Book("红楼梦",90,"曹雪芹"));
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }

    }

 我们进行运行之后,如下所示:

我们发现所打印出来的并不像题中的输出格式,我们进行重写toString方法:

 //格式化的快捷键:Alt+ctrl+L
    public String toString() {
        return "名称:" + name + '\t' + "价格:" + price + '\t' + "作者:" + author + '\t';
    }

 下面我们发现我们的要求里面有:按价格排序,从低到高(使用冒泡法)

我们进行编写sort方法进行排序:

public static void   sort(List list){
        int s = list.size();
        for (int i=0;i<s-1;i++){
            //这里i即为集合的长度为什么进行减一,因为索引是从0开始的,所以需要集合的长度减一来进行找到对应的索引
            for (int j=0;j<s-1-i;j++){
                //取出对象Book
                Book book1 = (Book) list.get(j);
                Book book2 = (Book) list.get(j+1);
                if(book1.getPrice()>book2.getPrice()){//交换
                    list.set(j,book2);
                    list.set(j+1,book1);
                }

我们的整体代码如下所示:

package com.rgf.list;

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

public class ListExercise2 {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Book("水浒传", 90, "施耐庵"));
        list.add(new Book("西游记", 50, "吴承恩"));
        list.add(new Book("红楼梦", 30, "曹雪芹"));
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }
        //冒泡排序:
        sort(list);
        System.out.println("====排序后======");
        Iterator iterator1 = list.iterator();
        while (iterator1.hasNext()) {
            Object next = iterator1.next();
            System.out.println(next);
        }

    }
    //如何对集合进行排序:
    //静态方法
    //价格要求是从小到大
    public static void   sort(List list){
        int s = list.size();
        for (int i=0;i<s-1;i++){
            //这里i即为集合的长度为什么进行减一,因为索引是从0开始的,所以需要集合的长度减一来进行找到对应的索引
            for (int j=0;j<s-1-i;j++){
                //取出对象Book
                Book book1 = (Book) list.get(j);
                Book book2 = (Book) list.get(j+1);
                if(book1.getPrice()>book2.getPrice()){//交换
                    list.set(j,book2);
                    list.set(j+1,book1);
                }
                /*
                我们的遍历思路如下所示:
                当i=0的时候,i<2,i自加后为1,进入内层循环,j=0,j<2,j自加为1
                我们取出水浒传90与西游记50比较,前者大于后者,进行交换,即为 50 90 30.
                此时我们的j为1,仍然符合<2,我们继续进行比较,
                我们取出交换过后的水浒传与红楼梦进行比较,前者大于后者,进行交换,即为50 30 90
                此时j=2,不符合条件,第一次循环结束
                之后我们进行第二层循环,i=1,i<2,i自增后为2,进入内层循环
                j=0,j<1,j自增为1,
                我们将西游记与红楼梦进行比较,前者大于后者,进行交换,即为30 50 90,
                此时j为1,进行判断条件,已经不符合了,退出内层循环,循环结束。
                 */

            }
        }


    }
}

class Book {
    private String name;
    private int price;
    private String author;

    public Book(String name, int price, String author) {
        this.name = name;
        this.price = price;
        this.author = author;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    //格式化的快捷键:Alt+ctrl+L
    public String toString() {
        return "名称:" + name + '\t' + "价格:" + price + '\t' + "作者:" + author + '\t';
    }

}

 我们的运行界面如下所示:

 我们利用LinkedList与Vector进行创建如下所示:
LinkedList类:

package com.rgf.list;

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

public class ListExercise2 {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new LinkedList();
        list.add(new Book("水浒传", 90, "施耐庵"));
        list.add(new Book("西游记", 50, "吴承恩"));
        list.add(new Book("红楼梦", 30, "曹雪芹"));
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }
        //冒泡排序:
        sort(list);
        System.out.println("====排序后======");
        Iterator iterator1 = list.iterator();
        while (iterator1.hasNext()) {
            Object next = iterator1.next();
            System.out.println(next);
        }

    }
    //如何对集合进行排序:
    //静态方法
    //价格要求是从小到大
    public static void   sort(List list){
        int s = list.size();
        for (int i=0;i<s-1;i++){
            //这里i即为集合的长度为什么进行减一,因为索引是从0开始的,所以需要集合的长度减一来进行找到对应的索引
            for (int j=0;j<s-1-i;j++){
                //取出对象Book
                Book book1 = (Book) list.get(j);
                Book book2 = (Book) list.get(j+1);
                if(book1.getPrice()>book2.getPrice()){//交换
                    list.set(j,book2);
                    list.set(j+1,book1);
                }
                /*
                我们的遍历思路如下所示:
                当i=0的时候,i<2,i自加后为1,进入内层循环,j=0,j<2,j自加为1
                我们取出水浒传90与西游记50比较,前者大于后者,进行交换,即为 50 90 30.
                此时我们的j为1,仍然符合<2,我们继续进行比较,
                我们取出交换过后的水浒传与红楼梦进行比较,前者大于后者,进行交换,即为50 30 90
                此时j=2,不符合条件,第一次循环结束
                之后我们进行第二层循环,i=1,i<2,i自增后为2,进入内层循环
                j=0,j<1,j自增为1,
                我们将西游记与红楼梦进行比较,前者大于后者,进行交换,即为30 50 90,
                此时j为1,进行判断条件,已经不符合了,退出内层循环,循环结束。
                 */

            }
        }


    }
}

class Book {
    private String name;
    private int price;
    private String author;

    public Book(String name, int price, String author) {
        this.name = name;
        this.price = price;
        this.author = author;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    //格式化的快捷键:Alt+ctrl+L
    public String toString() {
        return "名称:" + name + '\t' + "价格:" + price + '\t' + "作者:" + author + '\t';
    }

}

Vector类:

package com.rgf.list;

import java.util.*;

public class ListExercise2 {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        List list = new Vector();
        list.add(new Book("水浒传", 90, "施耐庵"));
        list.add(new Book("西游记", 50, "吴承恩"));
        list.add(new Book("红楼梦", 30, "曹雪芹"));
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }
        //冒泡排序:
        sort(list);
        System.out.println("====排序后======");
        Iterator iterator1 = list.iterator();
        while (iterator1.hasNext()) {
            Object next = iterator1.next();
            System.out.println(next);
        }

    }
    //如何对集合进行排序:
    //静态方法
    //价格要求是从小到大
    public static void   sort(List list){
        int s = list.size();
        for (int i=0;i<s-1;i++){
            //这里i即为集合的长度为什么进行减一,因为索引是从0开始的,所以需要集合的长度减一来进行找到对应的索引
            for (int j=0;j<s-1-i;j++){
                //取出对象Book
                Book book1 = (Book) list.get(j);
                Book book2 = (Book) list.get(j+1);
                if(book1.getPrice()>book2.getPrice()){//交换
                    list.set(j,book2);
                    list.set(j+1,book1);
                }
                /*
                我们的遍历思路如下所示:
                当i=0的时候,i<2,i自加后为1,进入内层循环,j=0,j<2,j自加为1
                我们取出水浒传90与西游记50比较,前者大于后者,进行交换,即为 50 90 30.
                此时我们的j为1,仍然符合<2,我们继续进行比较,
                我们取出交换过后的水浒传与红楼梦进行比较,前者大于后者,进行交换,即为50 30 90
                此时j=2,不符合条件,第一次循环结束
                之后我们进行第二层循环,i=1,i<2,i自增后为2,进入内层循环
                j=0,j<1,j自增为1,
                我们将西游记与红楼梦进行比较,前者大于后者,进行交换,即为30 50 90,
                此时j为1,进行判断条件,已经不符合了,退出内层循环,循环结束。
                 */

            }
        }


    }
}

class Book {
    private String name;
    private int price;
    private String author;

    public Book(String name, int price, String author) {
        this.name = name;
        this.price = price;
        this.author = author;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    //格式化的快捷键:Alt+ctrl+L
    public String toString() {
        return "名称:" + name + '\t' + "价格:" + price + '\t' + "作者:" + author + '\t';
    }

}

我们的运行界面都是如下所示:

面试题如下:

package com.rgf.jihe;

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

public class Iterator3 {
    //区分List中remove(int index)和remove(Object obj)
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        updateList(list);
        System.out.println(list);
    }

    public static void  updateList(List list){
        list.remove(2);  //索引为2,删除3,剩下1,2
    }
    public static void  updateList1(List list){
        list.remove(new Integer(1));  //删除值为1,
    }
}

运行之后如下所示:

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直再追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值