首页 > 其他分享 >集合

集合

时间:2024-09-07 11:36:37浏览次数:6  
标签:ArrayList list System add 集合 public out

介绍

集合可以存放引用数据类型,但是不能存放基本数据类型,如果想要存放基本数据类型,需要将基本数据类型转换为它的包装类,再存放进集合中。

集合的长度可以自动改变,添加元素时集合长度自动变大,删除元素时集合长度自动变小。

Java 提供了很多种集合,最常用的是 ArrayList。

ArrayList

ArrayList 所属的包是 java.util

ArrayList 对象中存储的元素类型用泛型来限定。

代码:

import java.util.ArrayList;

public class ArrayListDemo1 {
    public static void main(String[] args) {
        // ArrayList<String> list = new ArrayList<String>();  // 这个集合list, 只能存放字符串. 这是 JDK7 之前的写法, 从 JDK7 开始做了简化

        ArrayList<String> list = new ArrayList<>();  // JDK7 之后的写法,<String> 是泛型,表示集合里面存储的数据的类型
        System.out.println(list);       // []
        // list 是 ArrayList 对象,
        // ArrayList 类是 Java 写好的一个类, 在底层对这个类做了一些处理,
        // 打印 ArrayList 对象时, 打印的不是地址值, 而是集合中存储的数据内容,
        // 在打印的时候, 会用 [] 把所有的内容包裹起来. 如果集合的内容为空, 则只打印 []
    }
}

ArrayList 类的对象的操作主要分为增、删、改、查。

ArrayList 类提供的方法有:

方法名 说明
boolean add(E e) 添加元素,返回值表示是否添加成功,始终返回 true
boolean remove(E e) 删除指定元素,返回值表示是否删除成功,删除成功返回 true,删除失败返回 false
E remove(int index) 删除指定索引的元素,返回被删除元素
E set(int index, E e) 传入新值,覆盖旧值,即用新值修改指定索引下的元素,返回旧值
E get(int index) 获取指定索引的元素
int size() 集合的长度,也就是集合中元素的个数

add 方法的源码:

public boolean add(E e) {
    modCount++;
    add(e, elementData, size);
    return true;
}

可以看出来,add 一定返回 true,因此一般都不用管 add 的返回值。

代码:

import java.util.ArrayList;

public class ArrayListDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();  // 创建一个空集合
        System.out.println(list);       // []
        list.add("aaa");
        System.out.println(list);       // [aaa]
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        System.out.println(list);       // [aaa, bbb, ccc, ddd]
    }
}

当添加错误类型的内容时,程序直接报错而不是通过返回一个 false 来表示。因此 add 始终返回 true。

代码:

import java.util.ArrayList;

public class ArrayListDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);       // []
        list.add("aaa");
        System.out.println(list);       // [aaa]
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        System.out.println(list);       // [aaa, bbb, ccc, ddd]
        list.add("aaa");
        System.out.println(list);       // [aaa, bbb, ccc, ddd, aaa]
        boolean res1 = list.remove("aaa");
        System.out.println(list);       // [bbb, ccc, ddd, aaa], 相同元素没有全部删除, 只删除了第一个指定的元素
        System.out.println(res1);       // true
        boolean res2 = list.remove("fff");
        System.out.println(list);       // [bbb, ccc, ddd, aaa], 删除失败, list不变
        System.out.println(res2);       // false
    }
}

ArrayList 对象的索引和数组的规则相同。

代码:

import java.util.ArrayList;

public class ArrayListDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);              // []
        list.add("aaa");
        System.out.println(list);              // [aaa]
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        System.out.println(list);              // [aaa, bbb, ccc, ddd]
        list.add("aaa");
        System.out.println(list);              // [aaa, bbb, ccc, ddd, aaa]
        String s = list.remove(0);
        System.out.println(s);                 // aaa,返回被删除的元素
        System.out.println(list);              // [bbb, ccc, ddd, aaa]
        String s2 = list.remove(4);            // Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 4 out of bounds for length 4
        System.out.println(s2);
        System.out.println(list);
    }
}

代码:

import java.util.ArrayList;

public class ArrayListDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);               // []
        list.add("aaa");
        System.out.println(list);               // [aaa]
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        System.out.println(list);               // [aaa, bbb, ccc, ddd]
        list.add("aaa");
        System.out.println(list);               // [aaa, bbb, ccc, ddd, aaa]
        String res = list.set(1, "xxx");
        System.out.println(res);                // bbb,返回被替换的元素,即旧值
        System.out.println(list);               // [aaa, xxx, ccc, ddd, aaa]
    }
}

代码:

import java.util.ArrayList;

