Java 集合框架 ArrayList 使用方法

ArrayList简介

  • ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。

  • ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

  • ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。稍后,我们会比较List的“快速随机访问”和“通过Iterator迭代器访问”的效率。

  • ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。

  • ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。

和Vector不同, ArrayList中的操作不是线程安全的! 所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。

初始化添加ArrayList

        ArrayList<String> al = new ArrayList<String>();
        al.add("a");
        al.add("b");
        al.add("c");

增加、删除、改值、取位置

        ArrayList<String> al = new ArrayList<String>();
        // 添加元素
        al.add("a");
        al.add("b");
        al.add("c");
        
        // 删除元素
        al.remove("b");   // 删除值为b的元素
        al.remove(1); // 删除第0位元素
        
        // 修改元素
        al.set(1,"d");  // 修改索引1的值为d
        
        // 查询元素
        System.out.println(al.get(2));  // 获取索引2位置的值

        System.out.println(al.contains("a")); // 判断元素是否存在,返回 true  false
        System.out.println(al.isEmpty());  //判断集合是否为空
        System.out.println(bl.subList(2,4));  // 取列表里 [2, 4) 索引中的内容

取交集、去除交集

        ArrayList<String> al = new ArrayList<String>();
        al.add("a");
        al.add("b");
        al.add("c");
        ArrayList<String> bl = new ArrayList<String>();
        bl.add("a");
        bl.add("b");
        bl.add("f");

        al.retainAll(bl);   // 取交集,al中只会保留与bl相同的元素
        System.out.println(al);         //  [a, b]
        System.out.println(bl);         // [a, b, f]
        
        // al = [a, b, c]   bl = [a, b, f]
        al.removeAll(bl);   // 去除交集,al中保留与bl不相同的元素
        System.out.println(al);     // [c]
        System.out.println(bl);     // [a, b, f]

通过迭代器输出列表元素

        // 方法一
        Iterator it = bl.iterator();    // 生成迭代器对象
        while(it.hasNext())     // 判断还有没有下个元素
            System.out.println(it.next());  // 取出下个元素
        
        // 方法二
        for (String s : bl) {   // 迭代器的for 输出元素
            System.out.println(s);
        }
Iterator 的缺陷:

Iterator 在迭代时,不可以通过集合对象的方法操作集合的元素
例如在迭代时增加元素会报错:

        for(String s: al){
            if(s.equals("b"))
                al.add("g");
        }

因为会发生并发修改异常。ConcurrentModificationException
在迭代器时,只能用迭代器操作元素,可是Iterator方法是有限的。
只有三种操作 ( hasNext、Next、remove )

如果想要其他操作,如添加、修改等,就可以用 ListIterator,ListIterator具备迭代器增删改查功能。

List集合特有的迭代器:LIstIterator (是Iterator的子接口)

ListIterator使用方法:

void add(E o)
将指定的元素插入列表(可选操作)。

boolean hasNext()
以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。

boolean hasPrevious()
如果以反向遍历列表,列表迭代器有多个元素,则返回 true。

E next()
返回列表中的下一个元素。

int nextIndex()
返回对 next 的后续调用所返回元素的索引。

E previous()
返回列表中的前一个元素。

int previousIndex()
返回对 previous 的后续调用所返回元素的索引。

void remove()
从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。

void set(E o)
用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

注意,remove() 和 set(Object) 方法不是 根据光标位置定义的;它们是根据对调用 next() 或 previous() 所返回的最后一个元素的操作定义的。

示例:

        ArrayList<String> al = new ArrayList<String>();
        // 添加元素
        al.add("a");
        al.add("b");
        al.add("c");
        
        ListIterator list = al.listIterator();
        while(list.hasNext()){
            Object obj = list.next();
            if(obj.equals("b")){
                list.add("d");
            }
        }
        System.out.println(al);     // [a, b, d, c]

ArrayList去除对象的重复内容

有一个Person对象,具有年龄和姓名属性。
年龄和姓名一致时才认为是同一个人。
条件: 要求去除重复的同一个人。

import java.util.*;

class Person{
    private String name;
    private int age;
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    public Object getName(){
        return this.name;
    }
    public Object getAge(){
        return this.age;
    }
    public boolean equals(Object obj){
        Person temp = (Person)obj;
        /*
        * 判断年龄和姓名相等才返回真
        * */
        return(this.age == temp.age && this.name.equals(temp.name));
    }
}

public class test{
    public static void main(String[] args)
    {
        ArrayList al = new ArrayList<Person>();
        // 添加元素
        al.add(new Person("li01",12));
        al.add(new Person("li01",12));
        al.add(new Person("li01",15));
        al.add(new Person("li02",18));
        al.add(new Person("li03",21));
        al.add(new Person("li03",12));
        al.add(new Person("li04",36));
        al = singleElement(al);
        for(Object s :al){
            System.out.println(((Person)s).getName() + ".." + ((Person)s).getAge());
        }
    }
    static ArrayList singleElement(ArrayList al){
        Iterator it = al.iterator();
        ArrayList newAl = new ArrayList();
        while (it.hasNext()){
            Object obj = it.next();
            /*
            * contains 内部其实用了indexOf, indexOf 内部再用了 object.equals
            * 所以覆盖object.equals方法可以实现去重
            * */
            if(!newAl.contains(obj))
                newAl.add(obj);
        }
        return newAl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值