当前位置: 首页 > news >正文

JAVA集合(二)List接口详解

List接口和常用方法:

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

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

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

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

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

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

我们进入手册进行查看:

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

 常用的有:ArrayList、LinkedList和Vector.

代码示例如下所示:

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在集合中首次出现的位置
        System.out.println(list.indexOf("沃尔"));//返回0
      // 5.int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
        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(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';
    }

}

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

 

相关文章:

  • 矩阵的秩的性质
  • Redis在SpringBoot项目中使用
  • Android AIDL跨进程通信
  • Java大牛必会|分布式缓存实现方案之Spring Cache
  • KF、EKF、IEKF、UKF卡尔曼滤波器
  • Neo4j入门+深入
  • 21年icpc上海区域赛B题Strange Permutations (容斥+生成函数)
  • 【CSS】QQ邮箱布局,词典四列布局,行内布局
  • 滑动窗口问题
  • Java的输入 Scanner in=new Scanner(System.in);
  • 接口请求返回状态码
  • Cocos Creator游戏引擎
  • [静态时序分析简明教程(一)] 绪论
  • ADU87、DCB20X-E等设备以RTSP方式添加第三方相机或录像机教程
  • 计算机网络常见面试题汇总(建议收藏)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • codis proxy处理流程
  • Create React App 使用
  • flutter的key在widget list的作用以及必要性
  • Intervention/image 图片处理扩展包的安装和使用
  • leetcode46 Permutation 排列组合
  • mac修复ab及siege安装
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • React as a UI Runtime(五、列表)
  • spring + angular 实现导出excel
  • vue--为什么data属性必须是一个函数
  • 利用DataURL技术在网页上显示图片
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 实现简单的正则表达式引擎
  • 使用 Docker 部署 Spring Boot项目
  • 一个项目push到多个远程Git仓库
  • 运行时添加log4j2的appender
  • 最简单的无缝轮播
  • 【干货分享】dos命令大全
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​如何防止网络攻击?
  • # 飞书APP集成平台-数字化落地
  • # 计算机视觉入门
  • # 数据结构
  • #android不同版本废弃api,新api。
  • $$$$GB2312-80区位编码表$$$$
  • $(function(){})与(function($){....})(jQuery)的区别
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (生成器)yield与(迭代器)generator
  • (十一)手动添加用户和文件的特殊权限
  • (四)Controller接口控制器详解(三)
  • (一)为什么要选择C++