Java ArrayList中存放引用数据类型的方式

 更新时间:2021年10月27日 08:45:37   作者:小白的学习笔记  
这篇文章主要介绍了Java ArrayList中存放引用数据类型的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

ArrayList中存放引用数据类型

ArrayList中存放引用类型时,存放的是一个引用,因此在放入ArrayList之后再进行改动会影响到ArrayList中的值

看下面一个例子

import java.util.ArrayList;
public class Student implements Cloneable{
    private int age;
    private String name;
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<Student>();
        Student st = new Student();
        st.age = 10;
        st.name = "marco";
        students.add(st);
        st.age = 20;    //修改age值
        System.out.println(students.get(0).age);    //输出为20
    }
}

同样,如果ArrayList中存放的也是ArrayList类型,如ArrayList<ArrayList<Integer>>,对里面ArrayList的修改同样会影响到外层的ArrayList,如果想不受到影响可以在放入ArrayList时进行clone操作,对于ArrayList来说可以使用new ArrayList<ArrayList<Integer>>(list)来进行复制。

Java 引用数据类型 ArrayList集合

引用数据类型(类)

分类

提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类、Random类。

我们可以把类的类型为两种:

  • 第一种,Java为我们提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供我们使用。
  • 第二种,我们自己创建的类,按照类的定义标准,可以在类中包含多个方法与属性,来供我们使用。

类的定义和使用

java代码映射成现实事物的过程就是定义类的过程。

我们就拿一部手机进行分析,它能用来做什么呢?它可以打电话,上网,聊微信等,这些就是手机所提供的功能,也就是方法;手机也有它的特征,如颜色、尺寸大小、品牌型号等,这些就是手机的特征,也就是属性。

目前,我们只关注类中的属性,类中的方法在面向对象部分再进行学习。

类的定义格式

创建java文件,与类名相同
public class 类名{
    数据类型  属性名称1;
    数据类型  属性名称2;
    …
}

例如:

public class Phone {
    /*
     * 属性
     */
    String brand;// 品牌型号
    String color;// 颜色
    double size; // 尺寸大小
}

类的使用方式

有如下步骤

  • 导包:我们将所有的类放到同一个文件夹下,可以避免导包。
  • 创建对象:数据类型 变量名 = new 数据类型();
  • 调用方法:目前我们定义的自定义类不涉及方法,只是属性(自定义类中的方法部分在面向对象部分讲解)
  • 访问属性:变量名.属性(这是当前的方式,后期会采取调用方法的方式替代掉直接访问的方式来完成对属性的访问。)

当有了Phone数据类型的变量后,我们就可以使用Phone类中的属性了。对属性的访问我们来演示一下,如下所示:

public class Test {
    public static void main(String[] args) {
        //定义了一个Phone类型的变量p
        Phone p = new Phone();
        /*
         * 通过p,使用Phone中的属性
         */
        //访问p中的brand品牌属性
     p.brand = "苹果6s";
    //访问p中的color颜色属性
        p.color = "白色";
       //访问p中的size尺寸大小属性
        p.size = 5.5;
        System.out.println("手机品牌为" + p.brand);
        System.out.println("手机颜色为" + p.color);
        System.out.println("手机尺寸大小为" + p.size);
    }
}

自定义类的内存图演示:

上述代码中,通过类Phone创建出来的变量p,它相当于我们生活中的盒子,里面包含了它能够使用的属性。

通过 p.属性名 就可以对属性进行操作

与引用类型数组类似,引用类型的自定义类型的变量,直接变量时,结果为对象地址值,这里可以通过内存图简单解释。

ArrayList 集合

ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类)。在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。

创建

导包:import java.util.ArrayList;

创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型:

ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();

l 集合中存储的元素,只能为<>括号中指定的数据类型元素;

l “<要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型;

下面给出8种基本数据类型所对应的引用数据类型表示形式:

基本数据类型

对应的引用数据类型表示形式

byte

Byte

short

Short

Int

Integer

long

Long

float

Float

double

Double

char

Character

boolean

Boolean

下面是一些创建arraylist的实例:

存储String类型的元素
ArrayList<String> list = new ArrayList<String>();
存储int类型的数据
ArrayList<Integer> list = new ArrayList<Integer>(); 
存储Phone类型的数据
ArrayList<Phone> list = new ArrayList<Phone>();

方法

