集合之ArrayList
集合 VS 数组
1、数组声明后只能存放同一种数据类型,而集合可以存放不同的数据类型
2、数组声明后,长度便固定了,而集合长度是可变的
3、数据可以存放计本数据类型和引用数据类型,集合只能存放引用数据类型,要想集合能放基本数据类型可以转为相应的包装类数据类型。
ArrayList
首先我们来了解一下ArrayList,它是一个可变长的集合,当指针等于数组的长度时,集合自动扩容至原来的1.5倍,初始长度是10,是一个线程不安全的一维数组的数据结构,并且它是有序,可使用索引访问、元素可重复的集合。
ArrayList的创建
ArrayList list = new ArrayList();
ArrayList<Object> arrayList = new ArrayList<>();
创建ArrayList有两种创建方法,一种是无泛型的,如以上第一种,它可以存放任意数据类型;还有一种就是有泛型的,如第二种,在尖括号类写你要规定的类型,比如Integer、String、以及自定义数据类的数据类型,如Student、Car、Teacher、Worker等等,当规定了泛型之后,你定义的这个集合就只能存放一种数据类型。
添加元素
这里是使用无泛型的集合。可以添加任意数据类型
list.add("小红帽");
list.add(666);//自动装箱Integer.valueOf(666);
list.add('M');//自动装箱Character.valueOf('M');
list.add(false);//自动装箱Boolean.valueOf(false);
list.add('M');
list.add("小红帽");
list.add(1, "欧阳娜拉");//指定下标上增加
Collections.addAll(list, "王力宏","王丽坤","王宝强","王源");//利用集合工具类批量添加
- 获取集合长度
System.out.println("集合长度:"+list.size());
- 获取元素与下标
System.out.println("下标为1的元素是:"+list.get(1));
System.out.println("获取对应元素的第一个下标:"+list.indexOf('M'));
System.out.println("获取对应元素的最后一个下标:"+list.lastIndexOf('M'));
- 删除元素
System.out.println("根据下标删除元素:"+list.remove(4));
System.out.println("根据元素删除,成功返回true,失败返回false:"+list.remove(false));
使用泛型的集合可以使用过滤器删除
System.out.println("根据过滤器删除元素:");
list2.removeIf(new Predicate<String>() {
@Override
public boolean test(String str) {
// TODO Auto-generated method stub
if(str.equals("小红帽")) {
return true;
}
return false;
}
});
遍历结合
- 普通for循环遍历
System.out.println("第一种方式:for循环");
for (int i = 0; i < list2.size(); i++) {
System.out.println(list2.get(i));
}
2.增强for循环遍历
System.out.println("第二种遍历,增强for循环,foreach");
for (Object object : list2) {
System.out.println(object);
}
- 迭代器遍历
System.out.println("第三种遍历方式,迭代器");
Iterator it2 =list2.iterator();
while(it2.hasNext()) {
System.out.println(it2.next());
}
测试所写代码
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.function.Predicate;
public class MyArrayListTest {
public static void main(String[] args) {
/*
* ArrayList基本使用1,不加泛型,可以存储任何数据类型(基本数据类型直接自动装箱)
*/
ArrayList list = new ArrayList();
list.add("小红帽");
list.add(666);//自动装箱Integer.valueOf(666);
list.add('M');//自动装箱Character.valueOf('M');
list.add(false);//自动装箱Boolean.valueOf(false);
list.add('M');
list.add("小红帽");
list.add(1, "欧阳娜拉");//指定下标上增加
Collections.addAll(list, "王力宏","王丽坤","王宝强","王源");//利用集合工具类批量添加
System.out.println("集合长度:"+list.size());
System.out.println("下标为1的元素是:"+list.get(1));
System.out.println("获取对应元素的第一个下标:"+list.indexOf('M'));
System.out.println("获取对应元素的最后一个下标:"+list.lastIndexOf('M'));
System.out.println("根据下标删除元素:"+list.remove(4));
System.out.println("根据元素删除,成功返回true,失败返回false:"+list.remove(false));
//遍历
//第一种方式:for循环
System.out.println("第一种方式:for循环");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//第二种遍历,增强for循环,foreach
System.out.println("第二种遍历,增强for循环,foreach");
for (Object object : list) {
System.out.println(object);
}
//第三种遍历方式,迭代器
System.out.println("第三种遍历方式,迭代器");
Iterator it =list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
// 增加泛型,可以使用过滤器删除元素,迭代器删除指定元素将会删除集合中所有该元素
ArrayList<String>list2 =new ArrayList<>();
list2.add("小红帽");
list2.add("田馥甄");
list2.add("林俊杰");
list2.add("佟丽娅");
list2.add("迪丽热巴");
list2.add("冯绍峰");
list2.add(1, "欧阳娜拉");
//批量添加
list.addAll(list2);
System.out.println("通过批量添加list2后的list:"+list.toString());
System.out.println("根据过滤器删除元素:");
list2.removeIf(new Predicate<String>() {
@Override
public boolean test(String str) {
// TODO Auto-generated method stub
if(str.equals("小红帽")) {
return true;
}
return false;
}
});
//遍历
//第一种方式:for循环
System.out.println("第一种方式:for循环");
for (int i = 0; i < list2.size(); i++) {
System.out.println(list2.get(i));
}
//第二种遍历,增强for循环,foreach
System.out.println("第二种遍历,增强for循环,foreach");
for (Object object : list2) {
System.out.println(object);
}
//第三种遍历方式,迭代器
System.out.println("第三种遍历方式,迭代器");
Iterator it2 =list2.iterator();
while(it2.hasNext()) {
System.out.println(it2.next());
}
}
}
提示
以上只是我自己的看法,如有相同纯属意外。如有错误,也请谅解,勿喷!如有收获或疑问,欢迎点赞评论!