Java从零开始学二十一(集合List接口)
一、List接口
List是Collection的子接口,里面可以保存各个重复的内容,此接口的定义如下:
public interface List<E> extends Collection<E>
二、List接口的扩展方法
No.
|
方法
|
类型
|
描述
|
1
|
public void add(int index, E element)
|
普通
|
在指定位置增加元素
|
2
|
public boolean addAll(int index, Collection<? extends E> c)
|
普通
|
在指定位置增加一组元素
|
3
|
E get(int index)
|
普通
|
返回指定位置的元素
|
4
|
public int indexOf(Object o)
|
普通
|
查找指定元素的位置
|
5
|
public int lastIndexOf(Object o)
|
普通
|
从后向前查找指定元素的位置
|
6
|
public ListIterator<E> listIterator()
|
普通
|
为ListIterator接口实例化
|
7
|
public E remove(int index)
|
普通
|
按指定的位置删除元素
|
8
|
public List<E> subList(int fromIndex, int toIndex)
|
普通
|
取出集合中的子集合
|
9
|
public E set(int index, E element)
|
普通
|
替换指定位置的元素
|
三、List接口的常用子类 —— ArrayList和LinkedList
ArrayList实现了长度可变的数组,在内存中分配连接的空间,遍历和随机访问元素的效率比较高
LinkedList采用链表存储方式。在插入、删除元素时效率比较高
四、ArrayList例子
package com.pb.demo1; public class Person { private String name; private int age; public Person() { } public Person(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; } }
package com.pb.demo1; import java.util.ArrayList; import java.util.List; public class PersonArrayListTest { public static void main(String[] args) { /* * 创建多个Person对象并赋值 */ Person p1 = new Person("张三",21); Person p2 = new Person("李四",22); Person p3 = new Person("王五",23); //创建ArrayList List<Person> personlist=new ArrayList<Person>(); //为集合添加对象 personlist.add(p1); personlist.add(p2); personlist.add(p3); //输出集合的长度 System.out.println("集合长度:"+personlist.size()); //遍历集合for循环 for(int i=0; i<personlist.size();i++){ System.out.println("姓名:"+personlist.get(i).getName()+"年龄:"+personlist.get(i).getAge()); } //使用索引添加 Person p4 = new Person("赵六",24); /* * 使用索引添加时必须知道长度才可以正确增加,如果添加的索引大于最后一个下标+1, * 编译可以通过但运行时会报错 * 例如:如查长度为3,下标是从0开始到2,这时使用索引添加值索引可以是(0~3)都可以,但是不能是4 */ personlist.add(0, p4); //输出集合的长度 System.out.println("集合长度:"+personlist.size()); ////遍历集合forearch循环 for (Person p : personlist) { System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge()); } //查找集合中是否有p4对象true代表有,false代表没有 System.out.println("查找集合中是否有p4对象:"+personlist.contains(p4)); //p2元素所在的下标从前向后 System.out.println("p2元素所在的下标从前向后:"+ personlist.indexOf(p2)); //p2元素所在的下标从后向前 System.out.println("p2元素所在的下标从后向前:"+ personlist.lastIndexOf(p2)); } }
五、LinkedList例子
package com.pb.demo1; import java.util.LinkedList; import java.util.List; public class PersonLinkedListTest { public static void main(String[] args) { /* * 创建多个Person对象并赋值 */ Person p1 = new Person("张三",21); Person p2 = new Person("李四",22); Person p3 = new Person("王五",23); Person p4 = new Person("赵六",24); Person p5 = new Person("钱七",25); //创建LinkedList LinkedList<Person>plist=new LinkedList<Person>(); plist.add(p1); plist.add(p2); plist.add(p3); //集合长度 System.out.println("集合长度"+plist.size()); //遍历集合 for (Person p : plist) { System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge()); } //在第一个和最后一个添加对象 plist.addFirst(p4); plist.addLast(p5); System.out.println("===========添加数据================="); //集合长度 System.out.println("集合长度"+plist.size()); //遍历集合 for (Person p : plist) { System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge()); } //获取指定下标的元素:下标要已经存在如果不存在运行后将报错 System.out.println("获取指定下标的元素:"+plist.get(4).getName()); System.out.println("===========按下标移除================="); //移除元素remove,按下标移除 plist.remove(0); //集合长度 System.out.println("集合长度"+plist.size()); //遍历集合 for (Person p : plist) { System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge()); } System.out.println("===========直接移除对象================="); //移除元素remove 直接移除对象, plist.remove(p2); //集合长度 System.out.println("集合长度"+plist.size()); //遍历集合 for (Person p : plist) { System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge()); } System.out.println("===========移除第一个或者最后一个================="); //移除元素移除第一个或者最后一个 plist.removeFirst(); plist.removeLast(); //集合长度 System.out.println("集合长度"+plist.size()); //遍历集合 for (Person p : plist) { System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge()); } System.out.println("===========移除全部================="); //移除全部元素clear方法 plist.clear(); //集合长度 System.out.println("集合长度"+plist.size()); //遍历集合 for (Person p : plist) { System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge()); } } }
六、Vector类
在List接口中还有一个子类:Vector,Vector类属于一个挽救的子类,从整个JAVA的集合发展历史来看,Vector算是一个元老级的类,在JDK 1.0的时候就已经存在类此类。但是到了JAVA 2(JDK 1.2)之后重点强调了集合框架的概念,所以先后定义了很多的新接口(如:List等),但是考虑到一大部分的人已经习惯了使用Vector类,所以JAVA的设计者,就让Vector类多实现了一个List接口,这才将其保留下来。但是因为其是List子类,所以Vector类的使用与之前的并没有太大的区别。
package com.pb.demo1; import java.util.Vector; public class VectorTest { public static void main(String[] args) { Vector<String> plist=new Vector<String>(); plist.add("张三"); plist.add("李四"); plist.add("王五"); plist.add("赵六"); System.out.println("长度:"+plist.size()); for (String s : plist) { System.out.println(s); } } }