java集合: ArrayList的底层机制和使用方法

引言

ArrayList是继承自List的类,是集合中的可变长度数组型存储容器,在开发中具有重要的作用

一、Arraylist是什么?

ArrayList 类是一个可以动态修改的数组,简单理解为与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。
以下为ArrayList继承的接口和类(此处不对这些接口和类做过多解释)
在这里插入图片描述

二、Arraylist的底层扩容机制(面向面试)

1.扩容机制

  • ArrayList中维护了一个Object类型的数组elementDate[] (可去idea看源码) object类型可以自定义其他包装类如Integer或自定义类TreeNode.
  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始化elementData[] 的容量为0,第一次添加数据,则扩容为10,如过添加到第11个元素,数组elementData扩容为1.5倍。依次类推,需要则扩1.5倍
  • 如果使用指定大小的构造器,则初始elementData容器为指定大小,如需要扩容则直接按目前指定的大小进行1.5倍扩容

2.扩容过程:3步骤

  • 先创建一个新的数组,数组大小为原来数组的1.5倍
  • 将原来数组通过底层的Arrays.copy()方法复制到新数组
  • 将新数组的地址给到指向原来数组的引用(也就是elementData,让elementDate指向新数组)

(源码过程如下,可通过在idea中 Ctrl+左键追踪方法 或 debug 追踪)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.注意事项

  • 垃圾回收机制自动处理旧数组
  • ArrayList没有Synchronized关键字,不是线程安全的(就是能够同时被多个线程操作同一个元素,就会出现一个元素被同时修改了三次,该取哪个的值呢),但效率也高
  • ArrayList适用于单线程(只被一个线程操作),就不会出现线程问题
  • ArrayList适用于查找较多的,不适合经常增删,因为底层是数组

三、使用步骤

1.ArrayList类引入

ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:

代码如下(示例):

import java.util.ArrayList; // 引入 ArrayList 类
 
ArrayList<E> objectName =new ArrayList<>();  // 初始化

E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
objectName: 对象名

2.添加元素

ArrayList 类提供了很多有用的方法,添加元素到 ArrayList 可以使用 add() 方法 。 添加并遍历元素如下

package Demo;
 
import java.util.ArrayList;
 
public class DemoArraylistEach {
    
    
    public static void main(String[] args) {
    
    
        ArrayList list = new ArrayList();
        list.add("老六");
        list.add("老六六");
        list.add("老六六六");
        System.out.println(list);
        for (int i = 0; i < list.size(); i++) {
    
    
            System.out.println(list.get(i));
        }
    }
}

输出结果为如下

[老六,老六六, 老六六六]
老六
老六六
老六六六

3.删除元素

如果要删除 ArrayList 中的元素可以使用 remove() 方法:

 import java.util.ArrayList;
     
    public class RunoobTest {
    
    
        public static void main(String[] args) {
    
    
            ArrayList<String> sites = new ArrayList<String>();
            sites.add("Google");
            sites.add("Runoob");
            sites.add("Taobao");
            sites.add("Weibo");
            sites.remove(3); // 删除第四个元素
            System.out.println(sites);
        }
    }

以上实例,执行输出结果为:

[Google, Runoob, Taobao]

4.计算大小

import java.util.ArrayList;
 
public class RunoobTest {
    
    
    public static void main(String[] args) {
    
    
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites.size());
    }
}

以上实例,执行输出结果为:

4

5.其他的引用类型

ArrayList 中的元素实际上是对象,在以上实例中,数组列表元素都是字符串 String 类型。

如果我们要存储其他类型,而 只能为引用数据类型,这时我们就需要使用到基本类型的包装类。

基本类型对应的包装类表如下:

此外,BigInteger、BigDecimal 用于高精度的运算,BigInteger 支持任意精度的整数,也是引用类型,但它们没有相对应的基本类型。

rrayList<Integer> li=new Arraylist<>();     // 存放整数元素
ArrayList<Character> li=new Arraylist<>();   // 存放字符元素

以下实例使用 ArrayList 存储数字(使用 Integer 类型):

import java.util.ArrayList;
 
public class RunoobTest {
    
    
    public static void main(String[] args) {
    
    
        ArrayList<Integer> myNumbers = new ArrayList<Integer>();
        myNumbers.add(10);
        myNumbers.add(15);
        myNumbers.add(20);
        myNumbers.add(25);
        for (int i : myNumbers) {
    
    
            System.out.println(i);
        }
    }
}

以下是输出结果

10
15
20
25

6.ArrayList 排序

Collections 类也是一个非常有用的类,位于 java.util 包中,提供的 sort() 方法可以对字符或数字列表进行排序。

以下实例对字母进行排序:

import java.util.ArrayList;
import java.util.Collections;  // 引入 Collections 类
 
public class RunoobTest {
    
    
    public static void main(String[] args) {
    
    
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Taobao");
        sites.add("Wiki");
        sites.add("Runoob");
        sites.add("Weibo");
        sites.add("Google");
        Collections.sort(sites);  // 字母排序
        for (String i : sites) {
    
    
            System.out.println(i);
        }
    }
}

执行结果

Google
Runoob
Taobao
Weibo
Wiki

以下实例对数字进行排序:

 import java.util.ArrayList;
    import java.util.Collections;  // 引入 Collections 类
     
    public class RunoobTest {
    
    
        public static void main(String[] args) {
    
    
            ArrayList<Integer> myNumbers = new ArrayList<Integer>();
            myNumbers.add(33);
            myNumbers.add(15);
            myNumbers.add(20);
            myNumbers.add(34);
            myNumbers.add(8);
            myNumbers.add(12);
     
            Collections.sort(myNumbers);  // 数字排序
     
            for (int i : myNumbers) {
    
    
                System.out.println(i);
            }
        }
    }

执行结果

8
12
15
20
33
34

7.ArrayList的遍历方法

在这里插入图片描述
注意:

  • 底层是有序的(即按添加的顺序取值)
 ArrayList<Integer> myNumbers = new ArrayList<Integer>();
            myNumbers.add(33);
            myNumbers.add(15);
            myNumbers.add(20);
            myNumbers.add(34);
            myNumbers.add(8);
            myNumbers.add(12);
       
        //如果有下一个hasNext()就继续
        while(iterator.hasNext()){
    
    
            Integer i = iterator.next();//next()就是返回值
        }
        //方法二:增强for
        for(Integer l1 : myNumbers){
    
    
            Integer i = l1;
        }
        //方法三:普通for
        for (int i = 0; i < myNumbers.size(); i++) {
    
    
            Integer integer = myNumbers.get(i);
        }


结果:

33
15
20
34
8
12

8.Java ArrayList 方法表格

Java ArrayList 常用方法列表如下:

在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/imbzz/article/details/128859195
今日推荐