ArrayList
ArrayList:我们可以将其看作是能够自动增长容量的数组。
利用ArrayList的toArray()返回一个数组。
Arrays.asList()返回一个列表。
迭代器(Iterator)给我们提供了一种通用的方式来访问集合中的元素。
ArrayList的用法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class ArrayListTest {
public static void main(String[] args) {
List al = new ArrayList();
al.add( " java " );
al.add( " world " );
System. out .println(al); // 打印ArrayList的一个对象
}
}
输出结果:
[java, world]
结果分析:
因为 ArrayList 是从Object继承下来的。它也重写并实现了toString()方法,打印对象的时候,会自动调用对象的toString方法 ,然后会调用这个列表中的元素的toString方法,然后将元素打印出来,自定义的类应该重写toString方法,否则将会打印[xxx@11445s, yyy@ddd],也就是说里面是地址。能成功打印java和world是因为String类继承自Object,重写了toString方法。
注意:
List中经常使用的方法:
1. add ()是向列表中添加元素。
2. size()是获得列表当中元素的数目。
3. get()是获得列表当中的元素。通过索引的方式。
4. 因为String类继承自Object,它重写了toString()方法,所以在调用对象的时候就自动地启用了toString()方法。那么如果是我们自己定义的类。如果要直接打印对象,希望得到这个对象所在类的详细信息,那么我们就应该去重写toString()方法。
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add( " java " );
al.add( " world " );
for ( int i = 0 ; i < al.size(); i ++ ) { // 打印输出列表中的元素
System.out.println(al.get(i));
}
// System.out.println(al); // 打印ArrayList的一个对象
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add( new Point( 1 , 2 ));
al.add( new Point( 5 , 2 ));
System.out.println(al); // 打印ArrayList的一个对象
}
}
class Point {
private int x,y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}
打印将会得到一连串地址信息。
需要重写toString(),并合适的实现。
int x,y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
public String toString() {
return " x= " + x + " y= " + y;
}
}
再次编译运行:
toArray()方法。返回一个数组,包含了这个列表当中的所有元素。toArray()返回的是一个对象类型的数组。可以通过列表当中的toArray获取一个数组对象,
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add( new Point( 1 , 2 ));
al.add( new Point( 5 , 2 ));
Object[] obj = al.toArray();
for ( int i = 0 ; i < obj.length; i ++ ) {
System.out.println(obj[i]);
}
}
}
class Point {
int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
public String toString() {
return " x= " + x + " y= " + y;
}
}
asList
Array.asList()将一个对象数组转换成一个列表返回,返回一个固定尺寸的列表,也就是不能再增加或减少元素。但是可以修改现有列表当中的值。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add( new Point( 1 , 2 ));
al.add( new Point( 5 , 2 ));
Object[] obj = al.toArray(); // 将列表转换成为对象数组
List list = Arrays.asList(obj); // 将对象数组转换成为列表
System.out.println(list);
}
}
如果向这个列表中添加对象就会出现异常。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class ArrayListTest {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add( new Point( 1 , 2 ));
al.add( new Point( 5 , 2 ));
Object[] obj = al.toArray();
List list = Arrays.asList(obj);
System.out.println(list);
list.add( new Point( 5 , 6 )); // 向列表当中增加元素。
}
}
使用set方法修改元素是没有问题的。也就是说返回的是一个固定长度的列表,只要你不修改它的长度,执行别的任何操作都是可以的。
Arrays类当中的asList(Object[] obj) 方法和集合类当中的toArray()方法,作为数组和集合类的一种桥。也就是如果从集合当中获取一个数组,可以利用toArray()方法,如果想要从数组中获取列表,可以利用asList(Object[] obj)方法。
ArrayList综合使用:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList < Point > list = new ArrayList < Point > ();
Point pt1 = new Point( 2 , 1 );
Point pt2 = new Point( 3 , 2 );
Point pt3 = new Point( 4 , 3 );
list.add(pt1);
list.add(pt2);
list.add(pt3);
// 遍历集合中的元素Object java.util.List.get(int index)
for ( int i = 0 ; i < list.size(); i ++ ) {
System.out.println(list.get(i));
}
System.out.println(list);
// Object[] toArray()返回包含此 collection 中所有元素的数组。
Object[] obj = list.toArray(); // 相当于Object[] obj = {pt1,pt2,pt3};
for ( int i = 0 ; i < obj.length; i ++ ) {
System.out.println(obj[i]);
}
// 返回集合元素的大小int java.util.List.size()
int size = list.size();
System.out.println(size); // 3
// boolean java.util.List.contains(Object o)判断是否包含元素o
// Returns true if this list contains the specified element
if (list.contains(pt2)) {
// boolean java.util.List.remove(Object o)从该列表中删除指定的元素的第一个匹配项
list.remove(pt2);
}
// Point java.util.ArrayList.set(int index, Point element)
// 用指定的元素element替代此列表中指定索引index位置上的元素。
// 也就是说被替代的元素要存在,如果不存在会抛出IndexOutOfBoundsException 异常。
list.set( 0 , new Point( 4 , 4 )); list.set( 0 , new Point( 4 , 4 ));
// 判断集合中是否为空
if ( ! list.isEmpty()) {
// 如果不为空,就打印该列表的元素
for ( int i = 0 ; i < list.size(); i ++ ) {
System.out.println(list.get(i));
}
}
// <Object> List<Object> java.util.Arrays.asList(Object...
// a)返回一个固定尺寸的列表,也就是不能再增加或减少元素。但是可以修改现有列表当中的值。
// 将一个数组转化成为一个列表的对象,它的返回对象是List,不能使用List的子类接收。
List < Object > l = Arrays.asList(obj);
l.add( new Point( 5 , 5 )); // 添加元素,抛出java.lang.UnsupportedOperationException异常
l.set( 1 , new Point( 5 , 5 )); // 修改现有列表当中的值。不会抛出什么异常。
l.remove( 0 ); // 移除元素,抛出java.lang.UnsupportedOperationException异常,说了不能改列表的尺寸就是不能改。
// public void trimToSize()将此 ArrayList 实例的容量调整为列表的当前大小。
// 应用程序可以使用此操作来最小化 ArrayList 实例的存储量。
list.trimToSize(); // List的对象是不能调用该方法的。
// 从列表中移除该列表所有包含的元素
// removeAll(Collection<?> c)属于Collection和 List
list.removeAll(list);
size = list.size();
System.out.println(size); // 0
// 移除此列表中的所有元素。ArrayList重写了Collection的clear();
list.clear();
}
}