深度解析Java中ArrayList的使用_第1页
深度解析Java中ArrayList的使用_第2页
深度解析Java中ArrayList的使用_第3页
深度解析Java中ArrayList的使用_第4页
深度解析Java中ArrayList的使用_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第深度解析Java中ArrayList的使用目录一、ArrayList是什么二、ArrayList的构造方法三、ArrayList的常见方法常见方法遍历ArrayList使用迭代器删除元素四、ArrayList的扩容机制

一、ArrayList是什么

ArrayList类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList继承了AbstractList,并实现了List接口。

我们发现ArrayList类位于java.util包中,使用之前需要去引入它.

importjava.util.ArrayList;

ArrayList如何定义:

ArrayListEarrayList=newArrayListE

此数E为泛型实参类型,只能为引用数据类型,ArrayList想存储什么类型的数据,我们就传什么就可以。

ListElist=newArrayListE

因我们的ArrayList是继承于List的,所以我们可以用父类去接受子类对象,向上转型。

二、ArrayList的构造方法

我们发现ArrayList一共提供了三种构造方法。

构造方法1:

构造一个空的顺序表

ListIntegerlist=newArrayList();

构造方法2:

构造一个指定大小为5的顺序表

ListIntegerlist=newArrayList(5);

构造方法3:

此处传入的要么是自己本身类型,或者是子类类型。

此处构造一个和list2元素一致的顺序表

ListIntegerlist2=newArrayList(5);ListIntegerlist=newArrayList(list2);

初始时的坑

Listlist=newArrayList();

这样对顺序表进行初始化的话,没有指定任何类型,这样的话可以存放任意类型的元素,这样会存在很大的安全隐患。

三、ArrayList的常见方法

常见方法

在我的上一篇实现顺序表中,已经把大多数方法手动实现了一遍,此处我在说明几个重点的。

remove方法

ArrayList提供给我们两个remove方法

一个是传入要删除的下标,一个是要删除的引用。

publicstaticvoidmain(String[]args){

ListIntegerlist=newArrayList();

list.add(10);

list.add(8);

list.remove(1);

System.out.println(list);

如果我们传入的是int类型那么我们删除的是该下标的数据。

publicstaticvoidmain(String[]args){

ListIntegerlist=newArrayList();

list.add(10);

list.add(8);

list.remove(newInteger(10));

System.out.println(list);

如果我们传入的是引用数据类型,那么将删除该顺序表中的该引用数据。

subList方法

publicstaticvoidmain(String[]args){

ListIntegerlist=newArrayList();

list.add(1);

list.add(2);

list.add(3);

list.add(4);

System.out.println("截取之前的list:"+list);

ListIntegerlist1=list.subList(1,3);

list1.set(0,5);

System.out.println("截取之后的list:"+list);

为啥改了list1之后,list的数据也发生了变化。

因为在截取之后并没有复制一份内容给list1,而是指向同一块内容。

遍历ArrayList

方法1:

publicstaticvoidmain(String[]args){

ListIntegerlist=newArrayList();

list.add(1);

list.add(2);

list.add(3);

list.add(4);

for(inti=0;ilist.size();i++){

System.out.print(list.get(i)+"");

System.out.println();

方法2:

publicstaticvoidmain(String[]args){

ListIntegerlist=newArrayList();

list.add(1);

list.add(2);

list.add(3);

list.add(4);

for(Integerx:list){

System.out.print(x+"");

System.out.println();

方法3:

使用迭代器

方法作用.next()返回迭代器写一个元素,更新迭代器状态.hasNext()检测集合中是否还有元素.remove()将迭代器返回的元素删除

publicstaticvoidmain(String[]args){

ListIntegerlist=newArrayList();

list.add(1);

list.add(2);

list.add(3);

list.add(4);

IteratorIntegerit=list.listIterator();

while(it.hasNext()){

System.out.print(it.next()+"");

System.out.println();

使用迭代器删除元素

我们删除集合小于3的元素

publicstaticvoidmain(String[]args){

ListIntegerlist=newArrayList();

list.add(1);

list.add(2);

list.add(3);

list.add(4);

IteratorIntegerit=list.listIterator();

while(it.hasNext()){

if(it.next()3){

it.remove();

System.out.println(list);

迭代器的remove方法只能删除当前指向的元素。

四、ArrayList的扩容机制

ListIntegerlist=newArrayList();

很多资料都在说这样初始化一个集合,说默认大小为10,那事实到底是不是如此呢?我们一步步查看源码一探究竟。

我们发现当前引用指向后面那个引用

我们发现这里的引用是一个空引用,初始集合时,是一个空集合。

那如何扩容呢?

既然我们的顺序表是空的,那如何add呢?

如果是无参构造的话,就传一个默认大小和传入大小的最大值。

我们可以发现如果大于数组大小时,就会grow。

我们可以发现计算一个新容量,和我们传入的大小做比较,如果新容量小于传入的大小时,指定当前集合大小为传入的大小。否则,对集合大小进行1.5倍扩容。

但如果我们1.5倍扩容的大小超过了这个指定的范围2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论