JAVA集合一:ArrayList和LinkedList
JAVA集合一:ArrayList和LinkedList
参考链接:
前言
这几篇博客重点记录JAVA的几个重要的集合框架:ArrayList、LinkedList、HashMap、HashTable和HashSet。主要从ArrayList和LinkedList、HashMap和HashTable的区别,以及各集合框架的使用等方面进行记录。本篇博客介绍ArrayList和LinkedList的使用和区别。
ArrayList和LinkedList的区别和使用
ArrayList实现了List接口,以下是它的主要方法:
常用方法 | 用途 |
---|---|
add | 在当前顺序表末尾插入一个元素 |
insert | 在当前顺序表中插入一个元素 |
remove | 删除指定元素 |
indexOf | 获取某个元素的下标 |
size | 获取顺序表的大小 |
contains | 判断是否存在某个元素 |
get | 获取指定下标的元素 |
set | 替换指定下标的元素 |
clear | 清除顺序表所有元素 |
addAll | 将另一个容器的所有元素添加进来 |
toArray | 将顺序表转化为数组 |
LinkedList同样实现了List接口, add,remove,contains 等方法同样可以使用。除此之外,它还实现了Deque接口(双向链表)和Queue接口(队列),以下是它区别于ArrayList的特殊的方法:
特殊方法 | 用途 |
---|---|
addLast | 在末尾插入元素 |
addFirst | 在首部插入元素 |
getFirst | 获取首部元素 |
getLast | 获取尾部元素 |
removeFirst | 删除首部元素 |
removeLast | 删除尾部元素 |
offer | 元素进入队列尾部 |
poll | 从队列首部取出一个元素 |
peek | 查看队列第一个元素(不取出) |
ArrayList就是数据结构中学习的顺序表,查询方便,增删较慢
LinkedList就是数据结构中学习的链表,查询较慢,增删很快
以下是how2j网站对两种数据结构的示意图:
接下来我们用代码来展示两者的区别:
//向ArrayList和LinkedList最前面添加10000个数据
package blog;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> arr = new ArrayList<Integer>();//顺序表
List<Integer> link = new LinkedList<Integer>();//链表
insertFirst(arr, "顺序表");
insertFirst(link, "链表");
}
//在线性表头部插入10000个数据,计算耗时
public static void insertFirst(List list, String name) {
int num = 10000;
int data = 1;
long start = System.currentTimeMillis();//获取开始时间
for(int i = 0; i < num; i++) {
list.add(0,data);
}
long end = System.currentTimeMillis();//获取结束时间
System.out.format("在%s头部插入10000个数据,耗时 %d ms\n", name,(end-start));
}
}
运行结果如下(链表耗时更少,因为头部基本不需要定位,只需要增删):
在顺序表头部插入10000个数据,耗时 15 ms
在链表头部插入10000个数据,耗时 2 ms
//ArrayList和LinkedList查询某个元素耗时
package blog;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> arr = new ArrayList<Integer>();//顺序表
List<Integer> link = new LinkedList<Integer>();//链表
getIndex(arr, "顺序表", 500000);
getIndex(link, "链表", 500000);
}
//在线性表获取第index位的数据,计算耗时
public static void getIndex(List<Integer> list, String name, int index) {
int num = 1000000;
for(int i = 0; i < num; i++) {
list.add(i);
}
long start = System.currentTimeMillis();//获取开始时间
int target = list.get(index);//查询元素下标
long end = System.currentTimeMillis();//获取结束时间
System.out.format("在%s中寻找下标为 %d 的数据,耗时 %d ms\n", name,target,(end-start));
}
}
结果如下(当表中数据极大时,链表查询缓慢的多):
在顺序表中寻找下标为 500000 的数据,耗时 0 ms
在链表中寻找下标为 500000 的数据,耗时 5 ms
JAVA集合一:ArrayList和LinkedList的更多相关文章
- 深入理解java中的ArrayList和LinkedList
杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...
- java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...
- Java集合(六)--ArrayList、LinkedList和Vector对比
在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: Java集合(五)--LinkedList源码解读 Java集合(四)--基于JDK1.8的ArrayList源码解读 ...
- Java集合之ArrayList和LinkedList的实现原理以及Iterator详解
ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...
- Java进阶(十七)ArrayList与LinkedList的区别
ArrayList与LinkedList的区别 ArrayList ArrayList其实是包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayLis ...
- Java: Difference between ArrayList and LinkedList
Basically, they are just two different implementations of List interface. LinkedList is implemented ...
- Java集合一
java的集合类主要由两个接口派生而出:Collection && Map 这两个接口是集合框架的根接口 Collection----直接派生:Set(无序集合,元素不可重复) Lis ...
- java中的ArrayList 、List、LinkedList、Collection关系详解
一.基础介绍(Set.List.Map) Set(集):集合中的元素不按特定方式排序,并且没有重复对象.他的有些实现类能对集合中的对象按特定方式排序. List(列表):集合中的元素按索引位置排序,可 ...
- Java集合:List、Set和Map的区别,ArrayList和LinkedList有何区别..........
一.数组和集合的区别: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型): 集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! J ...
随机推荐
- 多页面共用sessionStorage的实现(转载)
sessionStorage的局限: sessionStorage是页面级别的,仅在一个标签页生效,如果同一个浏览器同时打开多个标签页,且都访问同一个域名,sessionStorage是不会在这多个标 ...
- Windows下6款实用软件(强烈推荐!)
Windows下6款实用软件 1.notepads Notepads作为一款编辑器,美观.轻量,功能强大,支持多标签页.Markdown.日常文本编辑.查看,Notepads轻松胜任,如果厌烦了Win ...
- SpringBoot中注入ApplicationContext对象的三种方式
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 在项目中,我们可 ...
- 谁再悄咪咪的吃掉异常,我上去就是一 JIO
又到周末了,周更选手申请出站~ 这次分享一下上个月碰到的离奇的问题.一个简单的问题,硬是因为异常被悄咪咪吃掉,过关难度直线提升,导致小黑哥排查一个晚上. 这个美好的晚上,本想着开两把 LOL 无限火力 ...
- 一对多分页的SQL到底应该怎么写?
1. 前言 MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商品的图片信息.但是很多人会在这里遇到分页的误区,得到不正确的结果.今天就来分析并解决这个问题. 2. 问题分析 我们先创建 ...
- Nacos学习笔记
Nacos简介 Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理.Nacos 帮助更敏捷和容易地构建.交付和管理微服务平台. Nacos 是构建以“服 ...
- cv2 exposureFusion (曝光融合)
import cv2 import numpy as np import sys filenames = ['./images/memorial0061.jpg', './images/memoria ...
- 如何通过Elasticsearch Scroll快速取出数据,构造pandas dataframe — Python多进程实现
首先,python 多线程不能充分利用多核CPU的计算资源(只能共用一个CPU),所以得用多进程.笔者从3.7亿数据的索引,取200多万的数据,从取数据到构造pandas dataframe总共大概用 ...
- openstack cinder-backup流程与源码分析
在现在的云计算大数据环境下,备份容灾已经变成了一个炙手可热的话题,今天,和大家一起分享一下openstack是怎么做灾备的. [首先介绍快照] snapshot可以为volume创建快照,快照中保存了 ...
- less的使用几个技巧
1.层级关系 让这个box范围内的全部包进来,这样的话就完美的进行调节,再也不用到处找第几行第几个,我刚才在哪个位置给覆盖了.一看便知! .box{ width: 100%; height: 300p ...