【数据结构】每天五分钟,快速入门数据结构(一)——数组

目录

一.初始化语法

二.特点

三.数组中的元素默认值

四.时间复杂度

五.Java中的ArrayList类 可变长度数组

1 使用

2 注意事项

3 实现原理

4 ArrayList源码

5 ArrayList方法

一.初始化语法

// 数组动态初始化(先定义数组,指定数组长度,后续再进行赋值)
int[] arr = new int[7]; 
arr[0] = 1; 
// 数组静态初始化(在创建数组时直接赋值)
String[] names = new String[]{"张三","李四","王五"};
int[] nums = {0,0,1,1,1,2,2,3,3,4}; 
//遍历数组中的元素
for( int i = 0;i < arr.length; i++){System.out.println(arr[i]);
}

二.特点

  • 数组下标从0开始

  • 随机访问能力:可以通过索引进行o(1)时间复杂度的访问

  • 一旦初始化就不能改变长度

  • 物理上和逻辑上都是连续的

三.数组中的元素默认值

  • int :0;

  • char: 空;

  • boolean: false;

  • double: 0.0;

  • 引用类型:null

四.时间复杂度

在数组中的任意位置插入:O(n) 通过索引值访问数组元素:O(1)

查找数组中某个值所在的索引值:O(n)或者O(log n)(有序数组二分查找) 删除数组中的某个元素:O(n)

五.Java中的ArrayList类 可变长度数组

1 使用

 ArrayList<String> sites = new ArrayList<String>(); // 创建一个可变长数组sites.add("张三"); // 添加元素sites.add("李四");sites.add("王五");System.out.println(sites); // 打印输出数组元素System.out.println(sites.get(1));  // 访问第二个元素sites.set(1, "柳柳"); // 修改元素内容,第一个参数为索引位置,第二个为要修改的值sites.remove(3); // 删除元素sites.size(); // 获取数组长度

2 注意事项

  • 数组下标从0开始

  • 数组中存储的元素类型只能为引用类型,因此需要使用基本类型的包装类

3 实现原理

自动创建一个长度为n的数组,当存放的数据量超过n时,就重新创建一个更长的数组,再将原数组内容复制到新数组中,更改数组名指向地址。

4 ArrayList源码

