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;
}
}