区分Java中的ArrayList和LinkedList

作者:你的龙儿 时间:2021-05-26 11:09:55 

一:ArrayList和LinkedList的大致区别如下:

1.ArrayList是实现了基于动态数组的数据结构,ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高

2.LinkedList基于链表的数据结构, 插入、删除元素时效率比较高  故:【插入、删除操作频繁时,可使用LinkedList来提高效率】LinkedList提供对头部和尾部元素进行添加和删除操作的方法,插入/删除第一个和最后一个效率比较高;

3:ArrayList和LinkedList都是List接口的实现,都存储一组不唯一,有序(插入顺序)的对象, 对元素进行添加、删除等操作[ 即:List的性质]

4.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

5.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

6:LinkedList比ArrayList更占内存

eg:(代码示例01)----ArrayList与LinkedLis的数据添加和查找耗时对比


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class HFSD {
static final int N=50000;  //添加5000条数据
 static long timeList(List list){  //添加数据所需时间
    long start=System.currentTimeMillis();
   Object o = new Object();
    for(int i=0;i<N;i++) {
      list.add(0, o);
     }
    return System.currentTimeMillis()-start;
   }
 static long readList(List list){   //查找数据所需时间
    long start=System.currentTimeMillis();
    for(int i=0,j=list.size();i<j;i++){

}
    return System.currentTimeMillis()-start;
   }

static List addList(List list){
    Object o = new Object();
    for(int i=0;i<N;i++) {
     list.add(0, o);
     }
    return list;
   }
 public static void main(String[] args) {
   System.out.println("ArrayList添加"+N+"条耗时:"+timeList(new ArrayList()));
    System.out.println("LinkedList添加"+N+"条耗时:"+timeList(new LinkedList()));

List list1=addList(new ArrayList<>());
   List list2=addList(new LinkedList<>());
   System.out.println("ArrayList查找"+N+"条耗时:"+readList(list1));
   System.out.println("LinkedList查找"+N+"条耗时:"+readList(list2));
  }

区分Java中的ArrayList和LinkedList

从以上结果,我i们可以看出 ArrayList更适合读取数据,linkedList更多的时候添加或删除数据。

ArrayList:内部是使用可増长数组实现的,所以是用get和set方法是花费少数时间的,但是如果插入元素和删除元素,除非插入和删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。

LinkedList:是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近。但是插入和删除元素花费少数时间。

二:ArrayList和LinkedList的共有方法(即List的方法):

区分Java中的ArrayList和LinkedList

eg:(代码示例02)----ArrayList代码示例


package JIhekuangjia006.ArrayList;

/**
* 小猪类
*/
public class Pig {
private String name;
private String sex;

public Pig(String name,String sex){
 this.name=name;
 this.sex=sex;
}
public void setName(String name){
 this.name=name;
}
public String getName(){
 return name;
}
public void setSex(String sex){
 this.sex=sex;
}
public String getSex(){
 return sex;
}
}

package JIhekuangjia006.ArrayList;

import java.util.*;

/**
* 使用ArrayList集合进行操作数据
*/
public class Test1 {
public static void main(String[] args) {
 //1.存储小猪信息
 Pig xiaojia=new Pig("小佳","母");//索引为0
 Pig xiaolong=new Pig("小龙","公");//索引为1
 Pig jiajia=new Pig("佳佳","女");//索引为2
 Pig longlong=new Pig("龙龙","男");//索引为3(与数组相同,从0开始)

//为小猪排序
 List list=new ArrayList();
 //直接将元素添加排序
 list.add(xiaojia);
 list.add(jiajia);
 list.add(xiaolong);

//将龙龙添加到索引为2的位置
 list.add(2,longlong);

//list.add(jiajia);//List 接口存储一组不唯一,有序(插入顺序)的对象

//2.获得小猪的总数
 //通过list.size()方法获取元素的个数
 list.size();
 System.out.println("小猪的总数为"+list.size());

//3.逐条打印小猪信息
 //方法一:for循环与get()方法配合实现遍历
 for(int i=0;i<list.size();i++){
  Pig center=(Pig)list.get(i);//因为list.get()的返回值为Object的类型,所以需要强转为Pig的类型
  System.out.println(center.getName()+","+center.getSex());
 }

//方法二:通过迭代器Iterator实现遍历
//  Iterator it=list.iterator();
//  while (it.hasNext()){
//   Pig center=(Pig)it.next();
//   System.out.println(center.getName()+","+center.getSex());
//  }

System.out.println("*********************************************************");
 //4.删除小猪信息
 //删除第一只小猪,小佳
 list.remove(0);//与数组下标相对应
 //删除指定小猪,小龙
 list.remove(xiaolong);
 //将剩下的小猪信息进行输出
 System.out.println("删除之后还有"+list.size()+"只小猪,\n分别是:");
 for(int i=0;i<list.size();i++){
  /**
   * Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型,
   * 使用前需要进行强制类型转换
   */
  Pig center=(Pig)list.get(i);//所以需要强转为Pig的类型

System.out.println(center.getName()+","+center.getSex());
 }

System.out.println("*******************************************************");
 //5.判断集合中是否包含指定小猪
 if (list.contains(xiaojia)){//使用list.contains()方法进行判断
  System.out.println("集合中有小佳");
 }else{
  System.out.println("集合中没有小佳");
 }
}
}

测试运行结果如下:

区分Java中的ArrayList和LinkedList

三:LinkedList的特有方法:

区分Java中的ArrayList和LinkedList

eg:(代码示例03)----LinkedList代码示例:


package JIhekuangjia006.LinkedList;

/**
* 小猪类
*/
public class Pig {
private String name; //昵称
private String sex;  //性别

public Pig(String name,String sex){
 this.name=name;
 this.sex=sex;
}
public void setName(String name){
 this.name=name;
}
public String getName(){
 return name;
}
public void setSex(String sex){
 this.sex=sex;
}
public String getSex(){
 return sex;
}
}



package JIhekuangjia006.LinkedList;

import java.util.Iterator;
import java.util.LinkedList;

/**
* 使用LinkedList集合操作数据
*/
public class Test2 {
public static void main(String[] args) {
 //1.存储小猪信息
 Pig xiaojia=new Pig("小佳","母");//索引为0
 Pig xiaolong=new Pig("小龙","公");//索引为1
 Pig jiajia=new Pig("佳佳","女");//索引为2
 Pig longlong=new Pig("龙龙","男");//索引为3(与数组相同,从0开始)

//为小猪排序
 LinkedList list=new LinkedList();
 //直接将元素添加排序
 list.add(xiaolong);
 list.add(longlong);
 list.addFirst(jiajia);//将佳佳添加到第一个位置
 list.addLast(xiaojia);//将小龙添加到最后一个位置

//list.add(jiajia);//List 接口存储一组不唯一,有序(插入顺序)的对象

//2.获得小猪的总数
 //通过list.size()方法获取元素的个数
 list.size();
 System.out.println("小猪的总数为"+list.size());

//3.逐条打印小猪的信息

//方法一:通过迭代器Iterator实现遍历
 Iterator it=list.iterator();
 while (it.hasNext()){
  Pig center=(Pig)it.next();
  System.out.println(center.getName()+","+center.getSex());
 }

//方法二:for循环与get()方法配合实现遍历
//  for(int i=0;i<list.size();i++){
//   Pig pig=(Pig)list.get(i);
//   System.out.println(pig.getName()+","+pig.getSex());
//  }

System.out.println("************************************************");

//4.
 //获取第一只小猪的信息
 Pig center=(Pig)list.getFirst();
 System.out.println("第一条狗狗信息是:"+center.getName()+","+center.getSex());
 //获取最后一只小猪的信息
 Pig center1=(Pig)list.getLast();
 System.out.println("最后一条狗狗信息是:"+center1.getName()+","+center1.getSex());

System.out.println("*****************************************************");

//5.删除第一只小猪和最后一只小猪
 list.removeFirst();
 list.removeLast();

System.out.println("*****************************************************");

//6.输出剩下小猪的信息
 System.out.println("剩下还有"+list.size()+"只小猪,\n分别是:");
 for(int i=0;i<list.size();i++){
  Pig pig=(Pig)list.get(i);
  System.out.println(pig.getName()+","+pig.getSex());
 }
 //7.判断集合中是否存在小佳
 if(list.contains(xiaojia)){
  System.out.println("集合中存在小佳");
 }else{
  System.out.println("集合中不存在小佳");
 }
}
}

测试运行结果如下:

区分Java中的ArrayList和LinkedList

来源:https://www.cnblogs.com/liangbaolong/p/12884574.html

标签:JAVA,ArrayList,LinkedList
0
投稿

猜你喜欢

  • 简单介绍java中equals以及==的用法

    2023-01-28 07:47:41
  • C#线程中弹窗的制作方法

    2023-08-14 03:25:32
  • Java DecimalFormat 保留小数位及四舍五入的陷阱介绍

    2023-11-09 04:49:33
  • 如何利用Jenkins + TFS为.Net Core实现持续集成/部署详解

    2022-11-12 06:14:32
  • java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list错误解决办法

    2021-05-25 03:11:19
  • C++日期类计算器的模拟实现举例详解

    2023-05-22 08:27:16
  • C#实现文件断点续传下载的方法

    2021-09-05 10:37:42
  • java面试题——详解HashMap和Hashtable 的区别

    2023-08-06 16:38:25
  • SpringBoot分页查询功能的实现方法

    2023-07-14 02:22:21
  • Mybatis中的高级映射一对一、一对多、多对多

    2022-05-11 05:22:39
  • IDEA远程管理docker镜像及容器服务的实现

    2022-01-07 16:26:48
  • Java Class 加密工具 ClassFinal详解

    2023-02-10 14:58:48
  • c#创建浮动工具栏功能示例

    2022-08-31 01:08:31
  • SpringBoot配置Email发送功能实例

    2022-03-07 20:52:20
  • java实现Xml与json之间的相互转换操作示例

    2023-06-21 13:30:39
  • 大白话讲解C# 中的委托

    2023-02-03 02:06:41
  • Java 实现常见的非对称加密算法

    2023-11-27 18:51:03
  • Java实现高校教务系统

    2022-05-16 04:24:17
  • c#基于WinForm的Socket实现简单的聊天室 IM

    2021-11-27 04:47:57
  • C#多线程爬虫抓取免费代理IP的示例代码

    2023-02-08 01:22:01
  • asp之家 软件编程 m.aspxhome.com