java之List

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)来定制你的自定义类.



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值