List集合讲解(ArrayList LinkedList Vector)

在了解list集合之前,我们先来了解一下collection集合

一.简述collection集合


面试点:collection是集合的顶级接口,是set集合和list集合的爸爸,但不是map集合的爸爸!


二.list集合

1.特点:

  1.1.有序
  1.2.元素不唯一,即可重复


2.遍历方式

  2.1.for(下标)
  2.2.foreach
  2.3.迭代器iterator

		/**
		 * 一.遍历集合的三种方式
		 * 1.for 下标
		 * 2.foreach
		 * 3.迭代器 iterator
		 */
		
		//定义一个集合
		List<Object> mz=new ArrayList<>();
		
		//添加数据
		mz.add("aa");
		mz.add("bb");
		mz.add("cc");
		mz.add("dd");
		
		//1.for下标遍历
		for (int i = 0; i < mz.size(); i++) {
			System.out.println(mz.get(i));
		}
		
		//2.foreach
		for (Object o : mz) {
			System.out.println(o);
		}
		
		//3.iterator 核心即 hasnext方法 和 next方法
		Iterator<Object> it = mz.iterator();
		while(it.hasNext()) {//判断是否有元素
			System.out.println(it.next());//取出下一个元素
		}

3.list集合特有的方法

/**
		 * 指定位置添加元素
		 * add(下标,元素);
		 */
		
		//向集合下标为2的位置添加元素 ss
		mz.add(2, "ss");
		
		for (Object o : mz) {
			System.out.print(o+",");//输出打印结果 aa,bb,ss,cc,dd,
		}
		
		/**
		 * 指定位置添加集合
		 * addAll(下标,集合)
		 */
		
		List<Object> ajj=new ArrayList<>();
		
		ajj.add("11");
		ajj.add("22");
		ajj.add("33");
		ajj.add("44");
		
		mz.addAll(2,ajj);//在mz集合中指定2的位置添加集合ajj
		
		for (Object o : mz) {
			System.out.print(o+",");//输出打印结果 aa,bb,11,22,33,44,cc,dd,
		}
		
		/**
		 * 获取集合指定下标的元素
		 * get(下标);
		 */
		
		//获取mz集合下标为3的元素
		System.out.println(mz.get(3));//打印结果为 dd
		
		/**
		 * 获取指定元素的下标
		 * indexOf("元素");
		 */
		
		System.out.println(mz.indexOf("dd"));///打印结果为 下标3
		
		
		/**
		 * 获取集合中指定元素最后一次出现的的下标 没有则返回-1
		 * lastIndexOf("元素");
		 */
		
		System.out.println(mz.lastIndexOf("dd"));//打印结果为:3
		System.out.println(mz.lastIndexOf("vv"));//打印结果为:-1
		
		/**
		 * 从指定位置开始遍历集合元素
		 * listInterator(下标);
		 */
		
		Iterator<Object> its = mz.listIterator(2);//从下标2开始遍历 包括下标2
		
		while(its.hasNext()) {
			System.out.println(it.next());//打印结果为 cc dd
		}
		
		/**
		 * 指定元素下标,并替换元素
		 * set(下标,"准备替换的元素"):
		 */
		
		mz.set(1, "ll");//替换元素
		
		for (Object o : mz) {
			System.out.print(o+",");//打印结果为: 将原来的bb 换成了 ll  aa,ll,cc,dd,
		}
4.集合元素的删除方法

  4.1.for下标删除
  4.2.迭代器删除


/**
		 * 二.集合元素的删除
		 * 1.传统的下标遍历循环删除 但是无法删除干净,需要逆向删除即可
		 * 2.使用迭代器删除
		 */
		
		System.out.println("删除前:"+mz.size());
		
		//1.下标删除
		for (int i = 0; i < mz.size(); i++) {
			mz.remove(i);//删除每一个元素
		}
		//最后结果为: 删除前:4  删除后:2 主要原因是集合元素带有下标,从前面开始删会影响下标
		
		//逆向删除试试?
		for (int i = mz.size()-1; i >= 0; i--) {//获取集合元素长度-1即为元素的最大下标,只要i>=0即可循环
			mz.remove(i);
		}
		//最后结果为: 删除前:4  删除后:0 主要是因为从后往前删不影响下标 
		
		//2.迭代器删除
		Iterator<Object> it = mz.iterator();
		while(it.hasNext()) {// 判断是否有元素存在
			it.next();//必须要先取出元素,否则无法删除 注意:如果直接删除不挨个取出元素,会抛出IllegalStateException异常
			it.remove();//成功删除元素  
		}
		//最后结果为: 删除前:4  删除后:0 主要是因为迭代器会挨个取出元素然后挨个删除元素
		
		System.out.println("删除后:"+mz.size());



三.list优化


1.负载因子(扩容比例):0.5 每次扩容比例为0.5
2.增长因子:1.5 每次扩容都是乘以1.5
3.公式:容器容量+10*0.5
注意:list集合的初始容量为 10
原理实现:

public static void main(String[] args) {
//定义一个初始容量为30的Arraylist集合
		ArrayList lst=new ArrayList<>();
		
		for (int i = 1; i <=30; i++) {
			lst.add(i);//循环添加30次
			System.out.print(i+",");//打印出当前添加的元素
			
			try {
				getCapacity(lst);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
public static void getCapacity(ArrayList lst) throws Exception {
		
		Field f=lst.getClass().getDeclaredField("elementData");
		f.setAccessible(true);
		Object obj=f.get(lst);
		Object[] elementData=(Object[])obj;
		System.out.println("当前容器的容量为:"+elementData.length);
		
	}


效果:
在这里插入图片描述



四.泛型

1.概念:以类型作为参数的类,称为泛型(继JDK1.5之后有)
2.作用:提高程序的健壮性,简化代码
3.泛型的默认类型为Object

List<Object> mz=new ArrayList<>();//尖括号内为集合类型参数 默认为Object

五.装箱和拆箱

1.值类型==>引用类型 是为装箱
2.引用类型==>值类型 是为拆箱
注意:继JDK1.5后,可以实现自动装箱拆箱



六.ArrayList LinkedList Vector 的区别

1.ArrayList:以连续的数组结构存储数据,增删改稍慢,查询稍快,因为有下标,但也不是绝对的,当数据量过大时则速度没什么区别.

图解:
在这里插入图片描述

2.LinkedList :以链表的结构存储数据,查询慢、增删改快
3. Vector:增删改查都慢,已过时
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值