文章目录
一、为什么要有集合?
如果我现在想同时存储多个元素,我们该怎么办?
数组就可以干这件事情,但是数组有弊端。
数组的长度是固定的,一旦创建完毕后,长度就不能发生变化了。那能不能有一个容器它的长度是可变的呢?当然有,这个容器就是我们今天要学习的集合。
集合是一个容器,它也是可以来存储多个数据,只不过它的长度是可以发生变化的。
当我们在创建一个集合对象的时候,因为一开始还没有添加元素,因此集合的长度一开始是为0。然后添加了第一个元素,集合的长度会自动扩容变成1,不需要我们管,集合底层自动实现的,我们只需要把元素添加进去就可以了。当添加第二个元素进去的时候,集合的长度会再次扩容变成2。添加第三个元素,它的长度会再次扩容变成3…在这个过程中,最为重要的四个字:自动扩容
二、集合存储数据类型的特点
除此之外,集合跟数组在存储元素之外还有第二个区别。
数组是可以存储基本数据类型的,例如 int[] arr1 = new int[3];
数组也是可以存储引用数据类型的,例如 User[] userArr = new User[2];
但是集合只可以存引用数据类型。
但如果我们就是想存 1~9
这样的整数,或者是小数,或者是字符怎么办,就需要将它们变成其对应的包装类。
三、集合和数组的对比
1)长度的区别
数组的长度是固定的,集合的长度是可变的,当我们往集合中添加了一个元素后,集合的长度自动加1,删除一个元素,集合的长度自动减一。如果我们添加了两个元素,集合的长度自动加二,删除两个元素,集合的长度自动减二。非常的灵活,用八个字去形容:自动伸缩,可长可短。
2)存储类型的区别
数组是可以存储基本数据类型的,例如整数、小数、字符、布尔…
数组还可以存引用数据类型。
但是集合只能存引用数据类型,如果需要存基本数据类型,需要把它们变成其对应的包装类才可以。
四、集合
在Java中其实规定了很多很多种集合,每种集合都有其各自的特点。
现在我们先来学习以后用的最多的 ArrayList
集合。
五、ArrayList集合
想要学习这个类,肯定要来看它的构造和成员方法,因此我们先打开API帮助文档先查阅一下。
ArrayList
是定义在 java.util
包下的,因此我们一会在使用的时候需要导包。
在类名的右侧有个 <E>
,这个 <E>
就是泛型,我们在创建对象的时候,ArrayList
后面也要写这样的 <>
,<>
里面写存储的数据类型就可以了。
再往下看的就是构造方法,构造是一个空参的,我们就用它就行。
创建完对象后,我们就可以成员方法对集合里的数据进行添加、删除、查找等等。
package com.itheima.listdemo;
import java.util.ArrayList;
public class ArrayListDemo1 {
public static void main(String[] args) {
//1.创建集合的对象,集合的对象创建完毕后,就好比存储数据的容器就有了
// 但是这么写会有个小问题,集合也是个容器,也可以用来存储数据,但这里容器中的数据类型没发限定
ArrayList list = new ArrayList();
//此时我们就需要引入一个概念 —— 泛型,泛型的作用:限定集合中存储数据的类型
// 如果在里面写了int,就会报错,因为集合里面不能直接存基本数据类型
ArrayList<int> list = new ArrayList();
// 但我们可以写字符串,因为在字符串是引用数据类型,前面写了,后面也需要写,即在类名的后面都需要写上
// 这句话的意思就是:我们创建了一个集合用来存储数据,集合以后只能存储String这样的字符串
ArrayList<String> list = new ArrayList<String>();
// 但是这种写法是JDK7以前的写法,到了JDK7以后,它觉得,我前面写过了,那后面还要再写一遍,太麻烦了,因此后面的String可以省略不写,但是<>一定要留着
ArrayList<String> list = new ArrayList<String>();
//解释[]:
//此时我们创建的是ArrayList的对象,而ArrayList是java已经写好的一个类
//这个类在底层做了一些处理
//1.打印对象不是地址值,而是集合中存储数据内容
//2.在展示的时候会拿[]把所有的数据进行包裹
//如果[]中间什么也没有,就表示集合现在是空的,它的长度为0,里面是没有内容的
ArrayList<String> list = new ArrayList<>();
System.out.println(list);
}
}
六、ArrayList
成员方法
虽然方法很多,但是我们可以总结为四个字:增、删、改、查。
查的时候我们可以查询单个的,也可以查询集合中所有的元素。
所以说我们以后在学习这种容器类的知识点的时候,抓住 增、删、改、查 这四个字就可以了。
方法名 | 说明 |
---|---|
public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾 |
public boolean remove(要删除的元素) | 删除指定元素,返回值表示是否删除成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |
1)boolean add(E e)
list.add("aaa");
代码中,调用 add
方法时候,括号里面的 e
就表示 element,即添加元素的意思。
这里的 e
的类型是 String
,就表示现在可以往里面添加字符串。
方法的返回值是布尔类型的,表示当前的元素是否添加成功。
ArrayList
集合有一个特点,就是不管添加什么,它都是可以添加成功的,因此这个方法永远返回一个 true
。
我们可以来看看 add
的源码,选中 add
,然后ctrl + b。
虽然中间这两行我们暂时看不懂,没关系,我们直接看最后一句话。在添加完毕后,它直接 return 一个 true
。
由于因为不管添加什么,都会返回一个true
,因此我们在添加的时候一般是不会去管它的返回值的,也就是说我们直接调用方法,直接使用方法本身的添加功能就可以了:list.add("aaa");
//1.创建一个集合
ArrayList<String> list = new ArrayList<>();
//2.添加元素
list.add("aaa");
list.add("aaa");
list.add("bbb");
list.add("ccc");
2)boolean remove(E e)
元素删除成功,返回一个 true
;如果删除失败,返回 false
boolean result1 = list.remove("aaa");
System.out.println(result1); // true
boolean result2 = list.remove("ddd");
System.out.println(result2); // 当你要删除的元素不存在的时候,就会返回false
3)E remove(int index)
根据索引删除,看到这个方法就知道,ArrayList集合
还有索引,它的索引规则跟数组、字符串的规则都是一样的,都是从0开始,逐一增长,中间不间断的。
如果是通过索引删除的,它就会把被删除的元素返回。
String str = list.remove(2);
System.out.println(str); // "aaa"
3)E set(int index,E e)
把被覆盖的元素,也就是原来的旧值返回。
String result = list.set(1, "ddd"); // 将 1 索引上的元素变成 "ddd"
System.out.println(result); // 接收到的是 "aaa",即被覆盖的字符串
4)E get(int index)
根据制定的索引来查询到对应的元素。
String s = list.get(0);
System.out.println(s); // "aaa"
5)int size()
获取集合的长度,要注意的是,集合的长度不叫做 length()
了,而是 size()
,而且它也是个方法,在调用的时候需要加一个 ()
。
方法就会将集合的长度做一个返回。
get()
方法与 size()
方法结合起来就可以做一个变量,遍历同样不需要我们手写,使用IDEA快捷方式自动生成就可以了:list.fori 。
//遍历
for (int i = 0; i < list.size(); i++) {
//i 索引
//list.get(i) 元素
String str = list.get(i);
System.out.println(str);
}