首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ArrayList.add源码

最近在写代码的时候,发现在定义一个的列表时,使用list.add方法列表中添加一个元素,会抛出指针的异常。...但是由此就想到为什么new一个ArrayList的时候,调用ArrayList.add方法ArrayList中添加一个元素的时候不会报指针的异常呢?ArrayList如何处理的呢?...因此,借此机会也阅读了一下ArrayList.add的相关源码。 在ArrayList的构造方法中中,ArrayList无参构造方法默认是一个数组,但注释说是容量10的数组。...接下来看ensureCapacityInternal方法: 第1行判断elementData是否是一个数组(初始化容量0,或者调用无参构造函数),如果是,则执行第#2行 第2行选取minCapacity...这种情况发生在ArrayList容量的情况,即oldCapacity=0,minCapacity=1时。

57800
您找到你想要的搜索结果了吗?
是的
没有找到

你有没有使用过这些编程骚操作(二)- 验证框架(Part B)

实例化一个User放到ArrayList中,然后调用setter方法给user对象的friends属性赋值。...在init方法中对friends中的friend对象进行赋值 List friends = new ArrayList(); User friend = new User(); friend.setUserId...set = validator.validate(User,User.LoginGroup.class); } 执行测试 登录场景下只对用户ID进行了校验忽略了用户邮箱,输出了用户ID的提示信息...){ set = validator.validate(User,User.RegisterGroup.class); } 执行测试 注册场景下只对用户的邮箱进行校验忽略了用户ID的校验,抛出了用户邮箱的提示信息...testGroupSequenceValidation(){ set = validator.validate(User,User.Group.class); } 执行该测试方法 控制台输出了userId的提示信息

16710

你有没有掉进去过这些 Exception 的“陷阱”(Part A)

如何避免指针异常 使用对象之前一定要进行初始化,或者对是否初始化进行校验 不要设置函数返回值null 针对接收的对象一定要进行判断 三、自动拆箱指针异常 现象6:赋值时自动拆箱出现指针异常...自动拆箱引发的指针: 变量赋值自动拆箱引发指针 方法传递参数自动拆箱引发指针 现象7:变量赋值时自动拆箱的指针异常 在test包下新建UnboxingNullPointExceptionTest...拆箱是通过调用包装器的 xxxValue 方法实现的,也就是说当包装时调用方法就会出现指针异常 基本数据类型和引用数据类型,优先考虑基本数据类型 对于不确定的包装器类型进行判断校验 对于值...null的包装赋值0 四、String、ArrayList指针情况 现象10:字符串使用equals()方法比较时空指针 新建测试StringNullPointExceptionTest,新增测试方法...,通过.属性的方式赋值会报错指针 现象12:ArrayList执行addAll(null)时空指针 在ListNullPointExceptionTest测试中新增方法 @Test public void

39320

Java集合源码分析之ArrayList

3)看常用的方法 跟构造方法一样,这个方法实现功能是如何实现的 注:既然是源码,为什么要这样设计,有这样的继承关系。这就要说到设计模式的问题了。...该类封装了一个动态再分配的Object【】数组,每一个对象都有一个capacity属性,表示他们所封装的Object【】数组长度,当ArrayList中添加元素时,该属性值会自动增加。...ArrayList的用法和Vector类似,但是Vector是一个较老的集合,具有很多缺点,不建议使用。...说明:底层的数据结构就是数组,数组元素类型Object类型,即可以存放所有类型数据。我们对ArrayList的实例的所有的操作底层都是基于数组的。...的object[]会默认赋值10,后面会提到什么时候赋值 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } 备注: transient

33620

jdk源码分析之List--常用实现分析与对比

接下来我们List到具体实现,详细分析一下其功能和实现: ?...首先返回列表最后一个元素开始的列表迭代器,如果入参null,尾部向前遍历,找到null的元素返回位置;如果入参非null,也是尾部首部遍历找到相等的元素返回位置;如果没有找到返回-1...如果入参小于0报参数非法异常;否则新建一个长度入参的Object数组赋值给elementData public ArrayList(Collection<?...),那么会最后一个元素遍历,凑巧一下子找到了元素,这种情况下性能是和ArrayList中的get性能一样的;然后index500000得时候,ArrayList和之前get性能基本一样,而LinkedList...对于前者,仍然只需要新建一个Node和改变前后指针指向,而后者会发生数组复制,将原数组所有元素拷贝到自己第二个位开始,长度size的对应位置,然后将入参赋值给0号位置,出了数组复制,还可能出现扩容,

22420

初探Java源码之ArrayList

