• Java基础进阶List-ArrayList集合


    1、List接口中的常用方法。
    List是Collection接口的子接口。所以List接口中有一些特有的方法。

    void add(int index, Object element)
    Object set(int index, Object element)
    Object get(int index)
    int indexOf(Object o)
    int lastIndexOf(Object o)
    Object remove(int index)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、迭代器迭代元素的过程中不能使用集合对象的remove方法删除元素,
    要使用迭代器Iterator的remove方法来删除元素,防止出现异常:
    ConcurrentModificationException

    3、ArrayList集合
    (1)默认初始化容量10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量10。)
    (2)集合底层是一个Object[]数组。
    (3)构造方法:

    new ArrayList();
    new ArrayList(20);
    
    • 1
    • 2

    (4)ArrayList集合的扩容:

    • 增长到原容量的1.5倍

    • 源码:int newCapacity = ArraysSupport.newLength(oldCapacity,minCapacity - oldCapacity,oldCapacity >> 1)

    • ArrayList集合底层是数组,怎么优化

      尽可能少的扩容。因为数组扩容效率比较低,建议在使用ArrayList集合的时候
      预估计元素的个数,给定一个初始化容量

    (5)数组优点:

    • 检索效率比较高。(每个元素占用空间大小相同,内存地址是连续的,知道首元素的内存地址,然后知道下标,通过数学表达式计算出元素的内存地址,所以检索效率较高)

    (6)数组缺点:

    • 随机增删元素的效率比较低
    • 另外数组无法存储大数据量(很难找到一块非常巨大的连续的内存空间)

    (7)向数组末尾添加元素,效率比较高,不受影响

    (8)面试题

    • 使用最多的集合是哪一个?
      是ArrayList集合,因为往数组末尾添加元素,效率不受影响
      另外,此数组检索/查找某个元素的操作比较多

    (9)ArrayList集合是非线程安全的(不是线程安全的集合)

    示例代码01:

    public class ArrayListTest01 {
        public static void main(String[] args) {
    
            // 默认初始化容量是10
            // 数组的长度是10
            List l1 = new ArrayList();
            System.out.println(l1.size());//0 size方法是求出集合中的元素有多少,并不是求容量
    
            // 指定初始化容量
            // 数组的长度是20
            List l2 = new ArrayList(10);
            System.out.println(l2.size());//0
    
            l2.add(1);
            l2.add(2);
            l2.add(3);
            l2.add(4);
            l2.add(5);
            l2.add(6);
            l2.add(7);
            l2.add(8);
            l2.add(9);
            l2.add(10);
            System.out.println(l2.size());//10
    
            l2.add(11);
            System.out.println(l2.size());//11
            /*
            * int newCapacity = ArraysSupport.newLength(oldCapacity,minCapacity - oldCapacity,oldCapacity >> 1)
            * 100 二进制转换为10进制:00000100右移一位 00000010【4 / 2】
            * 原先是4、现在增长:2,增长之后是6,增长之后的容量是之前容量的1.5倍
            * */
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    示例代码02:

    /*
    集合ArrayList的构造方法
     */
    public class ArrayListTest02 {
        public static void main(String[] args) {
    
            //初始化容量是10
            List i2 = new ArrayList();
    
            //自定义容量20
            List i1 = new ArrayList(100);//数组长度是110
    
            //创建HashSet集合
            Collection c = new HashSet();
            c.add(500);
            c.add(50);
            c.add(400);
            c.add(100);
    
            //把HashSet集合放到List集合中,就变成了List集合
            List i3 = new ArrayList(c);
            for(int i=0;i<i3.size();i++){
                System.out.println(i3.get(i));
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    Java基础 | 反射机制详解
    使用docker安装ELK
    社媒矩阵运营解决方案:海外云手机
    Ardupilot — AP_OpticalFlow代码梳理
    掌握交易时机!
    Html5+CSS3:第一讲:H5基础
    String类
    PyCharm及python解释器详细安装教程
    添加.net core web Api 对XML数据格式的支持
    高德POI搜索:地点关键词搜索
  • 原文地址:https://blog.csdn.net/qq_46096136/article/details/126683548