介绍
集合可以存放引用数据类型,但是不能存放基本数据类型,如果想要存放基本数据类型,需要将基本数据类型转换为它的包装类,再存放进集合中。
集合的长度可以自动改变,添加元素时集合长度自动变大,删除元素时集合长度自动变小。
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