集合之List集合

1. Collection接口

1.1 集合框架的顶级接口
1.2 是Set和List的父接口
1.3 但不是Map的父接口

在这里插入图片描述

集合中只能添加引用类型数据

2. List接口

2.1 特点:

有序、元素可以重复

//1.list集合的特征:有序
		List ls=new ArrayList();
		ls.add("哈哈");
		ls.add("嘿嘿");
		ls.add("呵呵");
		ls.add("啊啊");
		
		for (Object object : ls) {
			System.out.println(object);
		}
		System.out.println("————————————————————");
		
		
		//2.list集合的特征:元素可以重复
		ls.add("哈哈");

2.2 遍历方式

2.2.1 下标
2.2.2 foreach(>=jdk1.5)
2.2.3 迭代器Iterator(hasNext()、 next())

      //1.下标遍历
		for (int i = 0; i < ls.size(); i++) {
			System.out.println(ls.get(i));
		}
		
		System.out.println("——————————————————");
		
		//2.foreach循环
		for (Object object : ls) {
			System.out.println(object);
		}
		System.out.println("——————————————————");
		
		
		//3.迭代器遍历
//		Iterator iterator = ls.iterator();
//		while (iterator.hasNext()) {//是否还有下一个,(相当于在下标为-1的位置上问是否还有下标为0的,-1是做假设的一个下标),然后循环问下去,直至问完
//			Object next = iterator.next();//获取到下一个
//			System.out.println(next);
//		}
		
		//ListIterator是list独有的(且可以向上遍历,但要结合hasNext()同时使用才可以向上遍历),set没有
		ListIterator listIterator = ls.listIterator();
		
		//Set set=null;//set没有SetIterator
		
		//(1)、向下遍历
		while (listIterator.hasNext()) {//是否还有下一个
			Object next = (Object) listIterator.next();//是否还有下一个
			System.out.println(next);
		}
		System.out.println("——————————————————");
		
		//(2)、向上遍历,但要结合hasNext()同时使用才可以向上遍历(相当于在下标为-1的位置上问是否还有下标为-2的,-1是做假设的一个下标,那肯定是没有的)
		//但如果向下遍历后再向上遍历就可以,这样就可以覆盖向下遍历的数据获取到最后一个下标,然后倒着遍历
		//向上遍历在项目中应用性不强
		while (listIterator.hasPrevious()) {//是否还有上一个
			Object previous = listIterator.previous();//是否还有上一个
			System.out.println(previous);
		}  

2.3 List优化:

即指定初始容量,以减少多次扩容
初始容量10,负载因子0.5(初始容量+初始容量*0.5)

public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		
		//1.list集合的优化:list集合的底层就是个以object[]
		//list集合优化:即设置list的初始容量,以减少多次扩容
		List ls=new ArrayList(50);
		print(ls);	
		
		//list集合初始容量10
		//ls.add(1);
		//print(ls);
		
		//list集合负载因子0.5
		//list集合扩容后的大小:初始容量+初始容量*0.5
		for (int i = 1; i <= 11; i++) {
			ls.add(i);
			print(ls);
			
		}
	}
	/**
	 * 静态方法  属于类
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public static void print(List arrayList) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		
		//反射 
		//1.获取类对象
		Class clazz = arrayList.getClass();
		
		//2.获取属性对象
		Field field = clazz.getDeclaredField("elementData");
		
		//3.打开属性访问限制
		field.setAccessible(true);
		
		Object[] arrs =(Object[])field.get(arrayList);
		System.out.println("数组的长度为:"+arrs.length);
		
		
	}
		
	/**
	 * 实例方法  属于对象
	 */
	public void add() {
		
	}

2.4 List元素删除

1)、for循环
2)、迭代器删除

//list集合的删除:迭代器删除比for循环删除更便利
		List<String> ls=new ArrayList<String>();
		ls.add("哈哈");
		ls.add("嘿嘿");
		ls.add("呵呵");
		ls.add("啊啊");
		
		System.out.println(ls.size());
		//1.for循环删除
		//for循环这种删除不能完全删除掉所有元素,因为每次删除一个,集合的下标都会重新组合(即删除下标0的元素后,重新组合还会下标0,但下一轮删除是从下标1开始,所以0滞留了)
		/*for (int i = 0; i < ls.size(); i++) {
			ls.remove(i);
		}*/
		
		
		//一定要删除的话,就倒着删除
		/*for (int i = ls.size()-1; i >=0; i--) {
			ls.remove(i);
		}
		System.out.println("——————————————");
		System.out.println(ls.size());*/
	
		
		
		//2.迭代器删除
		Iterator iterator = ls.iterator();
		while (iterator.hasNext()) {
			iterator.next();
			iterator.remove();
		}
		System.out.println(ls.size());
    

3. 泛型

JDK1.5之后,以类型作为参数的类就叫泛型
作用:提高程序健壮性,简化代码
泛型的默认值是Object

4. 装箱、拆箱(案例:快递)

值类型->引用类型 装箱
引用类型->值类型 拆箱
jdk1.5之后引入了自动装箱及自动拆箱功能

public class Demo4 {
	public static void main(String[] args) {
		
		//手动装箱及手动拆箱
		//jdk1.5之前的要进行转换
		int a=10;
		Integer b=new Integer(a);//装箱
		int  c=b.intValue();//拆箱
		
		//jdk1.5之后引入了自动装箱及自动拆箱功能
		//自动装箱及自动拆箱
		int i=1;
		Integer j=2;
		
		//1.装箱:值类型->引用类型
		//i=j;
		//System.out.println(i);
		
		//2.拆箱:引用类型->值类型 
		j=i;
		System.out.println(j);
		
		
	}
		
}

5. ArrayList、LinkedList、Vector区别

ArrayList:以连续的数组结构存储数据,查询快(下标)、增删改慢,异步 线程不安全
LinkedList:以链表的结构存储数据,查询慢、增删改快 Vector:增删改查都慢,已过时,同步.线程安全

同步:排队进行,线程安全
异步:同时进行,线程不安全

6.案列:使用LinkedList完成一个堆栈MyStack

public class MyStack {
    	//弹夹
    	/**
    	 * 装弹(压栈)
    	 * @param obj 装弹对象
    	 */
    	public void push(Object obj){
    		ls.addFirst(obj); //每次都把子弹增加到第一颗,把原来的压到下面去
    	}
    
    	/**
    	 * 打枪(出栈)
    	 * @return 刚打出的子弹
    	 */
    	public Object pop(){
    		//方式二:
    //		Object obj = ls.getFirst();//取出第一颗子弹
    //		ls.removeFirst(); //移除第一颗子弹
    //		return obj;//返回刚刚打出的子弹
    		//方式一:
    		return ls.remove();
    	}
    
    	/**
    	 * 计算弹夹中子弹数量
    	 * @return 集合中子弹的数量
    	 */
    	public int size(){
    		return ls.size();
    	}
    
    	public static void main(String[] args) {
    
    		MyStack ms=new MyStack();
	
    		ms.push("a");//装第一颗子弹
    		ms.push("b");
    		ms.push("c");
    		ms.push("d");//装最后一颗子弹
    	
    		while(ms.size()!=0){//如果子弹数量不等于0,就一直循环打枪
	
    			System.out.println(ms.pop());
	
    		}
    	}
}
```**



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

内心留白的阿舒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值