ArrayList类

什么是集合

集合是长度可变的容器

集合与数组的对比

  • 集合长度可变,自动伸缩,可长可短
  • 集合只能存引用数据类型,非要存基本数据类型,就要将其变成包装类

ArrayList

ArrayList类是表示集合的其中一种类,ArrayList底层使用数组存储数据,默认的容量是10

import java.util.ArrayList;

public class d1 {
    public static void main(String[] args) {
        //创建集合的对象
        //泛型:限定集合中存储数据的类型 <数据类型> 泛型没有多态
        ArrayList<String> list=new ArrayList<>();
        System.out.println(list);//[],内容为空
        //java对ArrayList类做了特殊处理,打印其对象会直接打印出集合中存储数据的内容
        //这些内容会用[]包裹
    }
}

ArrayList的成员方法

要想往集合里添加元素,就要用到ArrayList的成员方法

  • add
import java.util.ArrayList;

public class d2 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");//在这一步→abc
        list.add(1,"d");//在索引1处添加d元素,→adbc
        list.add(4,"e");//adbc最大索引为3,但加一个元素索引能到4,所以可以
        list.add(6,"e");//会报错,adbce最大索引+1也只有5,没有索引6
        System.out.println(list);
    }
}

原理
假设开始只开辟空间为3的数组
ArrayList list=new ArrayList(3)
现在往里面加第4个数据zhaoliu,发现执行后没报错
因为底层又重新开辟了一个更大的数组用于容纳数据,并且新的数组下标重新指向对应的引用

这种方法叫做扩容,ArrayList会自动扩容,扩容后旧的数组就不会起作用了

addAll

  • remove
import java.util.ArrayList;

public class d2 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add(1,"d");
        list.add(4,"e");
        System.out.println(list);//[a, d, b, c, e]
        //1.根据内容删除
        list.remove("d");
        System.out.println(list);//[a, b, c, e]
        list.remove("l");//没有l也不会报错,[a, b, c, e]
        //2.根据索引删除
        String str=list.remove(2);//删除的是索引2的c
        System.out.println(str);//c
        System.out.println(list);//[a, b, e]
    }
}

  • set
import java.util.ArrayList;

public class d2 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);//[a, b, c]

        list.set(1,"d");
        System.out.println(list);//[a, d, c]
    }
}
  • get
import java.util.ArrayList;

public class d2 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);//[a, b, c]

        System.out.println(list.get(1));//b
    }
}
  • size()
import java.util.ArrayList;

public class d2 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);//[a, b, c]

        System.out.println(list.size());
    }
}
  • isEmpty

  • clear

  • contains

  • indexOf
    如果数据不存在,返回-1。如果是重复的数据,返回第一个的位置

    获取重复数据最后一个的位置

  • toArray
    集合变成数组

  • clone
    克隆新的集合

  • 遍历集合

import java.util.ArrayList;

public class d2 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);//[a, b, c]

        for (int i = 0; i < list.size(); i++) {//遍历次数
            String str=list.get(i);//每个元素
            System.out.print(str+"\t");//a	b	c
        }
    }
}

ArrayList集合也能用增强for循环

基本类型对应的包装类

  • 定义一个集合,添加数字并进行遍历
import java.util.ArrayList;

public class d4 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        //集合只包括引用类型,基本类型需要变成其包装类才能用
        list.add(1);
        list.add(2);
        list.add(3);

        System.out.print("[");
        for (int i = 0; i < list.size(); i++) {
            if (i== list.size()-1){
                System.out.print(list.get(i));
            }else {
                System.out.print(list.get(i)+" ,");
            }
        }
        System.out.println("]");
    }
}
  • 排序sort

    ArrayList的sort方法需要传一个实现了比较器接口的对象
    比较器的规则就是两两比较
package List;

import java.util.ArrayList;
import java.util.Comparator;

public class arrayList {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(2);
        list.sort(new NumberComparator());
        System.out.println(list);//[3, 2, 1]
    }
}
class NumberComparator implements Comparator<Integer> {
    //ctrl+o选择重写比较方法
    @Override
    public int compare(Integer o1, Integer o2) {
        //o1-o2:升序
        //o2-o1:降序
        return o2 - o1;
    }
}

常见错误

  • 定义一个集合,添加对象并进行遍历
Student.java
public class Student {
//标准的javabean写法:
//1.成员变量私有化 2.空参构造 3.全部变量的有参构造 4.所有的getset方法
    private String name;
    private int age;

