文章目录

  • 一、ArrayList介绍
  • 二、ArrayList特有方法 `ArrayList应知应会`
    • 2.1 调用addAll() 方法将一个Collection集合添加到ArrayList中
    • 2.2 调用 removeAll()方法删除存在于指定Collection集合中的ArrayList里的所有数据元素
    • 2.3 调用subList()方法截取部分ArrayList的元素
  • 三、ArrayList可重复特点
  • 四、ArrayList存取顺序一致
  • 五、ArrayList有带索引的方法
    • 5.1 普通输出语句输出ArrayList集合
    • 5.2 普通for循环输出ArrayList集合
    • 5.3 forEach语句输出ArrayList集合
    • 5.4 Iterator迭代器输出ArrayList集合
  • 六、ArrayList删除指定值的数据
    • 6.1 删除指定值的数据(漏删数据问题) `常见问题`
    • 6.2 漏删数据解决办法

一、ArrayList介绍

ArrayList是List接口的一个实现类(ArrayList实现了List的接口),它具有List的特点。ArrayList的底层结构是数组。

ArrayList并没有其他特点,List的特点即为它的特点:
可重复:当存入相同数据时,可以有重复的数据存入,这是因为List集合有带索引的方法,可以通过索引值不同来辨别那些相同的数据。
存取顺序一致:存入数据的顺序与输出数据的顺序一定一致。
有带索引的方法:可以直接通过索引得到相应数据,可以直接使用普通for循环来遍历集合。

接下来我们将结合代码来具体学习ArrayList相关知识。

二、ArrayList特有方法 ArrayList应知应会

由于ArrayList是List接口和Collection接口的实现类,因此List和Collection所拥有的方法,ArrayList均可使用,在此不再详细讲述。

方法名 说明
boolean addAll(Collection c) 将一个Collection集合添加到ArrayList中
boolean removeAll(Collection c) 删除存在于指定Collection集合中的ArrayList里的所有数据元素
List subList(int fromIndex,int toIndex) 截取部分ArrayList的元素

2.1 调用addAll() 方法将一个Collection集合添加到ArrayList中

我们来一起回顾一下,Collection所包含的接口与常见实现类


调用addAll() 方法将一个ArrayList集合添加到ArrayList中

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//再次创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList1=new ArrayList<>();//调用add()方法增添数据arrayList1.add("a");arrayList1.add("b");arrayList1.add("c");//调用addAll()方法将一个ArrayList集合添加到ArrayList中arrayList.addAll(arrayList1);//普通输出System.out.println(arrayList);}

运行结果:


调用addAll() 方法将一个LinkedList集合添加到ArrayList中

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//创建一个数据类型为String的LinkedList对象LinkedList<String> list=new LinkedList<>();//调用add()方法增添数据list.add("aa");list.add("bb");list.add("cc");//调用addAll()方法将一个LinkedList集合添加到ArrayList中arrayList.addAll(list);//普通输出System.out.println(arrayList);}

运行结果:


调用addAll() 方法将一个HashSet集合添加到ArrayList中

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//创建一个数据类型为String的HashSet对象HashSet<String> hashSet=new HashSet<>();//调用add()方法增添数据hashSet.add("aaa");hashSet.add("bbb");hashSet.add("ccc");hashSet.add("ccc");//调用addAll() 方法将一个HashSet集合添加到ArrayList中arrayList.addAll(hashSet);//普通输出System.out.println(arrayList);}

运行结果:(我们看到当我们存入集合是Set集合时,存取顺序会变得不一致,并且不会有重复数据)


调用addAll() 方法将一个TreeSet集合添加到ArrayList中

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//创建一个数据类型为String的TreeSet对象TreeSet<String> treeSet=new TreeSet<>();//调用add()方法增添数据treeSet.add("aaaa");treeSet.add("cccc");treeSet.add("bbbb");treeSet.add("cccc");//调用addAll() 方法将一个TreeSet集合添加到ArrayList中arrayList.addAll(treeSet);//普通输出System.out.println(arrayList);}

运行结果:(我们看到当我们存入集合是Set集合时,存取顺序会变得不一致,并且不会有重复数据)


2.2 调用 removeAll()方法删除存在于指定Collection集合中的ArrayList里的所有数据元素

接下来我们就不再像addAll()一样一个个罗列,因为这些操作都是一样的。

调用removeAll() 方法将一个TreeSet集合从ArrayList中删除

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("a");arrayList.add("b");arrayList.add("c");//创建一个数据类型为String的TreeSet对象TreeSet<String> treeSet=new TreeSet<>();//调用add()方法增添数据treeSet.add("aaaa");treeSet.add("cccc");treeSet.add("bbbb");treeSet.add("cccc");//调用addAll()方法将一个TreeSet集合添加到ArrayList中arrayList.addAll(treeSet);//调用removeAll() 方法将一个TreeSet集合从ArrayList中删除arrayList.removeAll(treeSet);//普通输出System.out.println(arrayList);}