package java.util;public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{// 序列版本号private static final long serialVersionUID = 8683452581122892189L;// 默认容量大小private static final int DEFAULT_CAPACITY = 10;// 空数组private static final Object[] EMPTY_ELEMENTDATA = {};// 用于保存ArrayList中数据的数组private transient Object[] elementData;// ArrayList中所包含元素的个数private int size;// 带初始容量参数的构造函数public ArrayList(int initialCapacity) {super();if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);this.elementData = new Object[initialCapacity];}// 默认构造函数,其默认初始容量为10public ArrayList() {super();this.elementData = EMPTY_ELEMENTDATA;}// 带Collection参数的构造函数public ArrayList(Collection<? extends E> c) {elementData = c.toArray();size = elementData.length;// c.toArray might (incorrectly) not return Object[] (see 6260652)if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);}// 将此 ArrayList 实例的容量调整为列表的当前大小(实际元素个数)public void trimToSize() {modCount++;if (size < elementData.length) {elementData = Arrays.copyOf(elementData, size);}}// 如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所// 指定的元素数public void ensureCapacity(int minCapacity) {int minExpand = (elementData != EMPTY_ELEMENTDATA)// any size if real element table? 0// larger than default for empty table. It's already supposed to be// at default size.: DEFAULT_CAPACITY;if (minCapacity > minExpand) {ensureExplicitCapacity(minCapacity);}}private void ensureCapacityInternal(int minCapacity) {if (elementData == EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);}private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);}private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;}// 返回ArrayList中的元素个数public int size() {return size;}// 判断ArrayList是否为空public boolean isEmpty() {return size == 0;}// 判断ArrayList是否包含Object(o)public boolean contains(Object o) {return indexOf(o) >= 0;}// 返回ArrayList中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++)if (o.equals(elementData[i]))return i;}return -1;}// 返回ArrayList中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1public int lastIndexOf(Object o) {if (o == null) {for (int i = size-1; i >= 0; i--)if (elementData[i]==null)return i;} else {for (int i = size-1; i >= 0; i--)if (o.equals(elementData[i]))return i;}return -1;}// 返回此 ArrayList 实例的浅表副本public Object clone() {try {@SuppressWarnings("unchecked")ArrayList<E> v = (ArrayList<E>) super.clone();// 将当前ArrayList的全部元素拷贝到v中v.elementData = Arrays.copyOf(elementData, size);v.modCount = 0;return v;} catch (CloneNotSupportedException e) {// this shouldn't happen, since we are Cloneablethrow new InternalError();}}// 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组public Object[] toArray() {return Arrays.copyOf(elementData, size);}// 返回ArrayList的模板数组。所谓模板数组,即可以将T设为任意的数据类型@SuppressWarnings("unchecked")public <T> T[] toArray(T[] a) {if (a.length < size)// Make a new array of a's runtime type, but my contents:return (T[]) Arrays.copyOf(elementData, size, a.getClass());System.arraycopy(elementData, 0, a, 0, size);if (a.length > size)a[size] = null;return a;}// 位置访问操作   @SuppressWarnings("unchecked")E elementData(int index) {return (E) elementData[index];}// 返回ArrayList中指定位置上的元素public E get(int index) {rangeCheck(index);return elementData(index);}// 用指定的元素替代ArrayList中指定位置上的元素,并返回替代前的元素public E set(int index, E element) {rangeCheck(index);E oldValue = elementData(index);elementData[index] = element;return oldValue;}// 将指定的元素添加到ArrayList的尾部public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;}// 将指定的元素插入ArrayList中的指定位置public void add(int index, E element) {rangeCheckForAdd(index);ensureCapacityInternal(size + 1);  // Increments modCount!!System.arraycopy(elementData, index, elementData, index + 1,size - index);elementData[index] = element;size++;}// 移除ArrayList中指定位置上的元素,并返回该位置上的元素public E remove(int index) {rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;}// 移除ArrayList中首次出现的指定元素(如果存在则移除并返回true,否则返回false)public boolean remove(Object o) {if (o == null) {for (int index = 0; index < size; index++)if (elementData[index] == null) {fastRemove(index);return true;}} else {for (int index = 0; index < size; index++)if (o.equals(elementData[index])) {fastRemove(index);return true;}}return false;}// 私有方法,用于快速移除private void fastRemove(int index) {modCount++;int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its work}// 移除ArrayList中的所有元素public void clear() {modCount++;// clear to let GC do its workfor (int i = 0; i < size; i++)elementData[i] = null;size = 0;}// 按照指定 collection 的迭代器所返回的元素顺序,// 将该 collection 中的所有元素添加到ArrayList的尾部public boolean addAll(Collection<? extends E> c) {Object[] a = c.toArray();int numNew = a.length;ensureCapacityInternal(size + numNew);  // Increments modCountSystem.arraycopy(a, 0, elementData, size, numNew);size += numNew;return numNew != 0;}// 从指定的位置开始,将指定 collection 中的所有元素插入到ArrayList中public boolean addAll(int index, Collection<? extends E> c) {rangeCheckForAdd(index);Object[] a = c.toArray();int numNew = a.length;ensureCapacityInternal(size + numNew);  // Increments modCountint numMoved = size - index;if (numMoved > 0)System.arraycopy(elementData, index, elementData, index + numNew,numMoved);System.arraycopy(a, 0, elementData, index, numNew);size += numNew;return numNew != 0;}// 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素protected void removeRange(int fromIndex, int toIndex) {modCount++;int numMoved = size - toIndex;System.arraycopy(elementData, toIndex, elementData, fromIndex,numMoved);// clear to let GC do its workint newSize = size - (toIndex-fromIndex);for (int i = newSize; i < size; i++) {elementData[i] = null;}size = newSize;}// 私有方法,用于范围检测private void rangeCheck(int index) {if (index >= size)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}// 私有方法,用于add和addAllprivate void rangeCheckForAdd(int index) {if (index > size || index < 0)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}private String outOfBoundsMsg(int index) {return "Index: "+index+", Size: "+size;}// 移除ArrayList中Collection所包含的所有元素public boolean removeAll(Collection<?> c) {return batchRemove(c, false);}// 保留所有ArrayList和Collection共有的元素public boolean retainAll(Collection<?> c) {return batchRemove(c, true);}private boolean batchRemove(Collection<?> c, boolean complement) {final Object[] elementData = this.elementData;int r = 0, w = 0;boolean modified = false;try {for (; r < size; r++)if (c.contains(elementData[r]) == complement)elementData[w++] = elementData[r];} finally {// Preserve behavioral compatibility with AbstractCollection,// even if c.contains() throws.if (r != size) {System.arraycopy(elementData, r,elementData, w,size - r);w += size - r;}if (w != size) {// clear to let GC do its workfor (int i = w; i < size; i++)elementData[i] = null;modCount += size - w;size = w;modified = true;}}return modified;}// java.io.Serializable的写入函数// 将ArrayList的“容量,所有的元素值”都写入到输出流中private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{// Write out element count, and any hidden stuffint expectedModCount = modCount;s.defaultWriteObject();// Write out size as capacity for behavioural compatibility with clone()s.writeInt(size);// Write out all elements in the proper order.for (int i=0; i<size; i++) {s.writeObject(elementData[i]);}if (modCount != expectedModCount) {throw new ConcurrentModificationException();}}// java.io.Serializable的读取函数:根据写入方式读出// 先将ArrayList的“容量”读出,然后将“所有的元素值”读出private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {elementData = EMPTY_ELEMENTDATA;// Read in size, and any hidden stuffs.defaultReadObject();// Read in capacitys.readInt(); // ignoredif (size > 0) {// be like clone(), allocate array based upon size not capacityensureCapacityInternal(size);Object[] a = elementData;// Read in all elements in the proper order.for (int i=0; i<size; i++) {a[i] = s.readObject();}}}// 返回一个从指定位置开始遍历的ListIterator迭代器public ListIterator<E> listIterator(int index) {if (index < 0 || index > size)throw new IndexOutOfBoundsException("Index: "+index);return new ListItr(index);}// 返回一个ListIterator迭代器public ListIterator<E> listIterator() {return new ListItr(0);}// 返回一个Iterator迭代器public Iterator<E> iterator() {return new Itr();}// 返回一个指定范围的子List列表public List<E> subList(int fromIndex, int toIndex) {subListRangeCheck(fromIndex, toIndex, size);return new SubList(this, 0, fromIndex, toIndex);}
}

