java集合(ArrayList)学习整理
整理一下在How2J学习网站学习java集合(ArrayList)的笔记,笔记整理如下:
一、集合与数组的区别
1. 使用数组的局限性
如果要存放多个对象,可以使用数组,但是数组有局限性
比如 声明长度是10的数组
不用的数组就浪费了
超过10的个数,又放不下
2. ArrayList存放对象
为了解决数组的局限性,引入容器类的概念。 最常见的容器类就是 ArrayList
容器的容量会随着对象的增加,自动增长
只需要不断往容器里增加数据即可,不用担心会出现数组的边界问题
二、ArrayList常用方法
1. 增加
add 有两种用法
第一种是直接add对象,把对象加在最后面
例如:
ArrayList<Employee> arr=new ArrayList<Employee>();
// 把5个对象加入到ArrayList中
for (int i = 0; i < 5; i++) {
arr.add(new Employee("employee" + i));
}
第二种是在指定位置加对象
例如:
Employee specialEmployee = new Employee("special employee");
heros.add(3, specialEmployee );
2. 判断是否存在
通过方法contains 判断一个对象是否在容器中
判断标准: 是否是同一个对象,而不是name是否相同
//虽然一个新的对象名字也叫 employee 1,但是contains的返回是false
System.out.println(arr.contains(new Employee("employee 1")));
//而对specialEmployee 的判断,contains的返回是true
System.out.println(arr.contains(specialEmployee ));
3. 删除
remove用于把对象从ArrayList中删除
remove可以根据下标删除ArrayList的元素
例如:
arr.remove(2);
也可以根据对象删除
arr.remove(specialEmployee );
4. 获取指定位置的对象
通过get获取指定位置的对象,如果输入的下标越界,
会报IndexOutOfBoundsException异常
arr.get(5);
5. 获取对象所处的位置
indexOf用于判断一个对象在ArrayList中所处的位置
与contains一样,判断标准是对象是否相同,而非对象的name值
//新的英雄,但是名字是emloyee 1:arr.indexOf(new Employee("emloyee 1"))输出为-1
arr.indexOf(specialEmployee);
6. 替换
set用于替换指定位置的元素
arr.set(5, new Employee("emloyee 5"));
7. 获取大小
size 用于获取ArrayList的大小
arr.size();
8. 转换为数组
toArray可以把一个ArrayList对象转换为数组。
需要注意的是,如果要转换为一个Employee数组,那么需要传递一
个Employee数组类型的对象给toArray(),这样toArray方法才知道你
希望转换为哪种类型的数组,否则只能转换为Object数组
Employee ep[] = (Employee [])arr.toArray(new Employee []{});
9. 把另一个容器所有对象都加进来
addAll 把另一个容器所有对象都加进来
ArrayList another= new ArrayList();
another.add(new Employee("employee a"));
another.add(new Employee("employee b"));
another.add(new Employee("employee c"));
arr.addAll(another);
10. 清空
clear 清空一个ArrayList
arr.clear();
三、ArrayList和List
ArrayList实现了接口List
常见的写法会把引用声明为接口List类型
注意:是java.util.List,而不是java.awt.List
implements List<E>
四、泛型Generic
不指定泛型的容器,可以存放任何类型的元素
指定了泛型的容器,只能存放指定类型的元素以及其子类
1. 泛型的简写
为了不使编译器出现警告,需要前后都使用泛型,像这样:
List<Employee> genericheros = new ArrayList<Employee>();
不过JDK7提供了一个可以略微减少代码量的泛型简写方式
List<Employee> genericheros2 = new ArrayList<>();
后面的泛型可以用<>来代替
五、遍历
1. 用for循环遍历
用size()和get()分别得到大小,和获取指定位置的元素,结合for循环
就可以遍历出ArrayList的内容
List<Employee> arr= new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
arr.add(new Employee("employee name " + i));
}
// 第一种遍历 for循环
System.out.println("--------for 循环-------");
for (int i = 0; i < arr.size(); i++) {
Employee e= arr.get(i);
System.out.println(e);```
2. 迭代器遍历
//第二种遍历,使用迭代器
Iterator<Employee> it= arr.iterator();
//从最开始的位置判断"下一个"位置是否有数据
//如果有就通过next取出来,并且把指针向下移动
//直到"下一个"位置没有数据
while(it.hasNext()){
Employee e = it.next();
System.out.println(e);
}
//迭代器的for写法
System.out.println("--------使用for的iterator-------");
for (Iterator<Employee > iterator = arr.iterator(); iterator.hasNext();) {
Employee employee= (Employee ) iterator.next();
System.out.println(employee);
}
3.用增强型for循环
使用增强型for循环可以非常方便的遍历ArrayList中的元素,这是很多
开发人员的首选。
不过增强型for循环也有不足:
无法用来进行ArrayList的初始化
无法得知当前是第几个元素了,
当需要只打印单数元素的时候,就做不到了,必须再自定下标变量。
List<Employee > arr= new ArrayList<Employee >();
for (int i = 0; i < 5; i++) {
arr.add(new Employee ("employee name " + i));
}
// 第三种,增强型for循环
System.out.println("--------增强型for循环-------");
for (Employee e : arr) {
System.out.println(e);
}