Set和List两个继承于它。Set中不能包含重复的元素,也没有顺序来存放。而List是一个有序的集合,可以包含重复的元素。 而Map又是另一个接口,它和Collection接口没有关系。...今天我们来专门看看ArrayList的源码。 成员变量 首先我们来看看ArrayList的成员变量: ? 可以看到主要的几个成员变量如上(跟进继承的父,父父直到根父都没有成员变量)。...如果没有元素,那么直接赋值EMPTY_ELEMENTDATA。 至此三个构造方法就已经分析完了,基本上没有什么难度。 常见方法 接下来我们来分析一些ArrayList的常见方法。...首先判断我们传入的object是否,如果,那么就for循环找到第一个数组中值null的元素,调用fastRemove()方法,我们去看看: ?...我们来看看代码,首先是对传入对象的判。如果对象,还是一样的,for循环来查找elementData中第一个null的元素,然后返回下标。

46310

揭秘Java中的瑞士军刀——ArrayList源码解析

比如在Java中,我们经常使用的ArrayList。 它为我们提供了一种方便的方式来管理和操作一个动态数组,但是你是否曾经停下来3思考过它是如何工作的呢?它的内部机制是什么?...ArrayList来存储、添加、修改和移除元素。...使用另一个for循环,遍历data中的所有元素打印它们。 修改data中索引为1的元素字符串"了不起"。 再次使用for循环,打印修改后的data中的所有元素。...最后,使用remove方法data中移除索引为1的元素(即"了不起"),打印移除元素后的data。 这段代码展示了ArrayList的基本操作,包括添加元素、获取元素、修改元素和移除元素。...然后,它会通过位运算将数组长度扩大1.5倍,并将结果赋值给newCapacity。接着,如果newCapacity小于minCapacity,它会将newCapacity设置minCapacity。

16350

property属性相关小记

为了安全起见,在调用时需要把block先赋值给本地变量,以防止block改变。若不这么操作,即使先判断了block不为,调用前,一旦另一个线程把block置,程序会crash。...weak表中获取废弃对象的地址键值的记录 b. 将包含在记录中的所有附有 weak修饰符变量量的地址,赋值 nil c. 将weak表中该记录删除 d....,能否运行时创建的添加实例变量?...不能编译后得到的增加实例变量 可以运行时创建的添加实例变量 原因: 编译后的已经注册在runtime中,结构体中objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已确定...所以不能存在的中增加实例变量。

1.1K20

C#基础知识系列二(值类型和引用类型、可类型、堆和栈、装箱和拆箱)

所有值类型的数据都无法null的,声明后必须赋以初值;引用类型才允许null。 不过这里我们可以看一下可类型 可类型 可类型可以表示基础类型的所有值,另外还可以表示 null 值。...3.比较可类型时,只要一个操作数null,比较结果就为false。 ? 值类型和引用类型在赋值(或者说复制)的时候也是有区别的。...托管堆是进程可用4GB的另一个区域,我们用一个例子了解托管堆的工作原理和引用数据类型分配内存。假设我们有一个Cat。...代码声明了一个ArrayList对象,ArrayList中添加两个数字1,2;然后使用foreach将ArrayList中的元素打印到控制台。...在这个过程中会发生两次装箱操作和两次拆箱操作,在ArrayList中添加int类型元素时会发生装箱,在使用foreach枚举ArrayList中的int类型元素时会发生拆箱操作,将object类型转换成

1.1K41

C#基础知识系列二(值类型和引用类型、可类型、堆和栈、装箱和拆箱)

所有值类型的数据都无法null的,声明后必须赋以初值;引用类型才允许null。 不过这里我们可以看一下可类型 可类型 可类型可以表示基础类型的所有值,另外还可以表示 null 值。...3.比较可类型时,只要一个操作数null,比较结果就为false。 ? 值类型和引用类型在赋值(或者说复制)的时候也是有区别的。...托管堆是进程可用4GB的另一个区域,我们用一个例子了解托管堆的工作原理和引用数据类型分配内存。假设我们有一个Cat。...代码声明了一个ArrayList对象,ArrayList中添加两个数字1,2;然后使用foreach将ArrayList中的元素打印到控制台。...在这个过程中会发生两次装箱操作和两次拆箱操作,在ArrayList中添加int类型元素时会发生装箱,在使用foreach枚举ArrayList中的int类型元素时会发生拆箱操作,将object类型转换成

1K10

全面解析ArrayList,超详细!

2,ArrayList构造方法 下面是查看API中构造方法 构造方法 2.1,无参构造方法 我们看源码中的无参构造方法: 无参构造,使用默认的size10的数组,在构造方法中没有对数组长度进行设置,...无参构造 里面是一个赋值操作,右边是一个容量数组,左边则是存储数据的容器,以下是参照源码分析; //默认容量数组,长度0 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA...public boolean isEmpty() 5,常见面试题(精华) 5.1,ArrayList如何扩容的?...频繁扩容导致性能下降,如何处理?...我们来测试一下,先准备一个线程任务: 然后定义测试,对任务进行测试: 我们来看结果: 可以看到会报异常错误,有的线程还是null,这说明ArrayList线程是不安全的。

55220
领券