返回值类型 方法和描述
boolean add(E e)
将指定的元素添加到集合中
void add(int index, E element)
在列表中指定的位置上插入指定的元素。
boolean addAll(Collection<? extends E> c)
追加指定集合的所有元素到这个列表的末尾,按他们的指定集合的迭代器返回。
boolean addAll(int index, Collection<? extends E> c)
将指定集合中的所有元素插入到该列表中,从指定位置开始。
void clear()
从这个集合中移除所有的元素。
Object clone()
返回该 ArrayList实例浅拷贝。
boolean contains(Object o)
返回 true如果这个列表包含指定元素。
void ensureCapacity(int minCapacity)
增加集合的容量,虽说arraylist本省就是可变的,但当你可以预先确定一定容量时,可以增加效率
E get(int index)
返回此列表中指定元素的位置
int indexOf(Object o)
返回此列表中指定元素的第一个出现的索引,或-如果此列表不包含元素,或- 1。
boolean isEmpty()
返回 true如果此列表不包含元素。
Iterator<E> iterator()
在这个列表中的元素上返回一个正确的顺序。
int lastIndexOf(Object o)
返回此列表中指定元素的最后一个发生的索引,或-如果此列表不包含元素,或- 1。
ListIterator<E> listIterator()
返回列表元素的列表迭代器(在适当的顺序)。
ListIterator<E> listIterator(int index)
在列表中的元素上返回列表迭代器(在适当的顺序),从列表中的指定位置开始。
E remove(int index)
移除此列表中指定位置的元素。
boolean remove(Object o)
从该列表中移除指定元素的第一个发生,如果它是存在的。
boolean removeAll(Collection<?> c)
从这个列表中移除包含在指定集合中的所有元素。
boolean removeIf(Predicate<? super E> filter)
删除满足给定谓词的这个集合的所有元素。
protected void removeRange(int fromIndex, int toIndex)
从列表中删除所有的元素的索引 fromIndex之间,包容性,和 toIndex,独家。
void replaceAll(UnaryOperator<E> operator)
用将运算符应用到该元素的结果替换此列表中的每个元素。
boolean retainAll(Collection<?> c)
仅保留包含在指定集合中的列表中的元素。
E set(int index, E element)
用指定元素替换此列表中指定位置的元素。
int size()
返回此列表中元素的数目。
void sort(Comparator<? super E> c)
分类列表使用提供的 Comparator比较元素。
Spliterator<E> spliterator()
创建一个后期绑定和快速失败 Spliterator超过此列表中的元素。
List<E> subList(int fromIndex, int toIndex)
返回一个视图之间的指定 fromIndex,包容,和 toIndex这份名单的部分,独家。
Object[] toArray()
返回一个数组,包含在这个列表中的所有元素在适当的顺序(从第一个到最后一个元素)。
<T> T[] toArray(T[] a)
返回一个数组,包含在这个列表中的所有元素在适当的顺序(从第一到最后一个元素);返回数组的运行时类型是指定的数组的运行时类型。
void trimToSize()
装饰这 ArrayList实例是列表的当前容量。

下面是一些实例:

import java.util.ArrayList;
public class ArrayListDemo01 {
    public static void main(String[] args) {
        // 创建ArrayList集合
        ArrayList<String> list = new ArrayList<String>();
        // 向集合中添加元素
        list.add("stu1");
        list.add("stu2");
        list.add("stu3");
        list.add("stu4");
        // 获取集合中元素的个数
        System.out.println("集合的长度:" + list.size());
        // 取出并打印指定位置的元素
        System.out.println("第1个元素是:" + list.get(0));
        System.out.println("第2个元素是:" + list.get(1));
        System.out.println("第3个元素是:" + list.get(2));
        System.out.println("第4个元素是:" + list.get(3));
    }
}

注意:ArrayList集合相当于是一个长度可变的数组,所以访问集合中的元素也是采用索引方式访问,第一个元素存储在索引0的位置,第二个元素存储在索引1的位置,依次类推

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Java操作符与其优先级

    浅谈Java操作符与其优先级

    这篇文章主要介绍了浅谈Java操作符与其优先级,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • Nebula Graph介绍和SpringBoot环境连接和查询操作

    Nebula Graph介绍和SpringBoot环境连接和查询操作

    Nebula Graph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载包含数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询,这篇文章主要介绍了Nebula Graph介绍和SpringBoot环境连接和查询,需要的朋友可以参考下
    2022-10-10
  • Java排序算法之冒泡排序的原理及优化

    Java排序算法之冒泡排序的原理及优化

    这篇文章主要介绍了Java排序算法之冒泡排序的原理及优化,冒泡排序的思想很简单,遍历数组,比较相邻的两个元素,顺序错误就把它们交换,直到整个数组排序完成,因为每经过一趟排序,越小的元素会经交换而慢慢“浮”到数列的顶端,因此叫做冒泡排序,需要的朋友可以参考下
    2023-11-11
  • Spring中的Aware接口详细解析

    Spring中的Aware接口详细解析

    这篇文章主要介绍了Spring中的Aware接口详细解析,Aware是一个具有标识作用的超级接口,具体实现是有子接口去决定的,但是子接口至少要有一个带一个参数的且返回是空的方法,需要的朋友可以参考下
    2023-12-12
  • mybatis取别名typeAliases标签的位置放错导致报错的解决

    mybatis取别名typeAliases标签的位置放错导致报错的解决

    这篇文章主要介绍了mybatis取别名typeAliases标签的位置放错导致报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java枚举学习之定义和基本特性详解

    Java枚举学习之定义和基本特性详解

    枚举是JAVA 5.0后增加的一个重要类型。可以用来表示一组取值范围固定的变量。本文将通过示例为大家详细讲解枚举的定义和基本特性,感兴趣的可以了解一下
    2022-08-08
  • Spring中的接口重试机制解析

    Spring中的接口重试机制解析

    这篇文章主要介绍了Spring中的接口重试机制解析,大家在做项目的时候,往往会遇到一些接口由于网络抖动等问题导致接口响应超时等,这时候我们会希望能够按照一定的规则进行接口请求重试,需要的朋友可以参考下
    2024-01-01
  • 归并排序时间复杂度过程推导详解

    归并排序时间复杂度过程推导详解

    这篇文章主要介绍了C语言实现排序算法之归并排序,对归并排序的原理及实现过程做了非常详细的解读,需要的朋友可以参考下,希望能帮助到你
    2021-08-08
  • Java C++实现相同MD5加密算法的方式

    Java C++实现相同MD5加密算法的方式

    这篇文章主要介绍了Java与C++实现相同MD5加密算法的方法,需要的朋友可以参考下面文章内容
    2021-09-09
  • Springboot设置统一的返回格式的方法步骤

    Springboot设置统一的返回格式的方法步骤

    在我们应用中我们通常与前端交互使用json格式,设置统一的返回json 格式是非常必要的,本文主要介绍了Springboot设置统一的返回格式的方法步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论