/** * @author StormWangxhu * @version 创建时间:2017年11月3日 上午10:03:44 * */
今天来总结一下集合,这篇主要总结一下List借口及其相关的实现类。
首先看一下集合的框架。
再一张
最后一张性能总结性图:
从上图中可以看到,List接口主要有两个实现类,ArrayList和LinkedList,主要讲一下第一个。
1、ArrayList
(1) 关于ArrayList的实现原理,以后通过看源代码来总结。
(2)、
ArrayList的一些方法,实现增删改查:
结合代码看:
package com.stormwang.List;import java.util.ArrayList;
import java.util.Iterator;import javax.rmi.ssl.SslRMIClientSocketFactory;
import javax.swing.plaf.synth.SynthSpinnerUI;/** * @author StormWangxhu * @version 创建时间:2017年11月3日 上午10:03:44 * */
/*** List 是一个借口* ArrayList是其一个实现类!* 特点: 查询元素快,增删效率低下!* 那么,这种缺陷,由LinkedList集合来克服:后面再练习!* LinkedList特点:* 删除效率高!* ArrayList 练习* 实现集合元素的增删改查!* */
public class ListDemo {public static void main(String[] args) {// TODO Auto-generated method stubArrayList arrayList = new ArrayList<>();//实现集合的增删改查arrayList.add("hello!");arrayList.add("I am java!");arrayList.add("今天是11月3号!,我在图书馆学习!");arrayList.add("我也会很牛逼的对吗!");arrayList.add(3, "我是指定位置插入的元素");System.out.println(arrayList.size());System.out.println("以下是直接输出集合元素:");System.out.println(arrayList);//遍历集合System.out.println("使用迭代器遍历集合:");Iterator iterator = arrayList.iterator();while (iterator.hasNext()) {Object object = (Object) iterator.next();System.out.println(object);}//删System.out.println("删操作:");if (arrayList.get(2).equals("今天是11月3号!,我在图书馆学习!")) {arrayList.remove(2);System.out.println("第三个元素删除成功");}else {System.out.println("删除失败!");}//使用foreach 循环输出集合元素System.out.println("使用foreach循环输出集合元素:");for (Object object : arrayList) {System.out.println(object);}//改System.out.println("改操作:");System.out.println("现在集合大小为:"+arrayList.size());arrayList.set(1, "我是新的第二个元素,原来已被我替换!!");//ArrayList 有序,可重复arrayList.set(0, arrayList.get(1));System.out.println("...");/*** * 问题:这一部分为什么会执行不了? 抛出异常!Iterator iterator2 = arrayList.iterator();while (iterator.hasNext()) {Object object = (Object) iterator.next();System.out.println(object);}*/System.out.println("现在集合元素为:");for (Object object : arrayList) {System.out.println(object);}//查操作//如果没有元素返回真if (!arrayList.isEmpty()) {System.out.println(arrayList.isEmpty());}if (arrayList.contains(2)) {System.out.println("什么鬼!");}else {System.out.println("包含操作查询失败!");}Object object ;System.out.println("查操作:");object =arrayList.get(0);System.out.println("第一个元素为:"+object);//使用toString()方法,将集合元素转换为字符串。System.out.println(arrayList.toString());System.out.println(arrayList);}}
ArrayList 特点:
1、实现:
集合底层是使用了一个数组来保存元素的,在增加、删除指定位置元素时,会导致创建新的数组,效率比较低,因此不适用于做大量的增删操作。但这种数据结构,允许程序通过索引的方式来访问元素。因此使用ArrayList集合查找元素很便捷。
2、提供的查找方法:
LinkedList
1、特点:
LinkedList
* 该集合内部维护了一个双向循环链表,链表中的每一个元素
* 都使用引用的方式记住它的前一个元素和后一个元素,从而
* 可以将所有的元素彼此连接起来。
当插入一个新元素时,只需要修改元素之间的这种引用关系即可。
当删除一个节点也是如次。正因为LinkedList的存储结构,Linkedlist集合对元素的增删操作具有很高的效率。
下面通过一组图片看LinkedList的结构:
上图为新增一个元素时:只需要让黄色部分的节点记住它后面是新元素,让黄颜色后面的记住它前面的是新元素。
通过代码演示一下该类的特长————增、删操作
package com.stormwang.List;import java.util.Iterator;
import java.util.LinkedList;/** * @author StormWangxhu * @version 创建时间:2017年11月3日 下午6:55:57 * */
/*** LinkedList * 该集合内部维护了一个双向循环链表,链表中的每一个元素* 都使用引用的方式记住它的前一个元素和后一个元素,从而* 可以将所有的元素彼此连接起来。* */
public class LinkedListTest {
public static void main(String[] args) {// TODO Auto-generated method stubLinkedList linkedList = new LinkedList<>();//增操作System.out.println("增加元素:");linkedList.add("stu1");linkedList.add("stu2");linkedList.add("stu3");linkedList.add("stu4");System.out.println(linkedList.toString());//向指定位置插入元素linkedList.add(2, "指定位置");Iterator iterator = linkedList.iterator();while (iterator.hasNext()) {Object object = (Object) iterator.next();System.out.println(object);}//在最前面插入元素linkedList.addFirst("First");//删除最后一个元素linkedList.removeLast();//返回此列表的第一个元素。System.out.println(linkedList.getFirst());System.out.println(linkedList);//删除指定元素linkedList.remove(3);System.out.println(linkedList);//删除最后一个元素linkedList.removeLast();System.out.println(linkedList);//删除第一个元素linkedList.removeFirst();System.out.println(linkedList);}}
LinkedList在增删方面有7个特有的方法。
看看:
增
删
具体可以查看API
下面看看ArrayList和LinkedList的区别:
总结:
ArrayList: 有序 可重复 查找效率高,大批量增加、删除操作慢。线程不安全LinkedList 有序 可重复增删效率高! 查找效率不好。线程安全