List简介
任何集合框架都包含三大块内容:
对外的接口、接口的实现和对集合运算的算法。
接口:即表示集合的抽象数据类型,接口提供了让我们对集合中所表示的内容进行单独操作的可能。
实现: 也就是集合框架中接口的具体实现。实际它们就是那些可复用的数据结构。
算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算方法,如查找、排序等。
它和数组不同,数组既可以存储基本数据类型,也可以存储引用数据类型。而集合只能存储引用数据类型,比如你存入一个int型数据18放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型,如果存储基本数据类型,会被自动装箱。
它就像一个容器,专门用来存储java对象(实际上是对象名,即指向地址的指针),这些对象可以是任意数据类型,并且长度可变。其中,这些集合类都位于java.util包中,在使用时一定要注意导包的问题,否则会出现异常。
以下是类的关系图(该图用到了UML--统一建模语言):
一.List集合的特点
介绍:学习集合框架就是为了解的容器的数据结构
List集合方法:
实例化: List list = new ArrayList();
增
list.add("a");
list.add("b");
list.add("c");
System.out.println("目前集合中的元素:"+list);
//打印结果为: 目前集合中的元素:[a, b, c]
删
list.remove("a"); //根据元素删除
list.remove(0);//根据下标删除
改
list.set(1,"d");
//第一个参数是要修改的元素下标 1
//第二个参数是修改后的元素为什么 d
查
list.get(0);
//里面参数是想要获取的元素下标
二.List的三总遍历方式(fori,foreach,lterator)
fori循环
List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); for (int i = 0; i < list.size(); i++ ) { System.out.println(list.get(i));//根据下标查找 } //先实例化再增加元素最后循环输出
foreach循环
List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); for (Object o : list) { System.out.println(o); } //先实例化再增加元素最后循环输出
lterator循环(迭代器)
List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); Iterator it = list.iterator();//继承util包 while (it.hasNext()) { System.out.println(it.next()); }
三.List的子类LinkedList
堆栈 / 队列
package com.zking.list; import java.util.LinkedList; public class Demo01 { public static void main(String[] args) { LinkedList ll = new LinkedList(); ll.add("卡卡西"); ll.add("独孤贱"); ll.add("爱德花"); //两个类方法不能同时测试,需要分开测试 // Duilie dl = new Duilie(ll);//实例化队列类调取输出方法 // System.out.println(dl.pop()); // System.out.println(dl.pop()); // System.out.println(dl.pop()); //输出结果为: 卡卡西 独孤贱 爱德花 DuiZhan dz = new DuiZhan(ll);//实例化堆栈类调取输出方法 System.out.println(dz.pop()); System.out.println(dz.pop()); System.out.println(dz.pop()); //输出结果为:爱德花 独孤贱 卡卡西 } } //类说明:队列类 //用于输出list集合的元素 //特点:先增加,先输出 class Duilie{ LinkedList ll = null; public Duilie(LinkedList ll){ this.ll = ll; } public void add(String a){ ll.add(a); } public String pop(){ return (String) ll.remove(); } } //类说明:堆栈类 //用于输出list集合的元素 //特点:先增加,后输出 class DuiZhan{ LinkedList ll = null; public DuiZhan(LinkedList ll){ this.ll = ll; } public void add(String a){ ll.add(a); } public String pop(){ return (String) ll.removeLast(); } }
四.List的增长因子论证
List集合长度是可变的,数组长度是不可变的;
package com.zking.list; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class Demo01 { public static void main(String[] args) throws Exception { List list = new ArrayList();//实例化 //循环增加 for (int i = 0; i < 100; i++) { System.out.print(i+"--"); //每增加一次就查看当前list长度的变化 list.add(i); //调用查看容量的方法 listDataLength(list); } } //定义一个查看容量的方法 public static void listDataLength(List list) throws Exception { //调用list集合定义好的类方法 Field ed = list.getClass().getDeclaredField("elementData"); ed.setAccessible(true); //调用查看的方法看list集合的数组容量 Object[] o = (Object[]) ed.get(list); //每调用一次就查看一次容量长度 System.out.println("List集合容量为:"+o.length); } }
根据以上代码输出的结果判断:
1.List集合的初始容量为 10 。
2.如果增加的元素超过list集合的容量,list集合的增长因子 0.5 。
3.List集合如何进行优化呢,当代码中出现了多次add操作,涉及到了list集合容量多次改变,这是十分耗性能的操作,此时通过
设定初始化容量,即可优化性能。
五.List的子类ArrayList中的重复元素去重及其底层原理
1.ArrayList中字符串和数字去除重复增加
package com.zking.list; import java.util.ArrayList; import java.util.List; public class Demo01 { public static void main(String[] args) { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); System.out.println("目前集合容器中的元素:"+list); if (!list.contains("b")){ list.add("b"); } System.out.println("目前集合容器中的元素:"+list); List list2 = new ArrayList(); list2.add(1); list2.add(2); list2.add(3); System.out.println("目前集合容器中的元素:"+list2); if (!list2.contains(2)){ list2.add(2); } System.out.println("目前集合容器中的元素:"+list2); } }
输出结果如图所示:
2.ArrayList中元素对象去除重复增加
package com.zking.list; import java.util.ArrayList; import java.util.List; public class Demo01 { public static void main(String[] args) { List list = new ArrayList(); //增加元素对象 list.add(new Person(1, "卡卡西")); list.add(new Person(2, "独孤贱")); list.add(new Person(3, "爱德花")); list.add(new Person(3, "爱德花")); //新定义一个集合 List Newlist = new ArrayList(); //循环list集合 for (Object obj : list) { //判断如果新集合里有该元素对象就不增加,没有就增加 if(!Newlist.contains(obj)) { Newlist.add(obj); } } System.out.println("没有去重的集合:"); for (Object object : list) { System.out.println(object); } System.out.println("-----------------------------"); System.out.println("去重后的集合:"); for (Object obj : Newlist) { System.out.println(obj); } } } class Person{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person(int id, String name) { super(); this.id = id; this.name = name; } public Person() { super(); } @Override public String toString() { return "Person [id=" + id + ", name=" + name + "]"; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
输出结果如图所示:
3.以上代码及图片可得出原理
- ArrayList集合中去重原理是存储元素对象的equals方法返回值来决定的。