Java 之 Java 集合--list

list

List 接口
List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引
(元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。
List 接口实例存储的是有序的,可以重复的元素。
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。
查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 
<实现类有ArrayList,LinkedList,Vector> 。
ArrayList 和 LinkedList 的区别
ArrayList:数组实现
数组实现特点:查询快,增删慢(参照 LinkedList)
查询:直接使用角标查询
增删:需要把要添加的元素的位置,后面的元素全部移动一位

LinkedList:链表实现
链表实现特点:查询慢,增删快
查询:判断离头近还是尾近,然后从头或尾,一个个查找,找到为止
增删:将要插入/移除的元素的地址保存/删除,后面的元素不用进行任何操作

数组查询和链表查询的区别

数组查询和链表查询的区别

思考:
什么时候使用 ArrayList?
查询多的时候
什么时候使用 LinkedList?
增删多的时候
工作中一般使用什么呢?
ArrayList
list 接口中常用方法
private static void demo() {
	List list = new ArrayList();
	list.add("a");
	list.add("b");
	list.add("c");
	list.add("d");
	
	// 使用 list 中的添加方法 add(int index, Object object)
	// 添加的角标就是后面元素所在的位置,不能越界
	list.add(4, "x");
	System.out.println(list);
	
	// 通过角标获取对应的元素
	Object object = list.get(2);
	System.out.println(object);
	
	// 通过 get 方法进行遍历
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}
	
	// set 方法(不要越界)
	list.set(0, "z");
	System.out.println(list);
	
	// 根据角标删除(Object remove = list.remove(3);中 remove 返回的是被删除的元素, list 剩下没被删除的元素)
	list.remove(3);
	System.out.println(list);
	
	// 注意:删除方法需要注意的
	List list1 = new ArrayList();
	list1.add(111);// 进行自动装箱
	list1.add(222);
	list1.add(333);
	// 删除111元素
	list1.remove(0);// 第一种方法
	// 这里删除的时候,系统不会进行自动装箱,按照角标传入的方法
	// 所以调用的是按角标删除的方法,所以越界
	// list.remove(111);// 错误方法
	// 如果非要使用按元素删除,需要手动装箱
	list1.remove(Integer.valueOf(111));// 第二种方法
	System.out.println(list1);
}
发生并发修改异常
private static void demo() {
	List list = new ArrayList();
	list.add("a");
	list.add("b");
	list.add("c");
	list.add("d");
	// 添加完四个元素,这时集合长度为4
	// 使用迭代器遍历时,长度必须是固定的,不可改变
	// 获取集合迭代器
	Iterator iterator = list.iterator();
	while (iterator.hasNext()) {
		if (iterator.next().equals("b")) {
			// 发生异常 ConcurrentModificationException(并发修改异常)
			// 注意:在迭代器遍历的时候,不要直接使用集合做操作
			list.add("oh-yes");// 相当于修改集合长度
			// 如何解决
			// 直接把要添加的元素让迭代器添加
		}
	}
	System.out.println(list);
}

解决并发修改异常
思路:让迭代器去完成添加元素
private static void demo() {
	List list = new ArrayList();
	list.add("a");
	list.add("b");
	list.add("c");
	list.add("d");
	// 取出 list 特有的迭代器
	ListIterator listIterator = list.listIterator();
	while(listIterator.hasNext()) {
		if (listIterator.next().equals("b")) {
			// 让迭代器向集合中添加元素
			listIterator.add("Oh~Yes");
		}
	}
	System.out.println(list);
	// 注意:在迭代器中,进行对集合的添加或删除,要使用迭代器中的方法,不能直接使用集合去操作
}
public static void demo() {
	List list = new ArrayList();
	list.add("a");
	list.add("b");
	list.add("c");
	list.add("d");
	ListIterator listIterator = list.listIterator();
	// 正向
	while (listIterator.hasNext()) {
		System.out.println(listIterator.next());
	}
	listIterator = list.listIterator(list.size());
	// 逆向
	// hasPrevious 判断前一个元素有没有
	while (listIterator.hasPrevious()) {
		// 获取前一个元素
		System.out.println(listIterator.previous());
	}
}
Vector(使用数组来实现的,已经被 ArrayList 替代)
private static void fun5() {
	// 创建一个 vector 集合,迭代器遍历
	Vector vector = new Vector();
	// 添加元素
	vector.addElement("a");
	vector.addElement("b");
	vector.addElement("c");
	vector.addElement("d");
	System.out.println(vector);
	// 迭代器遍历
	Enumeration elements = vector.elements();
	while (elements.hasMoreElements()) {
		// 输出元素
		System.out.println(elements.nextElement());
	}
}
LinkedList
private static void fun6() {
	LinkedList linkedList = new LinkedList();
	// 使用 addFirst 方法添加
	// linkedList.addFirst("a");
	// linkedList.addFirst("b");
	// linkedList.addFirst("c");
	// linkedList.addFirst("d");
	// 使用 addLast 方法添加
	linkedList.addLast("a");
	linkedList.addLast("b");
	linkedList.addLast("c");
	linkedList.addLast("d");
	System.out.println(linkedList);
	// 获取头尾元素
	System.out.println(linkedList.getFirst());
	System.out.println(linkedList.getLast());
}

