Java-集合之List的使用

List

  • 特点:有序、有下标、元素可以重复
  • 继承可父接口提供的共性方法,同时定义了一些独有的与下标相关的操作方法
  • List实现类:ArrayList、LinkedList、Vector(用得少)
ArrayList
  • List中的元素是有序的,且允许重复

  • JDK8的ArrayList,实际初始长度是0

  • 首次添加元素时,需要实际分配数组空间,执行数组扩容操作;真正向数组中插入数据,用的时候再创建,或再加载,有效的降低无用内存的占用

  • 使用动态数组原理,查询快,增删慢

  • JDK 1.2发布,执行效率快,线程不安全

  • ArrayList相比数组的区别:容量的可扩展性,数据类型只要是Object类型就行,存储的必须是对象,不能存储基础数据类型

使用方法

package com.qianfeng.xqc.day0305;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 测试ArraysList 有序(添加到集合里面的顺序) ≠ 排序(对集合里面的元素进行排序)
 * 增list.add("xqc"); 
 * list.remove(1);// 根据指定的下标去移除
 * list.clear();// 清空集合里面的元素
 * list = null;// 将当前集合的引用置空	
 * list.set(0, "tony");//根据指定下标,修改该元素
 * iterator.hasNext() ; //判断迭代器是否还有下一个元素;
 * iterator.next();//返回指针指的当前的元素;并且把指针往下移动一个单位;
 */
public class DemoArraysList {

	public static void main(String[] args) {

		// List<Object> ls = new ArrayList<Object>();//用泛型指定ls只能存放Object类型
		List list = new ArrayList();// 创建了一个空数组,长度是0

		// 增 List没有指定数据类型可以存放所有对象
		list.add("xqc");
		list.add(new Per());
		list.add("rose");
		list.add(5);
		list.add("qf");

		// 删 只会删除第一个匹配到的元素
		list.remove(1);// 根据指定的下标去移除
		// list.removeAll(list);
//		list.clear();// 清空集合里面的元素
//		list = null;// 将当前集合的引用置空

		// 改
		list.set(0, "tony");//根据指定下标,修改该元素

		// 查:for,foreach,迭代器
		/*
		//for
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		 
		 //foreach
		for (Object o : list) {
			System.out.println(o);
		}
		 */

		// Iterator迭代器
		for (Iterator it = list.iterator(); it.hasNext();) {// 判断是否还有下一个元素
			System.out.println(it.next());// 返回指针指的当前的元素
		}
		
//		test(list);
//		test1(list);

	}
	
	public static void test(List list) {
		//增强循环
		for(Object obj : list) {
			
			//使用增强循环的时候,不能移除我们的元素;
			//移除后,结束循环,否则报错
			if("rose".equals(obj)) { //如果在集合里面找到了rose,就把rose给干掉
				list.remove(obj);
				break;//移除了以后,就要停止循环
			}
			
			System.out.println(obj);
		}
		
	}
	
	public static void test1(List list) {
		
//		for(int i = 0;i < list.size();i++) {//每次循环size都会随之改变,size每次都会减1
//			list.remove(i);
//		}
//		
//		for(int i = 1;i < list.size();i+=2) {//等同于上方循环,隔着打印
//			System.out.println(list.get(i));
//		}
//		
		for(int i = 0;i < list.size();) {//全部删除
			list.remove(i);
		}
		
		for (Iterator it = list.iterator(); it.hasNext();) {
			System.out.println(it.next());
		}
	}
	
	
}

class Per {

}

LinkedList
  • 与ArrayList用法一样

  • 使用双向链表原理,查询慢、增删快

使用方法

package com.qianfeng.xqc.day0305;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * 测试LinkedList 
 * LinkedList的使用,和ArrayList一模一样
 * 唯一的区别是底层实现不一样
 */
public class DemoLinkedList {
	public static void main(String[] args) {
		List list = new ArrayList();
		// 增
		list.add("xqc");
		list.add("rose");
		list.add(5);
		list.add("qf");
		// 删 
		list.remove(1);	
		// 改
		list.set(0, "tony");//根据指定下标,修改该元素
		// 查:for,foreach,迭代器		
		// Iterator迭代器
		for (Iterator it = list.iterator(); it.hasNext();) {// 判断是否还有下一个元素
			System.out.println(it.next());// 返回指针指的当前的元素
		}
		
	}	
		
}

Vector(不常用)
  • 数组结构存储,查询快,增删慢

  • JDK 1.0发布,执行效率慢,线程安全

ArrayList与LinkedList性能比较
  • 如果是顺序插入,ArrayList比较快

  • LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Entry的引用地址

  • ArrayList做插入、删除的时候,快在寻址,慢在数组元素的批量copy

  • 如果插入删除的元素,是在前半段的时候,LinkedList速度大大快于ArrayList.

    因为ArrayList会copy大量的元素,越往后,对于LinkedList来说速度是一样的,但是对于ArrayList来说,需要copy的元素越来越少

  • ArrayList底层数组扩容是一个既消耗时间又消耗空间的操作

  • 使用各自遍历效率最高的方式,ArrayList的遍历效率会比LinkedList的遍历效率高一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值