当前位置:   article > 正文

详解java中ArrayList_javaarraylist

javaarraylist

目录

前言

一、ArrayList是什么

 二、ArrayList使用

1、ArrayList的构造

2 、ArrayList常见操作

3、 ArrayList的遍历

4、 ArrayList的扩容机制

三、来个练习

前言

        当你看到这篇文章我觉得很好笑,因为我开始也不懂ArrayList现在轮到你了,嘻嘻嘻,但是没关系我教你,action!!!

一、ArrayList是什么

通俗点讲ArrayList就是数组

文字解答:ArrayList属于List,List是线性表,线性表有顺序表、链表、栈、队列...,而ArrayList底层代码就是顺序表(数组)

代码解答(重点):

  1. public class MyArrayList {
  2. public int[] elem;//数组
  3. public int usedSize;
  4. // 默认的容量
  5. public static final int DEFAULT_CAPACITY = 5;
  6. public MyArrayList() {
  7. elem = new int[DEFAULT_CAPACITY];//数组初始化
  8. }

你可能感觉很奇怪,ArrayList底层既然是数组,那为什么不直接写成数组的形式呢,比如这样 

int [] ArrayList={1,2,3};

亦或者是这样:

int [] ArrayList=new int []{1,2,3};

我只能说你对数组的定义没忘,hahaha 

  • 不卖关子了,如果我们这样定义,那好我问你
  • 如果我们想在数组中添加任意类型的元素怎末办?数组在一开始就要定义数组中元素类型了
  • 如果我们想动态的改变数组大小怎么办?
  • 如果我想在数组最后添加元素,普通数组你需要找到数组大小后添加,没有直接的函数,繁琐
  • .....

 二、ArrayList使用

1、ArrayList的构造

第一种方法:

  1. // ArrayList创建,推荐写法
  2. // 构造一个空的列表
  3. List<Integer> list1 = new ArrayList<>();

第二种方法:

  1. // list2构造好之后,与list1中的元素拼接,list1元素插入到了list2后面
  2. ArrayList<Integer> list2 = new ArrayList<>(list1);

特别注意:ArrayList(Collection<? extends E> c) 的意思是new ArrayList<>(list1);小括号内对象的类型必须是继承了Collection,上述list1的类型是List满足这一条件;其次list1的<>必须是现在<>的类型的子类或者相同关系 ,c是定义的变量。

第三种方法:

  1. // 构造一个具有10个容量的列表
  2. List<Integer> list3 = new ArrayList<>(10);
  3. list3.add(1);
  4. list3.add(2);
  5. list3.add(3);
  6. // list3.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素

2 、ArrayList常见操作

代码解释:

  1. public static void main(String[] args) {
  2. List<String> list = new ArrayList<>();
  3. list.add("JavaSE");
  4. list.add("JavaWeb");
  5. list.add("JavaEE");
  6. list.add("JVM");
  7. list.add("测试课程");
  8. System.out.println(list);
  9. // 获取list中有效元素个数
  10. System.out.println(list.size());
  11. // 获取和设置index位置上的元素,注意index必须介于[0, size)间
  12. System.out.println(list.get(1));
  13. list.set(1, "JavaWEB");
  14. System.out.println(list.get(1));
  15. // 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置
  16. list.add(1, "Java数据结构");
  17. System.out.println(list);
  18. // 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置
  19. list.remove("JVM");
  20. System.out.println(list);
  21. // 删除list中index位置上的元素,注意index不要超过list中有效元素数,否则会抛出下标越界异常
  22. list.remove(list.size()-1);
  23. System.out.println(list);
  24. if(list.contains("测试课程")){
  25. list.add("测试课程");
  26. }
  27. // 查找指定元素第一次出现的位置:indexOf从前往后找,lastIndexOf从后往前找
  28. list.add("JavaSE");
  29. System.out.println(list.indexOf("JavaSE"));
  30. System.out.println(list.lastIndexOf("JavaSE"));
  31. // 使用list中[0, 4)之间的元素构成一个新的SubList返回,但是和ArrayList共用一个elementData
  32. //数组
  33. List<String> ret = list.subList(0, 4);
  34. System.out.println(ret);
  35. list.clear();
  36. System.out.println(list.size());
  37. }

3、 ArrayList的遍历

ArrayList 可以使用三方方式遍历: for 循环 + 下标、 foreach 、使用迭代器
  1. public static void main(String[] args) {
  2. List<Integer> list = new ArrayList<>();
  3. list.add(1);
  4. list.add(2);
  5. list.add(3);
  6. list.add(4);
  7. list.add(5);
  8. // 使用下标+for遍历
  9. for (int i = 0; i < list.size(); i++) {
  10. System.out.print(list.get(i) + " ");
  11. }
  12. System.out.println();
  13. // 借助foreach遍历
  14. for (Integer integer : list) {
  15. System.out.print(integer + " ");
  16. }
  17. System.out.println();
  18. //使用迭代器
  19. Iterator<Integer> it = list.listIterator();
  20. while(it.hasNext()){
  21. System.out.print(it.next() + " ");
  22. }
  23. System.out.println();
  24. }
注意:ArrayList 最长使用的遍历方式是: for 循环 + 下标 以及 foreach

4、 ArrayList的扩容机制

当空间不够时需要扩容,比如:

  1. public void add(int data){
  2. if(usedSize == elem.length)//usedSize数组中元素个数
  3. elem=Arrays.copyof(elem,2*elem.length);
  4. elem[usedSize]=data;
  5. usedSize++;
  6. }

三、来个练习

解答:
  1. public static List<List<Integer>> generate(int numRows) {
  2. //建立一个二维数组存储杨辉三角
  3. List<List<Integer>> mylist = new ArrayList<>();//建立第一维数组
  4. for (int i = 0; i < numRows; i++) {
  5. mylist.add(new ArrayList<>());//建立第二维数组
  6. }
  7. for (int i = 0; i < numRows; i++) {
  8. for (int j = 0; j <= i; j++) {
  9. //每行第一个和最后一个都是1
  10. if (j == 0 || j == i) mylist.get(i).add(1);
  11. //中间行插入值
  12. else {
  13. mylist.get(i).add(mylist.get(i - 1).get(j) + mylist.get(i - 1).get(j - 1));
  14. }
  15. }
  16. System.out.println();
  17. }
  18. return mylist;
  19. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/766465
推荐阅读
相关标签
  

闽ICP备14008679号