运行结果:


2.3 调用subList()方法截取部分ArrayList的元素

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("a");arrayList.add("b");arrayList.add("c");//创建一个数据类型为String的TreeSet对象TreeSet<String> treeSet=new TreeSet<>();//调用add()方法增添数据treeSet.add("aaaa");treeSet.add("cccc");treeSet.add("bbbb");treeSet.add("cccc");//调用addAll()方法将一个TreeSet集合添加到ArrayList中arrayList.addAll(treeSet);//调用subList()方法截取部分ArrayList的元素List<String> strings = arrayList.subList(2, 4);//普通输出截取元素System.out.println(strings);}

运行结果:


三、ArrayList可重复特点

我们增添两个c和两个c数据

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("a");arrayList.add("b");arrayList.add("c");arrayList.add("c");//普通输出System.out.println(arrayList);}

运行结果:(我们看到重复的数据同样也会被输出)


四、ArrayList存取顺序一致

我们存入数据的顺序是aoao,daidai,bobo,lisi,wangwu,zhangsan

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("aoao");arrayList.add("daidai");arrayList.add("bobo");arrayList.add("lisi");arrayList.add("wangwu");arrayList.add("zhangsan");//普通输出System.out.println(arrayList);}

运行结果:


五、ArrayList有带索引的方法

因为ArrayList有带索引的方法,因此可以直接通过索引得到相应数据,可以使用普通for循环,普通输出语句,forEach语句和Iterator迭代器来遍历集合。

5.1 普通输出语句输出ArrayList集合

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("aoao");arrayList.add("daidai");arrayList.add("bobo");arrayList.add("lisi");arrayList.add("wangwu");arrayList.add("zhangsan");//普通输出System.out.println(arrayList);}

运行结果:


5.2 普通for循环输出ArrayList集合

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("aoao");arrayList.add("daidai");arrayList.add("bobo");arrayList.add("lisi");arrayList.add("wangwu");arrayList.add("zhangsan");//普通for循环输出ArrayList集合for (int i = 0; i < arrayList.size(); i++) {System.out.println(arrayList.get(i));}}

运行结果:


5.3 forEach语句输出ArrayList集合

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("aoao");arrayList.add("daidai");arrayList.add("bobo");arrayList.add("lisi");arrayList.add("wangwu");arrayList.add("zhangsan");//forEach语句输出ArrayList集合//s即为list遍历的结果,String即为Arraylist的数据类型for (String s : arrayList) {System.out.println(s);}}

运行结果:


5.4 Iterator迭代器输出ArrayList集合

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("aoao");arrayList.add("daidai");arrayList.add("bobo");arrayList.add("lisi");arrayList.add("wangwu");arrayList.add("zhangsan");//Iterator迭代器输出ArrayList集合Iterator<String> iterator=arrayList.iterator();//iterator.hasNext()的作用即为判断当前位置是否存在元素,若存在则返回true,否则返回falsewhile(iterator.hasNext()){//iterator.next()的作用即为获取当前位置元素,并指向下一位置以便hashNext判断System.out.println(iterator.next());}}

运行结果:


六、ArrayList删除指定值的数据

6.1 删除指定值的数据(漏删数据问题) 常见问题

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("daidai");arrayList.add("daidai");arrayList.add("aoao");arrayList.add("bobo");arrayList.add("lisi");arrayList.add("wangwu");arrayList.add("zhangsan");arrayList.add("daidai");//ArrayList删除值为daidai的元素for (int i = 0; i < arrayList.size(); i++) {if(arrayList.get(i).equals("daidai")){arrayList.remove(i);}}//普通输出System.out.println(arrayList);}

运行结果:(我们发现仍然有一个daidai未被删除)

原因:当我们删除某一元素后,之前此元素之后的所有数据会左移,那么如果第二个与此元素相等的元素,于此元素并排,它就会左移至此元素的位置,而我们的指针之后会加1,因此会跳过它。文字难以理解?没关系,上图解!!!

首先我们插入数据集合元素的顺序如下:


当我们删除第一个daidai之后,集合变为如下图:(我们不难得出结论当我们删除ArrayList集合中的某一数据时,集合会自动缩容。被删除的元素之后的元素会发生左移,即我们删除daidai之后之前索引为1值为daidai的元素左移后,变为索引为0值为daidai)


但是此时我们的i索引指向的是1,因此在之后的遍历中会跳过一个daidai,发生漏删现象


6.2 漏删数据解决办法

当我们删除一个数据后,为了防止漏删,索引i也应跟着左移,即i-1

