区分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));
}
从以上结果,我i们可以看出 ArrayList更适合读取数据,linkedList更多的时候添加或删除数据。
ArrayList:内部是使用可増长数组实现的,所以是用get和set方法是花费少数时间的,但是如果插入元素和删除元素,除非插入和删除的位置都在表末尾,否则代码开销会很大,因为里面需要数组的移动。
LinkedList:是使用双链表实现的,所以get会非常消耗资源,除非位置离头部很近。但是插入和删除元素花费少数时间。
二:ArrayList和LinkedList的共有方法(即List的方法):
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("集合中没有小佳");
}
}
}
测试运行结果如下:
三: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("集合中不存在小佳");
}
}
}
测试运行结果如下:
来源:https://www.cnblogs.com/liangbaolong/p/12884574.html


猜你喜欢
- 堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉
- 介绍在分布式系统、微服务架构大行其道的今天,服务间互相调用出现失败已经成为常态。如何处理异常,如何保证数据一致性,成为微服务设计过程中,绕不
- 前言Kotlin一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅,下面总结了在开发中经常用
- 本文实例讲述了WinForm中实现picturebox自适应图片大小的方法。分享给大家供大家参考,具体如下:picturebox控件共有两种
- 概述不知道大家在各自项目中是如何写提供代码的commit message, 我们项目有的同事写的很简单,压根不知道提交了什么内容,是新功能还
- 分析:label标签控件是主线程创建的,不能直接从另一个线程访问.可以这样认为:不能跨线程直接访问控件;最简单的办法就是:using Sys
- 0.前言文章需求:对于学生来说,目前网上确实没有比较统一而且质量好的支付教程。因为支付对个人开发者尤其是学生来说不太友好。因此,自己折腾两天
- 1.类加载机制Java中的源码.java后缀文件会在运行前被编译成.class后缀文件,文件内的字节码的本质就是一个字节数组 ,它有特定的复
- 前言Android 很多场合需要使用到数据加密,比如:本地登录密码加密,网络传输数据加密,等。在android 中一般的加密方式有如下:亦或
- 平常我们工作中基本最多两级嵌套,但是有时候难免会遇到 * 嵌套的业务场景,笔者最近就碰到了,使用一般的嵌套发现赋值为空,这可难倒了菜逼的我,后
- ❤️大家好,我是贾斯汀,今天主要聊一聊关于线程的瓜!❤️先来看一下线程这张图线程的几种运行状态之间运行流程:看不懂没关系,慢慢来学习,往
- <?xml version="1.0" encoding="UTF-8"?><eh
- web.xml文件配置创建好一个SpringMVC项目后,需要在需要在WB-INF文件夹下配置web.xml文件<?xml versi
- 本文实例为大家分享了Android读写文件工具类的具体代码,供大家参考,具体内容如下public class Utils { p
- 对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术。本文介绍的是除数据库之外的几种对象持久化方式。具体如下:保存成
- 将SuperSocket封装成类库之后可以将其集成进各种类型的应用,而不仅仅局限于控制台应用程序了,从而应用于不同的场景。这里以Telnet
- 微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧。微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难。下面小编给大
- 目录实现多线程的三种方式一、继承Thread类二、实现Runnable接口三、实现Callable和Future接口多线程单条数据事务管理今
- 1.利用参数出现的顺序利用mapper.xml<select id="MutiParameter" resultT
- 实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。为了解决这样的问题,spring Boot 为我们提供了一个