首页 > 代码库 > 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;
}

 

java集合之ArrayList