public class ArrayListDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);               // []
        list.add("aaa");
        System.out.println(list);               // [aaa]
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        System.out.println(list);               // [aaa, bbb, ccc, ddd]
        list.add("aaa");
        System.out.println(list);               // [aaa, bbb, ccc, ddd, aaa]
        String res = list.get(3);
        System.out.println(res);                // ddd,根据索引获取到了元素
    }
}

代码:

import java.util.ArrayList;

public class ArrayListDemo2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);               // []
        list.add("aaa");
        System.out.println(list);               // [aaa]
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        System.out.println(list);               // [aaa, bbb, ccc, ddd]
        list.add("aaa");
        System.out.println(list);               // [aaa, bbb, ccc, ddd, aaa]
        for (int i = 0; i < list.size(); i++) {  // 遍历集合,用 size() 方法获取集合的长度
            list.set(i, Character.toString(i + 'a'));
        }
        System.out.println(list);               // [a, b, c, d, e]

        for (int i = 0; i < list.size(); i++) {
            list.set(i, i + 'a' + "");
        }
        System.out.println(list);               // [97, 98, 99, 100, 101]

        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
            System.out.print(" ");              // 97 98 99 100 101 
        }
    }
}

练习:
集合的遍历方式
需求:定义一个集合, 添加字符串, 并进行遍历
遍历格式参照:[元素 1, 元素 2, 元素 3]

代码:

import java.util.ArrayList;

public class Test1 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("你好");  // add 返回 true,因此不支持链式编程
        list.add("好的");
        list.add("没问题");
        list.add("知道了");

        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) + ", ");
            }
        }
    }
}

执行结果:

[你好, 好的, 没问题, 知道了]

练习:
添加数字并遍历
需求:定义一个集合, 添加数字, 并进行遍历
遍历格式参照:[元素 1, 元素 2, 元素 3]

基本数据类型 基本数据类型对应的包装类
byte Byte
short Short
char Character
int Integer
long Long
float Float
double Double
boolean Boolean

代码:

import java.util.ArrayList;

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

        for (int i = 0; i < 5; i++) {
            list.add(i + 1);  // JDK 5 之后, int 和 Integer 之间可以相互转化
        }

        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) + ", ");
        }
    }
}

执行结果:

[1, 2, 3, 4, 5]

练习:
添加学生对象并遍历
需求:定义一个集合, 添加一些学生对象, 并进行遍历
学生类的属性为:姓名, 年龄

Javabean 类:

public class Student {
    private int age;
    private String name;

    public Student() {
    }

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

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "Student{age = " + age + ", name = " + name + "}";
    }
}

测试类:

import java.util.ArrayList;

public class Test3 {
    public static void main(String[] args) {
        // 创建集合
        ArrayList<Student> list = new ArrayList<>();

        // 创建对象
        Student s1 = new Student(23, "xiaoming");
        Student s2 = new Student(24, "xiaowang");

        // 将对象添加到集合中
        list.add(s1);
        list.add(s2);

        // 遍历集合,打印元素
        for (int i = 0; i < list.size(); i++) {
            Student student = list.get(i);
            System.out.println(student);  // 自定义的类, 未作特殊处理, 不能像 String 那样直接打印出内容
            System.out.println(student.getAge() + " " + student.getName());
        }
    }
}

执行结果:

Student{age = 23, name = xiaoming}
23 xiaoming
Student{age = 24, name = xiaowang}
24 xiaowang

练习:
添加学生对象并遍历
需求:定义一个集合, 添加一些学生对象, 并进行遍历
学生类的属性为:姓名, 年龄
要求:对象的数据来自键盘录入

Javabean 类(和上面的练习的 Javabean 类一样):

public class Student {
    private int age;
    private String name;

    public Student() {
    }

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

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "Student{age = " + age + ", name = " + name + "}";
    }
}

测试类:

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

public class Test4 {
    public static void main(String[] args) {
        // 创建集合
        ArrayList<Student> list = new ArrayList<>();  // 刚开始创建的这个集合是空的,长度为 0

        // 从键盘读入学生的信息并添加到集合中
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {  // 这里只能给定一个固定值 3
            Student s = new Student();  // 创建学生对象的代码必须放在循环内,每一个循环都创建一个新的学生对象
            System.out.print("请输入学生的姓名: ");
            s.setName(sc.next());  // 从键盘读取学生的姓名并赋值给学生对象
            System.out.print("请输入学生的年龄: ");
            s.setAge(sc.nextInt());  // 从键盘读取学生的年龄并赋值给学生对象
            // 将学生对象添加到集合中
            list.add(s);
        }

        // 遍历集合,打印内容
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
            System.out.println(list.get(i).getName() + " " + list.get(i).getAge());
        }
    }
}

执行结果:

