List 集合框架

List 集合框架

  • 集合框架中提供了一个内部类专门操作集合中的元素,这个内部类就是迭代器数据结构
    集合框架的由来:数据多了用对象进行存储,对象多了用集合来进行存储。
    而存储数据的方式(数据结构)各有不同,所以存储的容器也就有多种,从框架这一体系。

1. 集合框架(简介、Collection方法、迭代器)

  1. 给Collection 集合加入值 add()方法 和 迭代器 遍历数据
  2. isEmpy() 方法 如果此 collection 不包含元素,则返回 true。包含则返回 false
package com.hyf.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.apache.jasper.tagplugins.jstl.core.ForEach;


public class CollcecionDemo {

	public static void main(String[] args) {
		Collection c = new ArrayList<>();
		c.add(2);
		c.add(23);
		c.add(11);
		c.add(43);
		c.add(22);
		c.add(66);
		
        // 迭代器是集合所特有遍历方式
		Iterator it = c.iterator();
       while(it.hasNext()) {
        	System.out.println(it.next());
        }
       // 判断是否包含元素 
       boolean b=c.isEmpty();
   	   System.out.println(b);
	}
}

控制台输出为
在这里插入图片描述

2两个常见的面试提

  1. 在迭代器或则freach循环时容易出现什么常见的问题 it.next()
package com.hyf.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.apache.jasper.tagplugins.jstl.core.ForEach;

/**
 * 这个类是Collection接口中特别的方法 Iterator 迭代器
 * 
 * 集合的remove方法与迭代器remove方法有什么区别
 *   1.在迭代器或则freach循环时容易出现什么常见的问题   it.next()
 */
public class CollcecionDemo {

	public static void main(String[] args) {
		Collection c = new ArrayList<>();
		c.add(2);
		c.add(23);
		c.add(11);
		c.add(43);
		c.add(22);
		c.add(66);
		
		Iterator it = c.iterator();
       while(it.hasNext()) {
        	int num=(int)it.next();
        	if(num % 2==0) {
        		System.out.println(it.next());
        	}
        }
	}
}

控制台输出为
在这里插入图片描述

2.2 在迭代器中使用 collection .remove 方法

         会出现java.util.ConcurrentModificationException(当前改变常)
package com.hyf.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.apache.jasper.tagplugins.jstl.core.ForEach;

/**
 * 这个类是Collection接口中特别的方法 Iterator 迭代器
 *    在迭代器中执行collection.remove 方法
 *     java.util.ConcurrentModificationException(当前改变异常)
 *     本质上来说这是一个并发问题
 */
public class CollcecionDemo {

	public static void main(String[] args) {
		Collection c = new ArrayList<>();
		c.add(2);
		c.add(23);
		c.add(11);
		c.add(43);
		c.add(22);
		c.add(66);
		
        // 迭代器是集合所特有遍历方式
		Iterator it = c.iterator();
       while(it.hasNext()) {
        	int num=(int)it.next();
        	if(num % 2==0) {
        		c.remove(num);
        	}
        }
	}
}

在这里插入图片描述

2 . 集合框架List(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)

ArrayList特有方法

  • 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
    如果 listteratior(n) 括号里面有参数 ,代表 n 个下标开始遍历数据
package com.hyf.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 1. 讲解List 所有特有的方法 listIterator
 2.  */
public class ListDemo {

	public static void main(String[] args) {
		List l = new ArrayList();
		l.add(12);
		l.add(22);
		l.add(32);
		l.add(43);
		l.add(88);


		ListIterator lt = l.listIterator();
		while (lt.hasNext()) {              //没有着里下面会取不到元素
			System.out.println(lt.next());
		}

		while (lt.hasPrevious()) {
			System.out.println(lt.previous());  // it.precious() 上一个数据
		}

	}
}

控制台输出为
在这里插入图片描述

3.ArrayList 和 linkedList 区别

  • ArrayList 数组结构 增删慢,查询快,有连续下标
  • Linkedlist 链表结构 增删快,查询慢 没有连续下标

增长因子论证

  • Arraylist 增长因子为0.5 默认为10
package com.hyf.list;

import java.lang.reflect.Field;
import java.util.ArrayList;

/**
 1. 面试题 ArrayList 与 array 的区别
 2. 
 3.  1.list 的长度可变,数组长度固定
 4.  2.list 可以存放各类的元素对象,而数组一旦声明,只能存放对应的类型
 5. 
 6.  ArrayList 如何进行性能调优? 为啥List 集合底层是数据结构,但是数组的长度优势固定的,而list 长度有可变呢? 论证增长因子
 7. 
 8. @author 17628
 */
