一、为什么有集合
1.集合和数组区别
(1)长度
数组一旦创建长度就不能修改了
集合时可以发生变化的,他可以自动扩容;添加数据的时候不需要考虑索引,默认将数据添加到末尾。
(2)存储类型
数组:可以存基本数据类型和引用数据类型
集合:引用数据类型,不能直接存基本数据类型,需要变成对应的包装类
二、集合—ArrayList
1.泛型
泛型:限定集合中存储数据类型
Class ArrayList,这里的 < E>就是泛型
2.构造
ArrayList<String> list = new ArrayList<String>();//后面的String可以省略不写
System.out.println(list);//输出:[]
分析:
这个类再底层做了一些处理。打印对象不是地址值,而是及合作存储的数据内容;在展示集合中的内容时,会用[ ]把所有的数据进行包裹,中间用逗号隔开
3.成员方法
方法名 | 说明 |
---|---|
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)关于add()方法
不管添加什么,都会返回true
底层代码如下:
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
(2)remove()方法
两种:删除字符串,根据索引删除
一个字符串占用一个索引
被删除的元素会做一个返回。
三、练习
1.关于输出格式
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);//(1)[aaa, bbb, ccc]
System.out.print("[");
for (int i = 0; i < list.size() - 1; i++) {
System.out.print(list.get(i) + ",");
}
System.out.println(list.get(list.size() - 1) + "]");
//(2)[aaa,bbb,ccc]
分析:
输出(1):在bbb和ccc之前会有空格,这是集合直接输出的格式
2.在集合里添加数字
基本数据类型对应的包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
3.集合循环遍历
(1)集合长度
ArrayList<Student> list = new ArrayList<>();
for (int i = 0; i < list.size() ; i++) {
System.out.println("111");
list.add("222");
}
System.out.println(list.size());//0
输出结果为0
分析:ArrayList的长度时自动扩容的,即list.size()刚开始值为0,for循环里的内容并没有执行
(2)关于存储
Student s = new Student();<1>
for (int i = 0; i < 3 ; i++) {
Student s = new Student();//<2>
System.out.println("请输入学生的姓名:");
String name = sc.next();
System.out.println("请输入学生年龄:");
int age = sc.nextInt();
//把name,age赋值给学生对象
s.setName(name);
s.setAge(age);
list.add(s);
}
分析:
如果把 Student s = new Student();放在循环外,会出现的结果
存储的三条数据均为最后一次输入的数据
原因:
new出来的学生对象,假设地址为0x0011,赋值之后,把0x0011这个地址值放入集合中;当 Student s = new Student();放在循环外,没有new一个新的Student对象,再输入数据,则会覆盖0x0011里的数据;所以最后集合里面只有一个地址值,该地址所存储的内容是最后一次输入的内容。
4.手机信息查询
返回多个数据
可以把这些数据放在一个容器中,然后返回这个容器。
这个容器可以是集合,可以是数组
5.关于String串内字符打乱
必须先把它转化为字符型数组,打乱后再转为字符,字符串内不能进行打乱。