Arraylist的一些基础知识

ArrayList相关知识总结 1.定义 ArrayList是一个动态数组,也是我们常用的集合,它允许任何元素的插入,甚至包括null。每一个ArrayList都有一个初始化的容量(10),该容量代表了数组的大小,随着容器中容量的不断增加,容器的大小也会随着增加。在每次向容器中增加元素时,会进行容量检查,当快溢出时,会进行扩容操作。继承自 AbstractList,实现了 List 接口。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。 阅读详情

 

1、ArrayList最佳使用建议

这一节我们来讨论ArrayList与数组的差别,以及ArrayList的效率问题

1)数组

Java中的数组跟C/C++这些语言中的数组的语法结构很相似。但是,Java去掉了C /C++中的可以通过[]或者使用指针来访问元素的功能。这种在C/C++中被普遍接受的功能虽然强大,但是也让Bug横行的软件更容易出现。因为 Java不支持这种直接通过指针来操纵数据,这类的Bug也被消除了。

 


(2)内部的Object类型的影响
对于一般的引用类型来说,这部分的影响不是很大,但是对于值类型来说,往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作,频繁的操作可能会影响一部分效率。
但是恰恰对于大多数人,多数的应用都是使用值类型的数组。
消除这个影响是没有办法的,除非你不用它,否则就要承担一部分的效率损失,不过这部分的损失不会很大。


(3)数组扩容
这是对ArrayList效率影响比较大的一个因素。
每 当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量 的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。
例1:比如,一个可能有200个元素的数据动态添加到一个以默认16个元素大小创建的ArrayList中,将会经过:
16*2*2*2*2 = 256
四次的扩容才会满足最终的要求,那么如果一开始就以:
ArrayList List = new ArrayList( 210 );
的方式创建ArrayList,不仅会减少4次数组创建和Copy的操作,还会减少内存使用。
例2:预计有30个元素而创建了一个ArrayList:
ArrayList List = new ArrayList(30);
在执行过程中,加入了31个元素,那么数组会扩充到60个元素的大小,而这时候不会有新的元素再增加进来,而且有没有调用TrimSize方法,那么就有1次扩容的操作,并且浪费了29个元素大小的空间。如果这时候,用:
ArrayList List = new ArrayList(40);
那么一切都解决了。
所以说,正确的预估可能的元素,并且在适当的时候调用TrimSize方法是提高ArrayList使用效率的重要途径。


(4)频繁的调用IndexOf、Contains等方法(Sort、BinarySearch等方法经过优化,不在此列)引起的效率损失
首 先,我们要明确一点,ArrayList是动态数组,它不包括通过Key或者Value快速访问的算法,所以实际上调用IndexOf、Contains 等方法是执行的简单的循环来查找元素,所以频繁的调用此类方法并不比你自己写循环并且稍作优化来的快,如果有这方面的要求,建议使用Hashtable或 SortedList等键值对的集合。

ArrayList al = new  ArrayList();
al.Add(
" How " );
al.Add(
" are " );
al.Add(
" you! " );
al.Add(
100 );
al.Add(
200 );
al.Add(
300 );
al.Add(
1.2 );
al.Add(
22.8 );
.........
// 第一种遍历 ArrayList 对象的方法
foreach ( object  o  in  al)
{
    Console.Write(o.ToString()
+ "   " );
}

// 第二种遍历 ArrayList 对象的方法
IEnumerator ie = al.GetEnumerator();
while (ie.MoveNext())
{
    Console.Write(ie.Curret.ToString()
+ "   " );
}

// 第三种遍历 ArrayList 对象的方法
for ( int  i = 0 ;i < Count;i ++ )
{
    Console.Write(al[i].ToString()
+ "   " );
}
 

 

5)和数组不一样,因为可以转换为Object数组 ,所以往ArrayList里面添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候,要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常。

 

private ArrayList<Double> featStastic = new ArrayList<Double>(16000);

 Double x =(Double)featStastic.get(pos) ;

 x += 1.0;
 featStastic.add(pos, x);

 

 

2、ArrayList重要的方法和属性

 

(1)构造器
ArrayList提供了三个构造器:
public ArrayList();
默认的构造器,将会以默认(16)的大小来初始化内部的数组
public ArrayList(ICollection);
用一个ICollection对象来构造,并将该集合的元素添加到ArrayList
public ArrayList(int);
用指定的大小来初始化内部的数组


(2)IsSynchronized属性和ArrayList.Synchronized方法
IsSynchronized属性指示当前的ArrayList实例是否支持线程同步,而ArrayList.Synchronized静态方法则会返回一个ArrayList的线程同步的封装。
如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步,例如:

