List接口是Collection之中最为常用的子接口,也是大家在开发过程之中主要使用的接口。但是List子接口针对于Collection子接口做了大量的功能扩充,而主要扩充的方法有如下几个:
No. | 方法名称 | 类型 | 描述 |
1 | public E get(int index) | 普通 | 取得指定索引位置上的对象 |
2 | public E set(int index, E element) | 普通 | 修改指定索引位置上的对象 |
3 | public ListIterator listIterator() | 普通 | 为ListIterator接口实例化 |
那么接口完成后如果要想使用接口那么一定需要子类,而常用的两个子类:ArrayList、Vector。
4.1、新的子类:ArrayList(90%)ArrayList是在JDK 1.2之后引入的,或者更加明确的讲像Collection、List等都是JDK 1.2之后引入的,也是在List接口使用过程之中最为常见的一个子类。
范例:使用ArrayList
package cn.mldn.demo; import java.util.ArrayList; import java.util.List; public class TestDemo { public static void main(String[] args) throws Exception { List all = new ArrayList() ; all.add("HELLO") ; all.add("HELLO") ; // 保存了重复数据 all.add("WORLD") ; System.out.println(all); } } |
但是在很多时候可以采用循环的方式输出,因为在List子接口里面扩充了一个get()方法,所以就可以使用for循环。
范例:循环输出List集合
package cn.mldn.demo; import java.util.ArrayList; import java.util.List; public class TestDemo { public static void main(String[] args) throws Exception { List all = new ArrayList() ; all.add("HELLO") ; all.add("HELLO") ; // 保存了重复数据 all.add("WORLD") ; for (int x = 0; x < all.size(); x++) { System.out.println(all.get(x)); } } } |
范例:验证其它方法
package cn.mldn.demo; import java.util.ArrayList; import java.util.List; public class TestDemo { public static void main(String[] args) throws Exception { List all = new ArrayList() ; System.out.println(all.isEmpty()); all.add("HELLO") ; all.add("HELLO") ; // 保存了重复数据 all.add("WORLD") ; System.out.println(all.isEmpty()); all.set(0, "hello") ; // 此方法也是List扩充 all.remove("WORLD") ; System.out.println(all); } } |
但是以上的程序之中发现操作的数据类型都是String,那么String类是一个比较完善的类,那么下面使用一个自定义的类进行操作。
范例:保存自定义类对象
package cn.mldn.demo; import java.util.ArrayList; import java.util.List; class Person { private String name ; private int age ; public Person(String name,int age) { this.name = name ; this.age = age ; } @Override public String toString() { return "姓名:" + this.name + ",年龄 :" + this.age + "\n" ; } @Override public boolean equals(Object obj) { if (obj == null) { return false ; } if (this == obj) { return true ; } if (!(obj instanceof Person)) { return false ; } Person per = (Person) obj ; if (per.name.equals(this.name) && per.age == this.age) { return true ; } return false ; } } public class TestDemo { public static void main(String[] args) throws Exception { List all = new ArrayList() ; all.add(new Person("张三",20)) ; all.add(new Person("李四",21)) ; all.add(new Person("王五",19)) ; all.remove(new Person("王五",19)) ; // 删除 System.out.println(all.contains(new Person("李四",21))); System.out.println(all); } } |
] 那么在之前使用的链表操作,在List接口上可以方便的使用,使用的规则与之前完全一样,可是List所采用的程序的逻辑更加合理,性能更好,所以不会使用自定义链表,都会使用List接口操作。
4.2、旧的子类:Vector(10%)Vector是从JDK 1.0的时候引入的操作类,最早是用于纯粹的保存多个对象,同时在JDK 1.2之后为了让其可以继续使用,于是让Vector类多实现了一个List接口,所以List接口下有两个常用的子类:ArrayList、Vector。
既然Vector也是List接口的子类,所以在使用上,不管使用ArrayList还是Vector不会有任何的区别。
范例:验证Vector
package cn.mldn.demo; import java.util.List; import java.util.Vector; public class TestDemo { public static void main(String[] args) throws Exception { List all = new Vector() ; all.add("HELLO") ; all.add("HELLO") ; // 保存了重复数据 all.add("WORLD") ; System.out.println(all); } } |
面试题:请解释ArrayList和Vector区别?
No. | 区别 | ArrayList | Vector |
1 | 推出时间 | JDK 1.2时推出 | JDK 1.0时推出 |
2 | 性能 | 采用异步处理方式,性能较高 | 采用同步处理方式,性能较低 |
3 | 安全性 | 数据安全性差 | 数据安全性高 |
4 | 输出 | Iterator、ListIterator、foreach | Iterator、ListIterator、foreach、Enumeration |
考虑到日后的开发异步开发居多,所以以ArrayList类为主。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |