百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

java基础之ArrayList(java arraylist常用方法)

toyiye 2024-09-19 04:49 2 浏览 0 评论

ArrayList是数组元素常用的数据结构,比较简单。

主要从以下几点总结以下该结构。

ArrayList的基本属性:

//对象数组:ArrayList的底层数据结构,用于存放数据,

private transient Object[] elementData;

//elementData中已存放的元素的个数,注意:不是elementData的容量

private int size;

是不是对transient的使用有点迷糊?下面讲到

ArrayList的内容序列化

transient关键字的作用:在采用Java默认的序列化机制的时候,被该关键字修饰的属性不会被序列化。

ArrayList类实现了java.io.Serializable接口,即采用了Java默认的序列化机制

上面的elementData属性采用了transient来修饰,表明其不使用Java默认的序列化机制来实例化,但是该属性是ArrayList的底层数据结构,在网络传输中一定需要将其序列化,之后使用的时候还需要反序列化,那不采用Java默认的序列化机制,那采用什么呢序列化方式呢?

源码有两个方法,ArrayList自己实现了序列化和反序列化

/**

* Save the state of the <tt>ArrayList</tt> instance to a stream (that is,

* serialize it).

*

* @serialData The length of the array backing the <tt>ArrayList</tt>

* instance is emitted (int), followed by all of its elements

* (each an <tt>Object</tt>) in the proper order.

*/

private void writeObject(java.io.ObjectOutputStream s)

throws java.io.IOException {

// Write out element count, and any hidden stuff

int expectedModCount = modCount;

s.defaultWriteObject();

// Write out array length

s.writeInt(elementData.length);

// 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();

}

}

/**

* Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,

* deserialize it).

*/

private void readObject(java.io.ObjectInputStream s)

throws java.io.IOException, ClassNotFoundException {

// Read in size, and any hidden stuff

s.defaultReadObject();

// Read in array length and allocate array

int arrayLength = s.readInt();

Object[] a = elementData = new Object[arrayLength];

// Read in all elements in the proper order.

for (int i = 0; i < size; i++)

a[i] = s.readObject();

}

ArrayList的构造器:

/**

* 创建一个对象数组,容量为initialCapacity,

*/

public ArrayList(int initialCapacity) {

super();

AbstractList() {}

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal Capacity:" + initialCapacity);

this.elementData = new Object[initialCapacity];

}

/**

* 默认初始化一个容量为10的对象数组

*/

public ArrayList() {

this(10);

}

当执行new ArrayList<String>()时,会调用上边的无参构造器,创造一个容量为10的对象数组。

在我们执行new ArrayList<String>(4)时,会调用上边的public ArrayList(int initialCapacity),创造一个容量为4的对象数组。

在实际使用中,如果是成员变量可以确定的场景,建议直接初始化时定好容量。

ArrayList扩容

/**

* 确保数组的容量足够,若是不够,必须扩容

*/

public void ensureCapacity(int minCapacity) {

modCount++;

int oldCapacity = elementData.length;//获取数组的容量

//容量满的情况下

if (minCapacity > oldCapacity) {

Object oldData[] = elementData;

int newCapacity = (oldCapacity * 3) / 2 + 1;//新容量为旧容量的1.5倍+1

if (newCapacity < minCapacity)//如果扩容后的新容量还不满足新增要求

newCapacity = minCapacity;//新容量设为预期需要的容量

elementData = Arrays.copyOf(elementData, newCapacity);//复制元素并使用新的容量大小

}

}

在上述代码的扩容结束后,调用了Arrays.copyOf(elementData, newCapacity)方法,这个方法先创建了一个新的容量为newCapacity的对象数组,然后使用System.arraycopy()方法将旧的对象数组复制到新的对象数组中去了。

注意:

modCount变量用于在遍历集合(iterator())时,检测是否发生了add、remove操作。

删除ArrayList中的对象

remove(Object o)需要遍历数组,remove(int index)不需要,只需要判断索引符合范围即可,所以,通常:后者效率更高。

遍历ArrayList中的对象(iterator方式)

源代码:iterator()方法是在内部类AbstractList中实现的,该方法返回AbstractList的一个内部类Itr对象

public Iterator<E> iterator() {

return new Itr();//返回一个内部类对象

}

Itr内部类:

private class Itr implements Iterator<E> {

int cursor = 0;//标记遍历到的元素位置

int expectedModCount = modCount;

//ArrayList修改次数,用于fast fail机制快速失败 原理详见HashMap篇

//检测对象数组是否还有元素

public boolean hasNext() {

return cursor != size();//如果cursor==size,表示遍历结束

}

//获取下一元素

public E next() {

checkForComodification();//检测在遍历的过程中,ArrayList是否发生了内容变化

try {

E next = get(cursor++);

return next;

} catch (IndexOutOfBoundsException e) {

checkForComodification();

throw new NoSuchElementException();

}

}

//检测在遍历的过程中,是否发生内容变化

final void checkForComodification() {

if (modCount != expectedModCount)//预期修改次数是否等于真的修改次数

throw new ConcurrentModificationException();

}

}

ArrayList基于数组方式实现,容量限制几乎无限

ArrayList线程不安全

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码