    public Student(){

    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

d5.java
import java.util.ArrayList;

public class d5 {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        Student s1=new Student("Benson",18);
        Student s2=new Student("LJS",20);
        Student s3=new Student("Mike",22);

        list.add(s1);
        list.add(s2);
        list.add(s3);

        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getName()+","+stu.getAge());
        }
    }
}

  • 进一步改进,从键盘录入对象数据
import java.util.ArrayList;
import java.util.Scanner;

public class d6 {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();

        Scanner scanner=new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            Student s=new Student();
            System.out.print("请输入姓名:");
            String str=scanner.next();
            System.out.print("请输入年龄:");
            int a=scanner.nextInt();

            s.setName(str);
            s.setAge(a);

            list.add(s);
        }
        System.out.println();
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getName()+","+stu.getAge());
        }
        scanner.close();
    }
}


Student s=new Student();不能放在循环外,因为放在循环外就只有一个对象,结果会变成

原理

  • 练习1
User.java
package ArrayList;

public class User {
    private String id;
    private String name;
    private String password;

    public User(){}

    public User(String id,String name,String password){
        this.id=id;
        this.name=name;
        this.password=password;
    }

    public String getId(){
        return id;
    }

    public void setId(String id){
        this.id=id;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

d7.java
package ArrayList;

import java.util.ArrayList;
import java.util.Scanner;

public class d7 {
    public static void main(String[] args) {
        boolean flag1=true;
        boolean flag2=true;
        ArrayList<User> list = new ArrayList<>();
        Scanner scanner=new Scanner(System.in);

        while (flag1){
            User u=new User();
            System.out.print("请输入id:");
            String sid=scanner.next();
            System.out.print("请输入用户名:");
            String sname=scanner.next();
            System.out.print("请输入密码:");
            String spassword=scanner.next();

            u.setId(sid);
            u.setName(sname);
            u.setPassword(spassword);

            list.add(u);

            while(true){
                System.out.println("是否继续?Y/N");
                String yn1=scanner.next();
                if (yn1.equalsIgnoreCase("n")){
                    flag1=false;
                    break;
                }else if (yn1.equalsIgnoreCase("y")){
                    flag1=true;
                    break;
                }else {
                    System.out.print("输入错误,");
                }
            }
        }

        while (flag2){
            System.out.print("请输入要查询的用户id:");
            String cid=scanner.next();
            String result=getIndexAndName(list,cid);
            System.out.println("id为"+cid+"的用户名是:"+result);

            while(true){
                System.out.println("是否继续?Y/N");
                String yn2=scanner.next();
                if (yn2.equalsIgnoreCase("n")){
                    flag2=false;
                    break;
                }else if (yn2.equalsIgnoreCase("y")){
                    flag2=true;
                    break;
                }else {
                    System.out.print("输入错误,");
                }
            }

        }
        scanner.close();
    }
    //根据id查询用户的用户名
    /*
    1.我要干嘛
    2.干这件事需要哪些信息
    3.调用处是否需要使用方法的结果
     */
    public static String getIndexAndName(ArrayList<User> list,String id){
        for (int i = 0; i < list.size(); i++) {
            User uu=list.get(i);
            String uid= uu.getId();
            //System.out.println("uid:"+uid);
            if (uid.equals(id)){
                return uu.getName();
            }
        }
        return null;
    }
}

  • 练习2
Phone.java
package ArrayList;

public class Phone {
    private String brand;
    private int price;

    public Phone() {
    }

    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getPrice() {
        return price;
    }

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

d8.java
package ArrayList;

import java.util.ArrayList;

public class d8 {
    public static void main(String[] args) {
        ArrayList<Phone> list = new ArrayList<>();
        Phone p1=new Phone("红米",1000);
        Phone p2=new Phone("荣耀",2999);
        Phone p3=new Phone("苹果",8000);

        list.add(p1);
        list.add(p2);
        list.add(p3);

        //打印价格3000以下的手机信息
        ArrayList<Phone> PhoneInfoList = getPhoneInfo(list);
        for (int i = 0; i < PhoneInfoList.size(); i++) {
            Phone pp=PhoneInfoList.get(i);
            System.out.println(pp.getBrand()+","+pp.getPrice());
        }
    }
    /*
    如果要返回多个数据,可以把这些数据放到一个容器中,再把容器返回
    容器可以是集合、数组,这里用集合展示
    */
    public static ArrayList<Phone> getPhoneInfo(ArrayList<Phone> list){
        ArrayList<Phone> resultList=new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            Phone p= list.get(i);
            if (p.getPrice()<3000){
                resultList.add(p);
            }
        }
        return resultList;
    }
}

posted @ 2022-09-24 22:48  ben10044  阅读(49)  评论(0编辑  收藏  举报