请输入学生的姓名: xiaoming
请输入学生的年龄: 23
请输入学生的姓名: xiaozhang
请输入学生的年龄: 25
请输入学生的姓名: xiaoli
请输入学生的年龄: 20
Student{age = 23, name = xiaoming}
xiaoming 23
Student{age = 25, name = xiaozhang}
xiaozhang 25
Student{age = 20, name = xiaoli}
xiaoli 20

练习:
添加用户对象并判断是否存在
需求:
main方法中定义一个集合, 存入三个用户对象。
用户属性为:id, username, password
要求:定义一个方法, 根据 id 查找对应的用户信息。

如果存在, 返回 true

如果不存在, 返回 false

Javabean 类:

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

    public User() {
    }

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

    /**
     * 获取
     * @return id
     */
    public String getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取
     * @return username
     */
    public String getUsername() {
        return username;
    }

    /**
     * 设置
     * @param username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * 获取
     * @return password
     */
    public String getPassword() {
        return password;
    }

    /**
     * 设置
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    public String toString() {
        return "User{id = " + id + ", username = " + username + ", password = " + password + "}";
    }
}

测试类:

import java.util.ArrayList;

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

        User u1 = new User("123", "xiaoming", "111");
        User u2 = new User("1234", "xiaofeng", "222");
        User u3 = new User("12345", "xiaozhang", "333");

        list.add(u1);
        list.add(u2);
        list.add(u3);

        String id = "1234";
        System.out.println(check(list, id));        // true
    }

    public static boolean check(ArrayList<User> list, String id) {
        for (int i = 0; i < list.size(); i++)
            if (list.get(i).getId().equals(id))
                return true;
        return false;
    }
}

练习:
添加用户对象并判断是否存在
需求:
main 方法中定义一个集合, 存入三个用户对象
用户属性为:id, username, password
要求:定义一个方法, 根据 id 查找对应的用户信息
如果存在, 返回索引
如果不存在, 返回 -1

测试类:

import java.util.ArrayList;

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

        User u1 = new User("123", "xiaoming", "111");
        User u2 = new User("1234", "xiaofeng", "222");
        User u3 = new User("12345", "xiaozhang", "333");

        list.add(u1);
        list.add(u2);
        list.add(u3);

        String id1 = "1234";

        System.out.println(getIndex(list, id1));         // 1

        String id2 = "999";

        System.out.println(getIndex(list, id2));         // -1
    }

    public static int getIndex(ArrayList<User> list, String id) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getId().equals(id)) {
                return i;
            }
        }
        return -1;
    }
}

可以将上面两个练习写到一起:

import java.util.ArrayList;

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

        User u1 = new User("123", "xiaoming", "111");
        User u2 = new User("1234", "xiaofeng", "222");
        User u3 = new User("12345", "xiaozhang", "333");

        list.add(u1);
        list.add(u2);
        list.add(u3);

        String id = "1234";
        System.out.println(check(list, id));        // true
    }

    public static boolean check(ArrayList<User> list, String id) {
        // for (int i = 0; i < list.size(); i++)
        //     if (list.get(i).getId().equals(id))
        //         return true;
        // return false;
        return getIndex(list, id) >= 0;
    }

    public static int getIndex(ArrayList<User> list, String id) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getId().equals(id)) {
                return i;
            }
        }
        return -1;
    }
}

练习:
添加手机对象并返回要求的数据
需求:
定义 Javabean 类:Phone
Phone 属性:品牌, 价格。
main 方法中定义一个集合, 存入三个手机对象。
分别为:小米, 1000。苹果, 8000。锤子 2999。
定义一个方法, 将价格低于 3000 的手机信息返回。

Javabean 类:

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

    public Phone() {
    }

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

    /**
     * 获取
     * @return brand
     */
    public String getBrand() {
        return brand;
    }

    /**
     * 设置
     * @param brand
     */
    public void setBrand(String brand) {
        this.brand = brand;
    }

    /**
     * 获取
     * @return price
     */
    public int getPrice() {
        return price;
    }

    /**
     * 设置
     * @param price
     */
    public void setPrice(int price) {
        this.price = price;
    }

    public String toString() {
        return "Phone{brand = " + brand + ", price = " + price + "}";
    }
}

测试类:

import java.util.ArrayList;

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

        Phone p1 = new Phone("小米", 1999);
        Phone p2 = new Phone("苹果", 6999);
        Phone p3 = new Phone("锤子", 2999);

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

        ArrayList<Phone> newList = getPhone(list);
        for (int i = 0; i < newList.size(); i++) {
            Phone p = newList.get(i);
            System.out.println(p.getBrand() + " " + p.getPrice());
        }
    }

    // 技巧:
    // 如果我们要返回多个数据,可以把这些数据放进一个容器中,再把容器返回
    // 容器可以选择集合或者数组,优先选择集合
    public static ArrayList<Phone> getPhone(ArrayList<Phone> list) {  // 这里的返回类型是 ArrayList<Phone>
        ArrayList<Phone> newList = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getPrice() < 3000) {
                newList.add(list.get(i));
            }
        }
        return newList;
    }
}

