首页 > 代码库 > java集合之ArrayList
java集合之ArrayList
ArrayList<E>类:位于java.util包下,是List集合中的一种。
特点:有序,可重复,实现不同步,底层数据结构是数组,查询快增删慢。
常用构造:
ArrayList() : 空参构造,默认容量是10
ArrayList(int capacity) : 带参构造,指定初始容量。
方法:
1)添加功能
boolean add(E e) : 将指定的元素添加到此列表的尾部。
void add(int index,E e): 将指定的元素插入此列表中的指定位置。
boolean addAll(Collection<? extends E> c):按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
boolean addAll(int index, Collection<? extends E> c):从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。
2)判断功能
boolean isEmpty(): 如果此列表中没有元素,则返回 true,注意其内部代码是调用size()方法来判断的
boolean contains(Object o): 如果此列表中包含指定的元素,则返回 true
3)获取功能
int size() : 返回此列表中的元素个数。
E get(int index):返回此列表中指定位置上的元素。
4)删除功能
void clear() :移除此列表中的所有元素。注意:此方法比较暴力,一般不使用。
E remove(int index):移除此列表中指定位置上的元素。返回:从列表中移除的元素
boolean remove(Object o):移除此列表中首次出现的指定元素(如果存在)。如果此列表包含此元素则返回true
5)转换数组功能
Object[] toArray():按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
6)修改功能
E set(int index,E e) : 用指定的元素替代此列表中指定位置上的元素。返回以前位于该指定位置上的元素
集合的遍历方式:
1)增强for
存储自定义类,使用增强for进行集合的遍历。
package com.list;
public class Student {
private String name;
private int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
package com.list;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class CollectionTest {
public static void main(String[] args) {
//1 创建集合对象
List<Student> stus = new ArrayList<Student>();
//2 创建学生对象
Student stu1 = new Student("wen",23);
Student stu2 = new Student("zong",24);
Student stu3 = new Student("hu",21);
Student stu4 = new Student("wen",23);
Student stu5 = new Student("di",24);
Student stu6 = new Student("ya",24);
//3 添加学生对象
stus.add(stu1);
stus.add(stu2);
stus.add(stu3);
stus.add(stu4);
stus.add(stu5);
stus.add(stu6);
//遍历方式一: 将学生集合对象转成数组对象
Object[] studes = stus.toArray();
for(int i=0;i<studes.length;i++){
Student stu = (Student)studes[i];
System.out.println(stu);
}
//遍历方式二:利用迭代器遍历集合
ListIterator<Student> itor = stus.listIterator();
while(itor.hasNext()){ //刚开始迭代器指向集合的首部,需要执行next才能获取第一个元素,itor.remove();此方法不能用在next方法之前
Student stu = itor.next();
System.out.println(stu);
}
//逆序遍历,但是前提必须先前序遍历
while(itor.hasPrevious()){
Student stu = itor.previous();
System.out.println(stu);
}
//遍历方式三:普通for循环:虽然结构不好但效率好
for(Iterator<Student> itor = stus.iterator();itor.hasNext();){
Student stu = itor.next();
System.out.println(stu);
}
//遍历方式四:增强for
for(Student s : stus){
System.out.println(s);
}
}
}
遍历集合时出现的并发修改异常:
遍历集合时如果要实现对集合本身的修改,为防止出现并发修改异常:
如果使用迭代器遍历:要想实现对集合的修改,需要使用迭代器本身提供的功能方法(remove 或者 set)。
如果不是采用迭代器方式遍历:需要更改元素的位置索引,因为移除一个元素,其内部索引排序就变了,需要索引提前。防止后面元素替补,漏掉个别元素没有遍历到。
ArrayList实现元素不可重复的存取:
思路一:
创建两个集合:一个添加好元素list1和一个空列表list2
循环遍历list1集合,判断list2集合是否包含list1的元素,如果不包含就添加该元素到list2
最后就可以得到不含重复元素的集合list2
ArrayList源码解析:
1 ArrayList集合为什么可以添加重复的元素??
添加元素的源码:
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
查看源码可知,其底层直接添加,没有做任何判断,返回结果始终为true,表示始终添加成功。
2 ArrayList集合移除一个和指定元素的相等的元素,是移除一个还是把所有相同的全部移除????
通过查看源码可知:其移除第一次查找相等的元素,依赖equals()方法,对于自定义对象,需要重写该方法
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) { //同时也可以看出ArrayList允许存储Null
fastRemove(index);
return true; //移除成功
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true; //一旦查找到就return ,表明移除第一次查找到的元素,而不是全部相等的元素
}
}
return false;
}
3
java集合之ArrayList