Java 集合 ArrayList、LinkedList(一)

/**
* @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 stub
        ArrayList 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 stub
        LinkedList 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        



                有序        可重复
                增删效率高! 查找效率不好。
                线程安全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值