我最近也在想要不要把一些基础的东西复习一下,毕竟万丈高楼平地起,后续还会出一篇集合的进阶篇,关于jetpack组件也没啥好去研究的了,后面会在用到的时候再去更新,这里我就去看了一下一些Java基础,然后写一系列Java基础的文章,希望然自己温故而知新的同时也能让大家学到一些东西。
1、什么是集合
相信大家对于集合基本都很熟悉了,集合是我们在开发中常用的数据类型,简单地说就是可以存放多组同种数据类型的一种数据类型(自己的理解),比如它可以存放多个学生的基本信息,这篇文章我将由浅及深地介绍集合的用处以及会说明它和数组的区别。
2、集合与数组的区别
数组是大家都非常常见的一个数据类型,它和集合一样可以存放多组同种数据类型,那很多兄弟就觉得很奇怪,都有数组了为啥还要集合呢?既然这个东西存在就一定有它存在的价值,那集合肯定有和数组不一样的用处,具体是什么我也就学着卖个关子,我通过一个例子来把这个简单的区别体现出来并加深印象。
我们假设现在我需要我有一个需求,我需要将(张三,23)、(李四,24)、(王五,25)三个学生的姓名和年龄打印在控制台上,就这一个简单的例子先来做思路分析(虽然简单没必要,但个人习惯改不掉),思路分析如下:
1、定义一个学生类Student用于封装学生数据
2、动态初始化数组为3的数组,类型为Student
3、根据需求创建三个学生对象
4、将学生对象出入数组
5、遍历数组取出每一个学生对象
6、获取每个对象的学生信息,并输出到控制台
接下来就很简单了,先创建数据类Student,这里我用的是kotlin语言直接创建的data class,用Java语言需要实现构造方法和参数的get和set方法(所以说kotlin语言还是很方便的,手动狗头)
kotlin:
data class Student(val name:String,val age:Int)
Java:
public class Student {
private String name;
private int 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;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
然后根据我们的思路完成主函数代码,都有注释就不一一分析了,相信都能看懂。
import dataClass.Student;
public class ArrayListDemo {
public static void main(String[] args) {
//创建长度为3的数组
Student[] arr = new Student[3];
//创建三个学生对象
Student st1 = new Student("张三", 23);
Student st2 = new Student("李四", 24);
Student st3 = new Student("王五", 25);
//将三个学生对象添加到数组
arr[0] = st1;
arr[1] = st2;
arr[2] = st3;
//遍历并输出学生信息
for (int i = 0; i < arr.length; i++) {
Student temp = arr[i];
System.out.println(temp.getName() + "-----" + temp.getAge());
}
}
}
输出结果:
image.png
上面我们拿到问题并进行思路分析成功实现了这个小功能,但是还是有很大的隐患,比如我们现在设计的是一个学生管理系统,我们在数组里先存入了这三个学生的信息,如果这时学生增加,我们想往数组里面添加新同学的信息,我们知道数组的长度是确定的,那就需要重新创建一个长度为4的数组重新存入,所以我们需要一个类似于数组这样可以存放多个数据的容器,但是它的长度可以动态增加,这就是集合,也是集合与数组的最大区别。
总结:数组的容量是固定的,集合的容量是可变的。
3、ArrayList的构造方法和添加方法
ArrayList官方API里面的构造方法
image.png
第一个空参构造方法是创建一个初始容量为10的容器,但在实际应用中即使你需要更大的容量他也会自动增加,所以基本实际应用时都是通过空参构造方法把容器创建出来,长度一般也就不再关心了。
向集合内部添加元素一般用add()方法,它的add()方法有两种,我们通过一个小例子来看一下。
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
list.add("abc");
list.add(123);
list.add(false);
System.out.println(list);
}
}
运行结果如下
image.png
这是ArrayList的第一个添加形式,我们发现使用空参构造方法的ArrayList可以往里面添加任意类型的数据,我分别乡里面添加了字符串、整型、和boolean型,但在实际的时候往往需要对集合ArrayList里面存放的数据类型进行规定以方便操作数据,比如我需要规定list里面只能存放string类型,写法如下:
ArrayList<String> list=new ArrayList<>();
就是在前面价格<>,里面放入String。(其实里面<>里面的东西就是泛型,现在跟着学习路线走就不介绍了,后续会说),<>里面只能放引用数据类型(比如String),不能写基本数据类型(比如int、double等)
还有一个需要注意的地方,我们打印的时候直接用list,为什么不会打印出地址呢,按理来说打印变量名输出的应该都是该变量的地址,但这里直接输出了list的内容,这里记一下就可以了----打印string、stringbuilder时直接使用变量名即可(原理不清楚)
另外一个add()方法是两个参数,举个例子,在list的第一个位置添加字符串“aaa”
list.add(1,"aaa")。
需要注意的事下标从0开始。。。
4、集合中常用的方法
关于ArrayList的常用方法无非就是一些CRUD操作方法,如下表:
image.png
下面是每个函数的代码演示
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
list.add("fff");
Boolean b1=list.remove("aaa");
System.out.println("删除指定元素后:"+list+"---"+b1);
String str1=list.remove(0);
System.out.println("删除索引处元素后:"+list+"---"+str1);
String str2=list.set(0,"zzp");
System.out.println("将第一个元素改为zzp后"+list+"---"+str2);
System.out.println("得到第二个元素"+list.get(1));
System.out.println("集合的长度是"+list.size());
}
}
输出结果:
image.png
5、ArrayList一些特殊的方法
比如我现在有一个list,里面存放的数据是张三、张三、李四、王五、孙六、张三,我希望把张三全部删除,可以看出里面有多个张三,我们先用上面说到的remove方法试试
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("张三");
list.add("李四");
list.add("王五");
list.add("孙六");
list.add("张三");
list.remove("张三");
System.out.println(list);
}
}
它的输出结果是这样的
image.png
我们发现它并不会删除所有的张三,只是删除了第一个张三,那怎么来删除所有的张三呢?只能使用遍历集合加判断的方式,初步设计代码如下:
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("张三");
list.add("李四");
list.add("王五");
list.add("孙六");
list.add("张三");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("张三")){
list.remove(i);
}
}
System.out.println(list);
}
}
结果如下:
image.png
好的,问题出现了,最后一个张三没删除,这是为啥勒,原因就是删除元素后所有元素都会往前移一位,所以我们需要在删除元素后对i进行减一操作,修改代码如下:
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("张三");
list.add("李四");
list.add("王五");
list.add("孙六");
list.add("张三");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("张三")){
list.remove(i);
i--;
}
}
System.out.println(list);
}
}
结果如下:
到此就正确地删除了所有张三,其实问题很简单,就是要注意删除以后把要遍历的下标减一,不然有些元素会没有遍历到。
此文章是自己复习时总结所出,适合于没基础的同学学习观看,都是些简单到不能再简单的东西,高手勿看。
网友评论