ArrayList list  =   new  ArrayList();
// ...
lock ( list.SyncRoot )  // 当ArrayList为非线程包装的时候,SyncRoot属性其实就是它自己,但是为了满足ICollection的SyncRoot定义,这里还是使用SyncRoot来保持源代码的规范性
{
list.Add( “Add a Item” );
}


如果使用ArrayList.Synchronized方法返回的实例,那么就不用考虑线程同步的问题,这个实例本身就是线程安全的,实际 上ArrayList内部实现了一个保证线程同步的内部类,ArrayList.Synchronized返回的就是这个类的实例,它里面的每个属性都是 用了lock关键字来保证线程同步。
****
但是,使用这个方法(ArrayList.Synchronized)并不能保证枚举的同步,例如,一个线程正在删除或添加集合项,而另一个线程同时进行枚举,这时枚举将会抛出异常。所以,在枚举的时候,你必须明确使用 SyncRoot 锁定这个集合。
 
Hashtable与ArrayList关于线程安全性的使用方法类似。
****


(3)Count属性和Capacity属性
Count属性是目前ArrayList包含的元素的数量,这个属性是只读的。
Capacity属性是目前ArrayList能够包含的最大数量,可以手动的设置这个属性,但是当设置为小于Count值的时候会引发一个异常。


(4)Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange
这几个方法比较类似
Add方法用于添加一个元素到当前列表的末尾
AddRange方法用于添加一批元素到当前列表的末尾
Remove方法用于删除一个元素,通过元素本身的引用来删除
RemoveAt方法用于删除一个元素,通过索引值来删除
RemoveRange用于删除一批元素,通过指定开始的索引和删除的数量来删除
Insert用于添加一个元素到指定位置,列表后面的元素依次往后移动
InsertRange用于从指定位置开始添加一批元素,列表后面的元素依次往后移动
另外,还有几个类似的方法:
Clear方法用于清除现有所有的元素
Contains方法用来查找某个对象在不在列表之中
其他的我就不一一累赘了,大家可以查看MSDN,上面讲的更仔细


(5)TrimSize方法
这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存。


(6)ToArray方法
这个方法把ArrayList的元素Copy到一个新的数组

ArrayList知识点总结 集合,集合是java中提供的一种容器,可以用来存储多个数据。 我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据。那么,集合和数组既然都是容器,它们有啥区别呢? 1)数组的长度是固定的。集合的长度是可变的。 2)集合中存储的元素必须是引用类型数据 A:ArrayList集合使用 *a.ArrayList集合存储5个int类型元素 public static void ... 阅读详情

相关推荐

Rockchip RK3568实战:手把手教你调试I2S音频驱动(附ALSA设备树配置详解)

本文提供Rockchip RK3568平台I2S音频驱动的实战调试指南。详细解析了从硬件连接到软件配置的全过程,重点涵盖ALSA驱动框架下的设备树配置、时钟计算、DMA参数设置以及常见问题(如无声、爆音)的排查与解决方法,帮助开发者快速定位并解决音频驱动难题。

weixin_28358083的博客 499

ArrayList基础知识

ArrayList就是传说中的动态数组,既然是动态数组,它就可以动态的增加和减少元素,可以灵活的设置数组的大小。 那么,什么时候使用Array(数组),什么时候使用ArrayList? 当我们不知道到底有多少个数据元素的时候,就可使用ArrayList;如果知道数据集合有多少个元素,就用数组。 此外,它还实现了ICollection和IList接口。 ArrayList类支持3个构造方法: Arr...

qq_30242987的博客 291

Python在Windows环境下驱动乐视三合一摄像头的深度图像处理实践

本文详细介绍了在Windows系统下,使用Python驱动乐视三合一摄像头进行深度图像处理的完整实践流程。从环境配置、驱动安装、OpenNI与OpenCV库的部署,到深度与彩色数据流的读取、可视化、三维点云转换以及背景移除等应用开发,为开发者提供了从零开始掌握深度摄像头编程的实战指南。

gitlab7runner的博客 232

JAVA中ArrayList集合