5 ArrayList方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478941.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动通信相关知识学习笔记

一、移动通信架构简图 移动无线的接入网是专指各种基站设备。核心网就是各种交换机。 二、无线信号基本原理 无线网络中&#xff0c;使用AP设备和天线来实现有线和无线信号互相转换。如上图所示&#xff0c;有线网络侧的数据从AP设备的有线接口进入AP后&#xff0c;经AP处理为…

电子邮件是什么意思?电子邮箱有什么作用?

电子邮件的定义是什么&#xff1f;怎么申请电子邮箱比较好&#xff1f; 伴随着科技的飞速发展&#xff0c;逐渐渗透到我们的工作、学习和生活中。那么&#xff0c;电子邮件到底是什么意思呢&#xff1f;它又是如何影响我们的日常生活的呢&#xff1f;接下来&#xff0c;就让蜂…

C# CAD交互界面-自定义面板集-comboBox选择图层

运行环境Visual Studio 2022 c# cad2016 一、代码说明 SelectLayer方法是一个自定义的AutoCAD命令方法&#xff0c;通过[CommandMethod("SelectLayer")]进行标记。方法首先获取当前活动文档&#xff0c;并检查是否有效。创建一个名为"SelectLayer"的Pale…

即时设计好用吗?怎么用?

进行 UI 设计&#xff0c;除了选择合适的工具&#xff0c;如果能提前掌握一些软件的使用技巧&#xff0c;提高每一步的操作效率&#xff0c;积累起来也能提高整体设计效率。所以这篇文章想给大家介绍一下国内高效的在线设计工具。 即时设计&#xff0c;让你的 UI 设计效率快到飞…

线程池:优化多线程管理的利器

引言 同步和异步想必各位都有了解&#xff0c;同步简单来说就是一件事做完再去做下一件&#xff1b;异步则是不用等一件事做完&#xff0c;就可以去做另一件事&#xff0c;当一件事完成后可以收到对应的通知&#xff1b;异步一般应用于一些耗时较长的操作&#xff0c;比如大型…

分布式锁的应用场景及实现

文章目录 分布式锁的应用场景及实现1. 应用场景2. 分布式锁原理3. 分布式锁的实现3.1 基于数据库 分布式锁的应用场景及实现 1. 应用场景 电商网站在进行秒杀、特价等大促活动时&#xff0c;面临访问量激增和高并发的挑战。由于活动商品通常是有限库存的&#xff0c;为了避免…

LabVIEW读取excel日期

LabVIEW读取excel日期 | Excel数据表格中有日期列和时间列&#xff0c;如下表所示&#xff1a; 通过LabVIEW直接读取Excel表格数据&#xff0c;读出的日期列和时间列数据与原始表格不一致&#xff0c;直接读出来的数据如下表所示&#xff1a; 日期、时间列数据异常 问题产生原因…

Sora新视角:从介绍到商业价值,全面解读优势

关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&…

使用Sora部署实时音视频通信应用实战项目

一、项目概述 本项目将构建一个在线教学平台&#xff0c;实现教师与学生之间的实时音视频通信。平台将提供教师上传课件、发起授课邀请&#xff0c;学生加入课堂、实时互动等功能。通过使用Sora&#xff0c;我们将确保音视频通信的稳定、流畅和低延迟。 目录 一、项目概述 二…

目录IO 2月19日学习笔记

1. lseek off_t lseek(int fd, off_t offset, int whence); 功能: 重新设定文件描述符的偏移量 参数: fd:文件描述符 offset:偏移量 whence: SEEK_SET 文件开头 SEE…

linux基础命令和示例

redis在go语言中的使用 以下说明以读者有redis基础的前提下进行 未学习redis的可以到b站1小时浅学redis了解大概&#xff0c;学会如何使用 【GeekHour】一小时Redis教程_哔哩哔哩_bilibili 以下开发环境以windows为测试环境&#xff0c;旨在练习redis在go语言中的使用 red…

电池可热插拔拆卸对三防加固平板有什么意义|亿道三防onerugged

今天我要和大家聊聊三防加固平板电脑中一个非常重要的功能——电池的可热插拔拆卸。是的&#xff0c;亿道三防onerugged系列产品具备这一亮点功能&#xff0c;给用户带来了极大的便利和灵活性。 首先&#xff0c;让我们来看看电池可热插拔拆卸的优势之一——双电池设计。亿道三…