集合之ArrayList集合
数组的缺点:数组定义完成并启动后,类型和长度是固定的。数组适合做数据个数和类型确定的场景,不适合做元素个数不确定的业务场景
集合的特点:集合的大小不固定,启动后可以动态变化大小,类型也可以不固定。适合元素个数不确定,需要进行增删改操作的业务场景。
ArrayList是集合中的一种,支持索引(即每个数据是有编号的)
ArrayList入门使用:
//1.调用无参构造器,创建ArrayList对象
ArrayList list = new ArrayList();
//2.向集合中添加数据
// public boolean add(E e)
list.add("zlprime");
list.add("java");
list.add(888);
//3.向指定索引位置插入数据,插入位置的数据会自动向后迁移
// public void add(int index,E e)
list.add(1,".cn");
System.out.println(list);
//输出结果 [zlprime, .cn, java, 888]
使用泛型统一ArrayList操作的数据类型:
/*
ArrayList的泛型类: ArrayList<E>
<E> 表示在编译阶段约束集合对象只能操作 E 这种数据类型
ArrayList<String>: 表示此集合只能操作字符串类型的元素
ArrayList<Integer>: 表示此集合只能操作整数类型的元素
*/
ArrayList<String> str_lists = new ArrayList<>();
str_lists.add("zhang");
//str_lists.add(1); //由于通过泛型,指定了数据类型,所以再添加非String类型的数据就报错了
ArrayList的常用API:
ArrayList<String> lists = new ArrayList<>();
lists.add("Java");
lists.add("Python");
lists.add("HTML");
lists.add("VUE");
//1.public E get(int index) 获取某个索引位置处的元素值
String s = lists.get(0); // 输出结果 Java
//2.public int size() 获取集合中的元素个数
System.out.println(lists.size()); // 输出结果 4
//3.集合的遍历
for (String list : lists) {
System.out.println(list);
}
//4.public E remove(int index) 删除索引位置的元素值,并返回该元素值
String remove = lists.remove(1);
System.out.println(remove); // 输出结果 Python 。此时,字符Python已经从集合中删除嘞
//5.public boolean remove(Object o) 删除指定元素值,成功返回true,失败返回false
//如果集合中有重复的元素值,则只会删除第一次出现的
boolean result = lists.remove("HTML1"); //result的值是false,因为集合中并没有 HTML1 这个元素值
//6.public E set(int index,E e) 修改指定index位置的元素值,返回修改前的元素值
String css = lists.set(2, "CSS"); //将原有的VUE 修改成CSS,返回的值是VUE
System.out.println(css);
1.从集合中遍历元素,并删除符合条件的元素时,应该从集合后面往前进行遍历,可以避免漏掉元素
//从集合中遍历元素,并删除符合条件的元素时,应该从集合后面往前进行遍历,可以避免漏掉元素
//将整型集合[121,99,78,88]中小于100的元素进行删除
ArrayList<Integer> lists = new ArrayList<>();
lists.add(121);
lists.add(99);
lists.add(78);
lists.add(88);
for (int i = 0; i < lists.size(); i++) {
if(lists.get(i)<100){
lists.remove(i);
}
}
System.out.println(lists); //输出结果 [121, 78]
/*
我们可以发现,输出的结果中有元素不符合要求,但是同样没有被删除
遍历集合的过程如下:
i = 0 lists.size() = 4 ,lists.get(0)= 121>100 保留, i++ lists:[121,99,78,88]
i = 1 lists.size() = 4 ,lists.get(1)=99 < 100 删除, i++ lists:[121,78,88]
i = 2 lists.size() = 3 ,lists.get(2)=88 < 100 删除, i++ lists:[121,78]
此时,i = 3 > lists.size(),则跳出了循环。
但是78并没有被正确删除,这是由于在删除的过程中,集合的大小是动态变化的,索引值却在正常的递增。
这就回导致一部分符合条件的元素,也无法被删除
解决这个问题,可以通过从集合后面往前进行遍历
*/
for (int i = lists.size()-1; i >=0;i--) {
if(lists.get(i)<100){
lists.remove(i);
}
}
System.out.println(lists); //输出结果 [121]
2.集合中存储的元素并不是对象本身,而是对象的内存地址
本文系作者 @Stone 原创发布在 。未经许可,禁止转载。