对于ArrayList来说,有一个尖括号代表泛型。 泛型:也就是装在集合当中的所有元素,全都是统一的什么类型。 注意:泛型只能是引用类型,不能是基本类型。 注意事项: 对于ArrayList集合来说,直接打印得到的并不是地址值,而是内容。 如果内容是空,得到的是空的中括号[]。 public class Demo02ArrayList { public static void main(...

Milk的博客 546

C语言版数字锁相放大器实现指南:从复数运算到嵌入式MCU移植的坑我都帮你踩了

本文详细介绍了C语言实现数字锁相放大器的关键技术,包括复数运算优化、嵌入式MCU移植的实战经验及内存管理策略。针对STM32等资源受限平台,提供了从浮点到定点数转换的优化方案,帮助工程师高效处理微弱信号提取问题。

weixin_30721077的博客 433

CANdb++ Editor实战:5步搞定DBC文件信号布局与字节对齐(附常见错误排查)

本文详细介绍了使用CANdb++ Editor进行DBC文件信号布局与字节对齐的实战方法。通过五步法,深入解析Intel与Motorola字节序差异、跨字节信号布局规则,并借助Layout视图等工具,帮助工程师高效解决信号错位、数据解析错误等常见问题,确保CAN网络通信的准确性与可靠性。

solidity8miner的博客 695

这可能是最细的ArrayList详解了!

手撕ArrayList源码 文章首发于GitHub开源项目: Java超神之路 ArrayList 简介 ArrayList 是一个数组列表。它的主要底层实现是Object数组,但与 Java 中的数组相比,它的容量能动态变化,可看作是一个动态数组结构。特别注意的是,当我们装载的是基本类型的数据 int,long,boolean,short,byte… 的时候,我们只能存储他们对应的包装类。 ArrayList 特点 元素有序,可重复 增删元素的速度慢,每次增加删除元素,都需要更改数组长度、拷贝

weixin_44028058的博客 849

华为OD机考2025C卷 - 高矮个子排队(Java & Python& JS & C++ & C)

华为OD机考2025C卷 - 高矮个子排队。提供在线OJ刷题。Java、C++、Python、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1683

ArrayList一些基础知识

2.数组可以存储基本数据类型,引用数据类型;集合可以存储引用数据类型,但存储基本数据类型时只能存储包装类。返回此列表中的元素数。(获取长度,即集合中元素的个数)//list.get(i)表示获取集合中每一个元素。1.数组长度固定,一旦确定不可修改;将指定的元素追加到此列表的末尾。如果存在,则从该列表中删除指定元素的第一个出现。返回此列表中指定位置的元素。删除该列表中指定位置的元素。用指定的元素替换此列表中指定位置的元素。//遍历集合,快捷键:list.fori。

2301_78052099的博客 214

Qt 调用YOLO模型(代码)

本文介绍了如何在 Qt C++ 环境中集成 YOLO 模型进行目标检测,包括模型封装、界面设计和实时处理等关键步骤。通过这种方法,你可以快速开发出具有目标检测功能的 Qt 应用程序,应用于监控系统、机器人视觉、图像分析等多个领域。

轩宇的博客 259

部署与可视化系统:移动端落地保姆级教程:YOLOv8 转换为 NCNN 并封装进 Android App 调用摄像头实时检测

本文介绍了在移动端部署YOLOv8模型的最佳实践。通过实测数据对比,采用NCNN框架在骁龙865设备上可实现35+FPS的实时推理性能。文章详细分析了NCNN相比TFLite、MNN等框架的优势,包括更高的ARM CPU性能、更优的Vulkan GPU加速和更小的模型体积。同时提供了从PyTorch模型到NCNN格式的完整转换流程,包括FP16优化和INT8量化方法,并重点解析了YOLOv8特有的输出格式处理要点。建议开发者先在Python环境验证NCNN推理流程,再部署到Android平台,以确保最佳性能

ZXSXJ的博客 209

Java基础知识总结 ——ArrayList源码

一、ArrayList相关属性 重要的部分都用了中文注释 /** * 类注释 * 1、允许 put null 值,会自动扩容 * 2、size、isEmpty、get、set、add 等方法时间复杂度都是 O (1) * 3、是非线程安全的,多线程情况下,推荐使用线程安全类:Collections#synchronizedList; * 4、增强...

Xiaowei's Blog 612

C#解析基恩士(KEYENCE)PLC数据:KV协议通信与实时监控实现

KV协议是基恩士PLC使用的一种专用通信协议,通常用于与上位机进行数据交换。KV协议通过RS-232C、RS-485、Ethernet等接口与上位机通信,支持多种数据类型的读写,包括但不限于位、字、双字、浮点数等。简洁易用:KV协议的通信格式简单,易于实现。支持多种数据类型:支持位数据、字数据、定长字符串等。高效实时性:能够提供较高的实时数据交换性能,适合实时监控应用。本文介绍了如何通过C#与基恩士KV系列PLC进行通信,实现数据的解析和实时监控功能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1808

java arraylist add时默认调用tostring_Java基础知识之ArrayList知识点总结

本文包含常见的ArrayList的基本知识。在一些主题下也自然地引出了Colletion类的一些相关知识。一.ArrayList的底层数据结构ArrayList底层是使用一个Object[]数组来存储数据的,所以它本质上是一个线性存储结构。这就造成了它可以在O(1)时间内随机访问任意一个元素。但插入元素或删除元素时就要移动大量的元素,时间复杂度是O(n)二.ArrayList初始化和容量增长规则默...

weixin_27252001的博客 318

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java基础知识之ArrayList

1.ArrayList集合快速入门 2.ArrayList对于泛型的支持 3.ArrayList常用API.遍历 4.ArrayList集合案例:遍历并删除元素 5.ArrayList集合案例:存储自定义类型 6.ArrayList集合案例:元素搜索

tyloonulinuli的博客 1487

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java 基础知识总结—ArrayList

1、ArrayList介绍 ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 导包: import java.util.ArrayList; 初始化: ArrayList<objec> objectName =new ArrayList<>();  object: 泛型数据类型,用于设置 objectName 的数据类型,只

记录、总结 427

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java 基础知识 ArrayList

ArrayList的用法ArrayList类是一个特殊的数组。它来自于System.Collections命名空间;通过添加和删除元素,就可以动态改变数组的长度。一、优点1)支持自动改变大小的功能 2)可以灵活的插入元素 3)可以灵活的删除元素二、局限性跟一般的数组比起来,速度上差些。因为它是动态数组,初始化大小容量4,当数据存满时扩容是以当前数组容量大小的2倍扩容,之后再把数组元素一个一个的存入...

qq_42157382的博客 150

5.4 ArrayList基础知识

ArrayList基础知识底层实现内部方法自定义ArrayList 底层实现       ArrayList是接口List的一个子类实现。ArrayList底层是用数组实现的存储,其特点是查询效率高、增删效率低、线程不安全。       数组长度是有限的,但ArrayList是可...

dxt_snow的博客 186

JavaSE基础知识学习—集合之ArrayList

ArrayList首先明确的是:Collection的子接口是List接口,Listc存储的是有序可重复的元素,ArrayList是List接口的主要实现类,List接口的主要实现类有:1.ArrayList由数组方式实现数据存储,当然数组的访问速度比链表快。源码如下:public class ArrayList<E> extends AbstractList<E> implements L

疾风知劲草,智者必怀仁 448

【Java基础知识】ArrayList怎么正确删除元素

先贴测试代码,以后再来总结 package com.wxw.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.function.Predicate; /** * ArrayList的删除 坑 * * @Author: wxw * @create: 2020-07-14-22:53 */ public class ArrayList_Dele

天天新知 1692

JAVA基础知识学习||集合ArrayList篇

此篇文章为作者学习JAVA过程中的笔记

m0_62937658的博客 197

JAVA-基础知识-ArrayList扩容

JAVA-基础知识-ArrayList扩容 ArrayList是一个常用类,由数组实现,查询可在常数时间内实现,虽然在非结尾增删上效率不如LinkedList,但查询效率高,相对于vector,ArrayList是线程不安全的(可以通过Collections.synchronizedList()实现线程安全),所以更适用单线程环境。 大概介绍: ArrayList的扩容机制,在添加第一个元素时创建...

横行的螃蟹的博客 374

Java中Array和ArrayList的基础知识

1.创建并初始化 Array: (1):String[] str={"a","b","c"}; (2):String[] str=new String[4]; (3):String[] str = new String[]{"a","b","c"}; ArrayList: ArrayList<String> list = new ArrayList<>(); ...

yuncaidaishu的博客 507

Java 基础篇--基础知识之集合ArrayList

文章目录ArrayList 简介一、实现原理二、源码分析2.1 继承与实现关系2.2 重要成员信息2.3 扩容机制2.4 快速失败(fast-fail)机制2.5 安全失败(fail-safe)2.5 重要方法2.5.1 添加2.5.2 删除2.5.3 更新2.5.4 查询2.5.5 其他常用方法三、对应线程安全实现3.1 Collections 同步方法3.2 CopyOnWriteArrayList ArrayList 简介 ArrayList 实现了List接口,是一个顺序(插入顺序)容器,允许存放n

Blare的博客 268

Java基础知识——ArrayList

集合中存储自定义对象

u013111776的博客 206

ArrayList类的基础知识整理

ArrayList集合类是大小可变的数组的实现,存储在集合内的数据成为元素,此类提供一些方法来操作内部的元素。ArrayList中可不断添加元素,其大小也自动增长。 基本格式: ArrayList<String> list=new ArrayList<>();//其中<>中可填写数据类型 常用方法: public boolean add(E e);//将指定的元素添加到此集合的尾部 public E remove(int index);//删除此集合中指

寒溪净轩的博客 372
上一篇: 怎么在劣势保护自己和保存实力
下一篇: java.lang.NoSuchMethodError 错误的解决方法
AlextoWarson
博客等级 码龄17年 33粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值