队列和栈

队列和栈
队列的特点:先进先出
栈的特点:先进后出
使用 LinkedList 模拟栈结构
private static void fun1() {
	LinkedList linkedList = new LinkedList();
	// 添加元素A,B,C,D模拟进栈
	linkedList.addLast("A");
	linkedList.addLast("B");
	linkedList.addLast("C");
	linkedList.addLast("D");
	System.out.println(linkedList);
	// 模拟出栈
	// 每次删之前查看一下这个集合是否为空的
	while (!linkedList.isEmpty()) {
		linkedList.removeLast();
		System.out.println(linkedList);
	}
}
ArrayList 去重
public static void fun2() {
	ArrayList arrayList = new ArrayList();
	arrayList.add("a");
	arrayList.add("a");
	arrayList.add("a");
	arrayList.add("b");
	arrayList.add("b");
	arrayList.add("b");
	arrayList.add("c");
	arrayList.add("c");
	arrayList.add("c");
	System.out.println(arrayList);
	// 创建个新数组
	ArrayList arrayList1 = new ArrayList();
	// 遍历原数组,取出每一个元素,比对是否存在于新数组中,不存在则放入,存在就放弃
	// 原数组迭代器
	Iterator iterator = arrayList.iterator();
	while (iterator.hasNext()) {
		// 判断原数组中元素是否存在于新数组中
		// 不存在就添加入新数组中,否则放弃
		Object next = iterator.next();// 不能调用两次 next() 方法
		if (!arrayList1.contains(next)) {
			// 将元素添加到新数组中
			arrayList1.add(next);
		}
	}
	System.out.println(arrayList1);
}
去除重复的学生
public static void fun3() {
	ArrayList arrayList = new ArrayList();
	// 六个学生的地址都不一样,所以不是同一个对象
	arrayList.add(new Student("鹏鹏", 18));
	arrayList.add(new Student("鹏鹏", 18));
	arrayList.add(new Student("水水", 17));
	arrayList.add(new Student("水水", 17));
	arrayList.add(new Student("茜茜", 16));
	arrayList.add(new Student("茜茜", 16));
	Iterator iterator = arrayList.iterator();
	ArrayList arrayList2 = new ArrayList();
	while (iterator.hasNext()) {
		Object next = iterator.next();
		Student student = (Student)next;
		if (!arrayList2.contains(student)) {
			arrayList2.add(student);
		}
	}
	for (Object object : arrayList2) {
		Student student = (Student)object;
		System.out.println(student);
	}
}
public class Student {
	private String name;// 姓名
	private int age;// 年龄
	public Student() {
		super();
	}
	public Student(String name, int age) {
		super();
		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;
	}
	@Override
	public String toString() {
		return "[姓名:" + name + ", 年龄:" + age + "]";
	}
	
	// 重写 equals 方法
	@Override
	public boolean equals(Object obj) {
		// 比较的是地址
		// return super.equals(obj);
		// 现在需求比对姓名和年龄
		Student student = (Student)obj;
		return this.name.equals(student.getName()) && this.age == student.getAge();
	}
}

http://blog.csdn.net/huzongnan/article/list

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值