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的位置,依次类推
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。