当前位置: 代码迷 >> 综合 >> Java 集合 ArrayList、LinkedList(一)
  详细解决方案

Java 集合 ArrayList、LinkedList(一)

热度:35   发布时间:2023-10-27 01:15:43.0
/** * @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        有序        可重复增删效率高! 查找效率不好。线程安全
  相关解决方案