执行结果:

小米 1999
锤子 2999

如果要返回多个数据,可以将这些数据放到一个容器中,然后再把容器返回。容器可以用集合或者数组,但是集合的长度可以变化,因此较多使用集合。

代码:

import java.util.ArrayList;

public class ArrayListDemo3 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        System.out.println(list);       // [aaa]
        addString(list);
        System.out.println(list);       // [aaa, ddd], 说明传递的是地址, 可以在其他方法中直接更改这个集合
    }

    public static void addString(ArrayList<String> list) {
        list.add("ddd");
        // return list;
    }
}

标签:ArrayList,list,System,add,集合,public,out
From: https://www.cnblogs.com/Chengkai730/p/18401489

相关文章

  • java集合基础练习题
    List集合.ArrayList,LinkedList,Vector三者的相同点与不同点?(“Vector”可百度)【面试题】共同点:他们都实现了List接口,意味着他们具有相同的基本操作,如添加、删除、获取元素有序性和可重复性,他们都是有序的,即插入顺序和迭代顺序相同,都允许存储重复的元素都可以动态调整大......
  • Java集合框架体系
    Java集合类主要由两个接口Collection和Map派生出来的,Collection有三个子接口:List、Set、Queue。Collection:最基本的集合接口,代表一组元素的集合。List:代表有序的、可重复的元素。Set:代表不可重复的的集合。Queue:代表队列Map:存储键值对的集合,键不允许重复。List、Se......
  • 算法练习小技巧之有序集合--套路详细解析带例题(leetcode)
    前言:    本文详细讲解Python中的有序集合SortedList和C++中的有序集合multiset的用法,配合leetcode的例题来展示实际的用处。(本人水平不够,还无法讲解有序集合的实现方法,只会用)    觉得有帮助或者写的不错可以点个赞,后面也有几道我找出来的题目可以用这个方......
  • llama_vllm对话问答基础语言模型集合
    LLAMA论文https://arxiv.org/pdf/2302.13971.pdf模型结构LLAMA网络基于Transformer架构。提出了各种改进,并用于不同的模型,例如PaLM。以下是与原始架构的主要区别:预归一化。为了提高训练稳定性,对每个transformer子层的输入进行归一化,而不是对输出进行归一化。使用RMSN......
  • 机器学习笔记-集合算法
    集合算法(EnsembleLearningAlgorithms)是通过将多个模型(通常是弱学习器)组合在一起,以提高整体预测性能的机器学习方法。它们在分类、回归等任务中非常常见。主要的集合算法包括以下几类:1.Bagging(BootstrapAggregating)原理:通过对数据集进行有放回的采样,训练多个独立的模型......
  • Java:集合的相关汇总介绍
    主要包含Set(集)、List(列表包含Queue)和Map(映射)。1、Collection:Collection是集合List、Set、Queue的最基本的接口。2、Iterator:迭代器,可以通过迭代器遍历集合中的数据。3、Map:是映射表的基础接口。一、List接口Java的List是非常常用的数据类型。List是有......
  • 集合扩展方法
    功能清单    1.判断集合是否为Null    2.判断集合是否不为Null    3.判断集合是否有值    4.拼接成字符串    5.根据一个表达式去除重复    6.LIST转DataTableToDataTable()调用示例从数据库查询出来的List<Model>数......
  • 【Day06-集合-Collection&List&Set】
    集合        集合框架概述        Java集合框架(JavaCollectionFramework,JCF)是Java编程语言的一部分,它提供了一种存储和操作一组对象的方式。这个框架的设计目标是提供一组标准的数据结构来帮助开发者更有效地管理数据。        接口与实现接口......
  • 集合常见面试题
    一.List,Set,Map集合是否都继承自Collection接口1.List,Set和Map的基本概念List:一个有序集合(也称序列)。List中的元素是有序的,且可以重复。List接口的常用实现类由ArrayList,LinkedList等。Set:一个不包含重复元素的集合。Set中的元素是无序的(虽然某些Set实现可能会维护元素的某种......
  • 在 SQLAlchemy 中对数据异步处理的时候,获得关联集合的处理方式
    我们在定义SQLAlchemy对象模型的关系的时候,用到了relationship来标识关系,其中lazy的参数有多种不同的加载策略,本篇随笔介绍它们之间的关系,以及在异步处理中的一些代码案例。1、在SQLAlchemy中定义关系在SQLAlchemy中,relationship()函数用于定义表之间的关系(如one-to-ma......