1. UMI(主要以下两个图片介绍它们之间的关系)
集合类图
线下教育平台用例图
2. list集合的特点
具备容器基本特点增删改查,元素有序且可重复。
(元素有序指该集合有下标,从0开始,我们按照什么顺序增删改查倒lsit集合的就是什么样子的顺序)。
//增删改查 public static void main(String[] args) { List list=new ArrayList<>(); list.add("jun"); list.add("lin"); list.add("yi"); System.out.println("目前容器中的元素:"+list); list.remove(0); System.out.println("删除后容器中的元素:"+list); list.set(1,"nb"); System.out.println("修改后容器中的元素"+list); System.out.println("获取第一个容器元素:"+list.get(0)); }
3. list遍历
3.1 foreach增强for循环
public static void main(String[] args) { List list=new ArrayList<>(); list.add("jun"); list.add("lin"); list.add("yi"); for (Object object : list) { System.out.println(object); }
3.2 迭代器
public static void main(String[] args) { List list=new ArrayList<>(); list.add("jun"); list.add("lin"); list.add("yi"); Iterator it=list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } }
3.3 for i 下标遍历
public static void main(String[] args) { List list=new ArrayList<>(); list.add("jun"); list.add("lin"); list.add("yi"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } }
三个结果同样是:
4. LinkedList特点
4.1 Linkedlist: 链表
如图所示:表明 特点:查询修改快,增加删除慢
4.2 Arraylist: 数组
ArrayList 是一个可以数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
数据结构: Object数组。
特点: 有序、不唯一。查询修改慢,增加删除快。
5 . 堆栈与队列的认识
5.1 堆栈
如图所示:三人一个接一个掉入大坑,大坑很深但很狭窄只能站一个人,所以只能后调入的先上去,从后之前。(小编不太会画图请了解,故事虚构请勿相信)
表明特点:先进后出
5.2 队列
如图所示:三人一起进入地道,三人只能走前面入口,一个接着一个出去(故事虚构请勿相信}
表明特点:先进先出
5.3 用LinkedList完成一个堆栈容器和队列容器
public class demo3 { public static void main(String[] args) { LinkedList lk = new LinkedList<>(); lk.add("jun"); lk.add("lin"); lk.add("yi"); // 实例化堆栈对象 DuiZhan dz = new DuiZhan(lk); // 定义一个方法 System.out.println(dz.pop()); System.out.println(dz.pop()); System.out.println(dz.pop()); // 实例化队列对象 DuiLie dl = new DuiLie(lk); // 定义一个方法 System.out.println(dl.duilie()); System.out.println(dl.duilie()); System.out.println(dl.duilie()); } } class DuiZhan { private LinkedList lk; public DuiZhan(LinkedList lk) { this.lk = lk; } // 当这个方法被调用时,后存进的内容要先输出,先存入的内容后输出 public Object pop() { return lk.removeLast(); } } class DuiLie { private LinkedList lk; public DuiLie(LinkedList lk) { this.lk = lk; } // 当这个方法被调用时,先存进的内容要先输出,后存入的内容后输出 public Object duilie() { return lk.remove(); } } //输出结果:yi( 堆栈)jun(队列) lin lin jun yi
6.增长因子
以数组方式进行存储,数组长度是不可变的,但集合List长度可变。
public static void main(String[] args) throws Exception { ArrayList list = new ArrayList(50); //修改ArrayList(50) 默认长度就为50 list.add("1"); elementDataLength(list); } // 该方法是获取底层数组的长度 private static void elementDataLength(ArrayList list) throws Exception { Field f = list.getClass().getDeclaredField("elementData"); f.setAccessible(true); Object[] o = (Object[]) f.get(list); System.out.println("当前集合底层数组容量长度为:" + o.length); }
7.list去重原理
public static void main(String[] args) throws Exception { ArrayList list = new ArrayList(); for (int i = 0; i < 50; i++) { list.add(i); System.out.print("集合长度为:"+i+"\r"); elementDataLength(list); } } // 该方法是获取底层数组的长度 private static void elementDataLength(ArrayList list) throws Exception { Field f = list.getClass().getDeclaredField("elementData"); f.setAccessible(true); Object[] o = (Object[]) f.get(list); System.out.println("集合底层数组容量长度为:" + o.length); }
运行结果:
由此结论:
当添加内容超过默认数组长度会自动扩容,*增长因子为 ‘原容量的0.5倍 + 1+0.5=1.5倍’(每扩容一次叠加1,如扩容第二次就加2)*,因此我们可对其进行调优,根据需求修改默认底层数组长度减少扩容次数,从而提高效率。