public class ListDemo2 {
	public static void main(String[] args) {
		ArrayList al=new ArrayList<>(10);
		for(int i=1; i<=80;i++) {
			al.add(i);
			System.out.print(i+",");
			getLen(al);
		}
}

	public  static void getLen(ArrayList al) {
    	try {
		Field f=al.getClass().getDeclaredField("elementData");
			f.setAccessible(true);
		    Object obj=f.get(al);
		    Object [] elementData=(Object[]) obj;
			System.out.println("当前al容器的底层数组长度:"+elementData.length);
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

在这里插入图片描述

4. 集合框架LinkedList

  1. 堆栈:先进后出 子弹夹 特有方法 addFirst();
  2. 队列:先进先出 水管 特有方法 addLast();
    在这里插入图片描述

面试题 :通过 linkedList 集合来制作一个堆栈结构的容器 制作一个队列结构的容器
代码演示

  1. 堆栈
package com.hyf.list;

import java.util.Iterator;
import java.util.LinkedList;

/**
 *  面试题
 *  通过 linkedList 集合来制作一个堆栈结构的容器 制作一个队列结构的容器
 */
public class LinkedListDemo {
   public static void main(String[] args) {
	
	   // 队列
	   DuiZhan dz=new DuiZhan();
	   dz.push("a");
	   dz.push("b");
	   dz.push("c");
	   dz.push("d");
	   dz.push("e");
	   dz.push("f");
	   
	   dz.bianLi();
}
}

/**
 1. 堆栈结构容器
 2. @author 17628
 */
class DuiZhan{
	private LinkedList ll=new LinkedList<>();
	public void push(Object obj) {
		ll.addFirst(obj);
	}
/*	public Object pop() {
		return ll.removeFirst();
	}*/
	public void bianLi() {
        Iterator it=ll.iterator();
        while(it.hasNext()) {
        	System.out.println(it.next());
        }
	}
}

在这里插入图片描述
2.队列

package com.hyf.list;

import java.util.Iterator;
import java.util.LinkedList;

/**
 *  面试题
 *  通过 linkedList 集合来制作一个堆栈结构的容器 制作一个队列结构的容器
 */
public class LinkedListDemo {
   public static void main(String[] args) {
	
	   // 队列
	   DuiLie dz=new DuiLie();
	   dz.push("a");
	   dz.push("b");
	   dz.push("c");
	   dz.push("d");
	   dz.push("e");
	   dz.push("f");
	   
	   dz.bianLi();
}
}


class DuiLie{
	private LinkedList ll=new LinkedList<>();
	public  void push(Object obj) {
		ll.addLast(obj);
	}
	public void  bianLi() {
		Iterator it=ll.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
	
}

在这里插入图片描述

集合框架ArrayList中的重复元素去重及其底层原理

判定两个人是一个人的依据 名字相同 age 相同
代码演示

package com.hyf.list;

import java.util.ArrayList;

/**
 * 对ArrayList 中的元素去重 1.元素是字符串 2.元素是自定义对象
 *
 *  需求:
 *  判定 两个人是一个人的依据
 *  名字相同  age 相同
 *  
 *  集合collection 的contains 在调用的时候底层调用容器元素对象equals方法
 *  之前元素对象是Strng
 *  元素对象object(Person)
 *  
 *  list 去重和set 去重
 */
public class ArrayListDemo {

	public static void main(String[] args) {
		ArrayList al = new ArrayList<>();
		
		al.add(new Person("aa", 11));
		al.add(new Person("aa", 11));
		al.add(new Person("bb", 11));
		al.add(new Person("dd", 12));
		al.add(new Person("ee", 112));

		ArrayList newAl = repeat(al);
		for (Object object : newAl) {      // 遍历去除重复的数据
			System.out.println(object);
		}
       
	}

	/**
	 * ArrayList al这个容器中是有重复元素的? 1.建立一个新的容器 2.将老的容器遍历取出其中的元素
	 * 3.如果说这个元素存在于新容器中,那么不再往新容器加入。如果不存在,就加
	 */
	public static ArrayList repeat(ArrayList al) {
		ArrayList newAl = new ArrayList<>();
		for (Object object : al) {
			if (!newAl.contains(object)) {
				newAl.add(object);
			}
		}
		return newAl;
	}
}

class Person {
	private String name;
	private int 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;
	}

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public Person() {

	}
	
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

	public boolean equals(Object obj) {
		Person p= (Person)obj;
		return p.name.equals(this.name) && p.age==this.age;
	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值