java中List的用法
List<E>([]内的内容可省略),与数组类似:
实例化:List[<数据类型>] list = new ArrayList[<数据类型>]();获得集合内元素个数:list.size();
添加元素:
默认添加:list.add(e);
指定下标添加(添加后下标后的元素向后挪一位):list.add(index,e);
删除元素:
返回是否删除:list.remove(e);
直接删除指定下标的元素(只删除找到的第一个相符合的元素):list.remove(index);
替换元素(替换掉指定下标的元素):list.set(index,e);
取出元素:list.get(index);
清空集合:list.clear();
判断集合中是否存在某个元素(存在返回true,不存在返回false):list.contains(e);
对比两个集合中的所有元素:
两个对象一定相等:list.equals(list2);
两个对象不一定相等:list.hashCode() == list2.hashCode();
(两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。)
获得元素下标:
元素存在则返回找到的第一个元素的下标,不存在则返回-1:list.indexOf(e);
元素存在则返回找到的最后一个元素的下标,不存在则返回-1:list.lastIndexOf(e);
判断集合是否为空(空则返回true,非空则返回false):list.isEmpty();
返回Iterator集合对象:list.iterator();
将集合转换为字符串:list.toString();
截取集合(从fromIndex开始在toIndex前结束,[fromIndex,toIndex)):list.subList(fromIndex,toIndex);
将集合转换为数组:
默认类型:list.toArray();
指定类型(objects为指定类型的数组对象,并将转换好的数组赋值给objects数组):list.toArray(objects);
以上为List常用的方法。
1、List中可以添加任何对象,包括自己定义的新的类。
-
class Person{ ..... } 上面定义了一个Person类,下面看好如何使用List Person p1=new Person(); Person p2=new Person(); List list=new ArrayList(); list.add(p1); list.add(p2);//这里是将对象加入到list中 for(int i=0;i Person p=(Person)list.get(i);//注意,这里一定要强制类型转换,因为List中取出的对象都是Object类型的,希望对你有所帮助 }
2、List是一个接口,不能实例化,需要实例化一个ArrayList或者LinkedList
List myList = new ArrayList();
3、使用myList.add(任何对象);就可以进行添加了。
4、取值的时候myList.get(索引);取出来的值都是Object,使用时需要类型转换。
5、可用Iterator迭代器对List中的元素进行迭代操作。
List 集合中的对象按照一定的顺序排放,里面的内容可以重复。 List接口实现的类:ArrayList(实现动态数组), Vector(实现动态数组) ,LinkedList(实现链表), Stack(实现堆栈) 一 list接口 1.java.util.ArrayList类实现一个可增长的动态数组,平时用的比较多的就是add()方法,其它方法 请参考API帮助文档。使用该方法向集合内添加对象,并且这些对象是按照一定的顺序排列 的,它内部原理是数组实现的,因此处理数据量较大时,不建议使用。 public class TestArrayList { public static void main(String[] args) { //声明List 并实例化为ArrayList List al = new ArrayList(); //使用add()方法添加元素 al.add("a"); al.add("b"); al.add("c"); al.add("d"); //使用Iterator迭代器遍历出集合的元素并打印 for(Iterator i = al.iterator();i.hasNext(); ){ String str = (String) i.next(); System.out.println(str); } } } 3.java.util.Vector(向量)类 与ArrayList类似的也是实现一个动态的数组,该向量可以随意的增长以存放更多的对象 public class TestArrayList { public static void main(String[] args) { //声明List 并实例化为Vector List al = new Vector(); //使用add()方法添加对象 al.add("a"); al.add("b"); al.add("c"); al.add("d"); //使用Iterator迭代器遍历出集合的对象并打印 for(Iterator i = al.iterator();i.hasNext(); ){ String str = (String) i.next(); System.out.println(str); } } } 3.java.util.LinkedList类实现了链表,可初始化化为空或者已存在的集合,通常使用以下方法 add();向链表末尾添加对象。 addFirst()在链表开头添加对象。 addLast()在链表末尾添加对象。 getFirst()得到链表开头的对象。 getLast()得到链表末尾的对象。 注意该类提供了随机访问列表中的元素的方法,但是底层依然必须遍历去查找随机访问的对象,因此性能依然有限. public static void main(String[] args) { //声明LinkedList并实例化 LinkedList al = new LinkedList(); //使用add()方法添加元素 al.add("a"); al.add("b"); al.add("c"); al.add("d"); //使用Iterator迭代器遍历出集合的元素并打印 for(Iterator i = al.iterator();i.hasNext(); ){ String str = (String) i.next(); System.out.println(str); } System.out.println("_____"); //向链表头和尾分别添加x和z al.addFirst("z"); al.addLast("x"); //遍历查看添加后的结果 for(Iterator i = al.iterator();i.hasNext(); ){ String str = (String) i.next(); System.out.println(str); } } 4.java.util.Stack类实现了堆栈数据结构,即按照先进后出的原则存放数据。创建时只能为空。 使用push()方法进行添加对象 public static void main(String[] args) { //声明Stack并实例化 Stack al = new Stack(); //使用push()方法添加元素 al.push("a"); al.push("b"); al.push("c"); al.push("d"); al.push("f"); //使用Iterator迭代器遍历出集合的元素并打印 for(Iterator i = al.iterator();i.hasNext(); ){ String str = (String) i.next(); System.out.println(str); } }
-----------示例如下:
//Student.java
package cn.edu.hpu.playnt;
public class Student {
private int id;
private String name;
private int age;
public Student(){
}
public Student(int id,String name,int age){
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String toString() {
System.out.println("学号\t姓名\t年龄");
return id + "\t" + name + "\t" + age;
}
public boolean equals(Object obj) {
Student stu = (Student)obj;
return id == stu.getId();
}
}
//StudentManager.java
package cn.edu.hpu.playnt;
import java.util.*;
public class StudentManager {
//添加学生信息
public static void addStudent(List<Student> list){
System.out.println("======添加学生信息======");
Scanner input = new Scanner(System.in);
//创建学生对象,用于存储学生的信息
Student stu = new Student();
System.out.print("请输入学号:");
int id = input.nextInt();
stu.setId(id);
System.out.print("请输入姓名:");
String name = input.next();
stu.setName(name);
System.out.print("请输入年龄:");
int age = input.nextInt();
stu.setAge(age);
boolean flag = list.add(stu);
if(flag){
System.out.println("添加成功!");
}
else{
System.out.println("添加失败!");
}
}
//删除学生信息
public static void delStudent(List<Student> list){
System.out.println("=====删除学生信息=====");
Scanner input = new Scanner(System.in);
System.out.print("请输入要删除学生的学号:");
int id = input.nextInt();
Student stu = new Student();
stu.setId(id);
boolean flag = list.remove(stu);
if(flag){
System.out.println("删除成功!");
}
}
//显示学生信息
public static void displayStudent(List<Student> list){
System.out.println("=====显示学生信息=====");
//Student stu = new Student();
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
public static void main(String[] args) {
//定义ArrayList用于存储学生信息
List<Student> list = new ArrayList<Student>();
Scanner input = new Scanner(System.in);
int choice = 0;
while(choice != 4){
System.out.println("======系统菜单======");
System.out.println("1.添加学生信息");
System.out.println("2.删除学生信息");
System.out.println("3.显示学生信息");
System.out.println("4.退出");
System.out.print("请选择:");
choice = input.nextInt();
switch(choice){
case 1:
//添加学生信息
addStudent(list);
break;
case 2:
//删除学生信息
delStudent(list);
break;
case 3:
//显示学生信息
displayStudent(list);
break;
case 4:
//退出
System.out.println("谢谢使用本系统!");
}
}
}
}
说明: list与arraylist 区别
List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。
所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。
List list; //正确 list=null;
List list=new List(); // 是错误的用法
List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
这是一个例子:
import java.util.*;
public class TestList{
public static void main(String[] args){
List list = new ArrayList();
ArrayList arrayList = new ArrayList();
list.trimToSize(); //错误,没有该方法。
arrayList.trimToSize(); //ArrayList里有该方法。
}
}
编译一下就知道结果了。
如果这个样子:
List a=new ArrayList();
则a拥有List与ArrayList的所有属性和方法,不会减少
如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),
则a.i是调用了List中的i
a.f()是调用了ArrayList中的f();
---------------------------------------------------------------
问题的关键:
为什么要用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就行了:
List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。
假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。
地区用 List arr = new ArrayList();定义;行业用 ArrayListarr = new ArrayList();定义;则说明,行业里用到了ArrayList的特殊的方法.
另外的例子就是,在类的方法中,如下声明:
private void doMyAction(List list){}
这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.
如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.