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
1
2
3
4
5ArrayList<String> al = new ArrayList<String>(); al.add("a"); al.add("b"); al.add("c");
增加、删除、改值、取位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20ArrayList<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) 索引中的内容
取交集、去除交集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18ArrayList<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]
通过迭代器输出列表元素
1
2
3
4
5
6
7
8
9
10// 方法一 Iterator it = bl.iterator(); // 生成迭代器对象 while(it.hasNext()) // 判断还有没有下个元素 System.out.println(it.next()); // 取出下个元素 // 方法二 for (String s : bl) { // 迭代器的for 输出元素 System.out.println(s); }
Iterator 的缺陷:
Iterator 在迭代时,不可以通过集合对象的方法操作集合的元素
例如在迭代时增加元素会报错:
1
2
3
4
5for(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() 所返回的最后一个元素的操作定义的。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15ArrayList<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对象,具有年龄和姓名属性。
年龄和姓名一致时才认为是同一个人。
条件: 要求去除重复的同一个人。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57import 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; } }
最后
以上就是强健板凳最近收集整理的关于Java 集合框架 ArrayList 使用方法的全部内容,更多相关Java内容请搜索靠谱客的其他文章。
发表评论 取消回复