public static void main(String[] args) {//创建一个数据类型为String的ArrayList对象ArrayList<String> arrayList=new ArrayList<>();//调用add()方法增添数据arrayList.add("daidai");arrayList.add("daidai");arrayList.add("aoao");arrayList.add("bobo");arrayList.add("lisi");arrayList.add("wangwu");arrayList.add("zhangsan");arrayList.add("daidai");//ArrayList删除值为daidai的元素for (int i = 0; i < arrayList.size(); i++) {if(arrayList.get(i).equals("daidai")){arrayList.remove(i);//之所以i要减一,是因为当我们删除第一个daidai后,之前第一个daidai之后的所有数据会左移,那么第二个daidai就会左移至第一个daidai的位置,如果我们的i不减1,那么就会跳过第二个daidai而不删除它i=i-1;}}//普通输出System.out.println(arrayList);}

运行结果:


OK!!!ArrayList介绍结束!!!

Java基础之ArrayList相关推荐

  1. Java基础-集合类-ArrayList retainAll() 方法

    一. retainAll 方法 retainAll() 方法用于保留 arraylist 中在指定集合中也存在的那些元素,也就是删除指定集合中不存在的那些元素. retainAll() 方法的语法为: ...

  2. Java基础:ArrayList类和Arrays类

    ArrayList类 ArrayList类 ArrayList类的意义 ArrayList使用步骤 ArrayList类的常用方法 ArrayList如何存储基本数据类型 Arrays类 Arrays ...

  3. Java 基础面试题,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  4. java vector list,Java基础之:List——ArrayList Vector

    Java基础之:List--ArrayList & Vector ArrayList简单介绍 ArrayList实现了List接口,底层是一个数组,并实现了可变的功能.底层属性(transie ...

  5. java基础 ArrayList集合基本方法演示

    java基础 ArrayList集合基本方法演示 import java.util.ArrayList; import java.util.Iterator;public class ArrayLis ...

  6. java基础:13.1 集合框架 - ArrayList

    文章目录 1.ArrayList 2.特点 3.和数组的区别 4.常用的方法 5.使用泛型与不使用泛型 6.遍历 7.练习 1.ArrayList 在 java基础:6.0 ArrayList 中,初 ...

  7. java array arraylist_java 基础 array arraylist..越详细越好。

    展开全部 java.util 类 ArrayList java.lang.Object java.util.AbstractCollection java.util.AbstractList java ...

  8. Java基础 ArrayList和LinkedList的区别和实现原理

    ArrayList 和 LinkedList都是List的实现类,List集合主要有两个特点:1.有序:2.可重复.所以他们两个肯定也有其特征. 下面分别介绍下二者:  1.ArrayList---  ...

  9. 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:hsm_computer www.cnblogs.com/J ...

最新文章

  1. LeetCode5377. 将二进制表示减到1的步骤数
  2. 活动目录ADSI实现添加系统帐号问题!!!
  3. 【数据结构与算法】之深入解析“合并K个升序链表”的求解思路与算法示例
  4. 编程能力强化(4)——模拟SQL语句解析
  5. 64位ubuntu arm-linux-gcc,在ubuntu 64位的机器上执行arm-linux-gcc提示 no such file or directory【转】...
  6. PAT-1002 写出这个数
  7. 来自山西机器人乐队_冰山上的机器人X三十禁放映 | 庞宽、李霄云对谈预告
  8. 去除android控件滑动的时候出现的阴影
  9. c语言字符数组的应用编程,C语言基础(一)
  10. 洛谷 P1028 数的计算【递推】
  11. Matlab期货量化交易特征选取,【策略分享】Matlab量化交易策略源码分享
  12. Radon变换与Matlab代码
  13. 拉格朗日松弛算法(一)——论文阅读笔记
  14. 敏捷开发流程之Scrum:3个角色、5个会议、12原则
  15. 【AI】图灵奖得主 Yann LeCun 最新文章 :自监督学习,人工智能世界的“暗物质”...
  16. 谷歌云|机密 GKE 节点可在计算优化的 C2D 虚拟机上使用
  17. Anthony_tester(博客链接)
  18. 自动计数报警器c语言程序,计数报警器电路设计方案汇总(多款模拟电路设计原理图详解)...
  19. 英伟达Isaac介绍
  20. 索尼ILCE-7SM3覆盖恢复案例

热门文章

  1. aws SQS 工作原理
  2. 修改手机屏幕刷新率_什么是屏幕刷新率?高刷新率屏幕为手机带来什么
  3. 2022年深圳国际学校IB课程成绩如何?
  4. ASEMI整流桥MB10S,DB207S和ABS210有什么区别
  5. vue组件通信方式之eventBus
  6. 集成学习之Adaboost
  7. APP端测试与web端测试的区别
  8. 移动端和web端测试有什么区别
  9. Jmeter--数据库测试+web测试
  10. 网易云词云python_Python3爬取网易云音乐评论制作词云!网易云评论人才辈出啊!...