Java的数组与集合
数组
1.数组的概念
数组是一种
容器
,可以用来存储
同种数据类型
的多个值。既可以存储基本数据类型,也可以存储引用数据类型(对象)。
2.数组的定义
数组的定义有以下两种:
- 格式一:数据类型[] 数组名 (例如:int[] array)
- 格式二:数据类型 数组名[] (例如:int array[])
3.数组的初始化
数组初始化:在内存中,为数组容器开辟空间,并将数据存入容器中的过程。
数组静态初始化
静态初始化:初始化时由程序员显示指定每个数组元素的初始值,然后由JVM(java虚拟机)决定数组的长度
完整格式:
数据类型[] 数组名=new 数据类型[]{元素1,元素2,元素3…}
简化格式:
数据类型[] 数组名={元素1,元素2,元素3…}
数组动态初始化
动态初始化:初始化时候只指定数组长度,由JVM(java虚拟机)为数组分配初始值。
格式:
数据类型[] 数组名=new 数据类型[数组长度]
(例如:int[] arr=new int[3])
在创建的时候,由我们自己指定数组的长度,由虚拟机给出默认的初始化值
数组默认初始化值
● 整数类型:默认初始化值为 0
● 小数类型:默认初始化值为 0.0
● 字符类型:默认初始化值为 ‘\u0000’ (空格)
● 布尔类型:默认初始化值为 false
● 引用数据类型:默认初始化值为 null
4.数组元素访问
数组的长度:
- 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度
-
使用
数组名.length
获取数组的长度
索引
- 是数组中数据的编号方式
-
特征:索引是从
0
开始,是连续,逐一增加的,直到
数组长度-1
为止 - 作用:用于访问数组中的数据,并方便使用
格式:
数组名[索引]
(例如:array[0]就是获取数组中第一个元素)
扩展:数组索引越界问题
当访问数组元素索引并不存在,将会发生异常:
java.lang.ArrayIndexOutOfBoundsException
5.数组的遍历
数组遍历:将数组中所有的内容取出来,并进行一些操作(例如:打印,求和,判断…)
数组的遍历有三种方式:
-
for循环遍历:
//遍历数组通常使用for循环来进行遍历。如果是要遍历二维数组需要使用双层for循环 public class Test { public static void main(String[] args) { int[] array={1,2,3,4,5}; for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } }
-
foreach循环遍历:
//foreach循环,这种循环遍历数组和集合更加简洁。 //无须获得数组和集合长度,无须根据索(下标)引来访问数组元素,foreach循环自动遍历数组和集合的每一个元素。 public class Test { public static void main(String[] args) { int[] array={1,2,3,4,5}; for (int i : array) { System.out.println(i); } } }
-
Arrays工具类中toString方法遍历:
//利用Arrays工具类中的toString静态方法可以将一维数组转化为字符串形式并输出 public class Test { public static void main(String[] args) { int[] array={1,2,3,4,5}; System.out.println(Arrays.toString(array)); }
6.数组的内存图
JVM的内存图
区域名称 | 作用 |
---|---|
栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行 |
堆 | 存储对象或者数组,new来创建的,都存储在堆内存中 |
方法区 | 存储可以运行的class文件 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关 |
寄存器 | 给cpu使用,和我们开发无关 |
数组的内存图
因为数组是引用数据类型,是通过new关键字创建出来的,所以存放在堆空间中。而变量名保存的是
数组在堆内存中的地址值
。
通过代码:
public class Test {
public static void main(String[] args) {
int[] arr=new int[3];
System.out.println(arr);
}
}
发现打印结果为
[I@1b6d3586
,这就是数组在内存中的地址值。
由此可知,多个数组初始化,则会在堆中开辟多个不同的空间,每个空间都有各自的数据,互不冲突。
扩展
两个数组指向同一个空间时,其中一个数组对空间中的值发生改变,那么其他数组再次访问的时候都是修改之后的结果。因为它们的地址值都是一样的,数据是共享的。
int[] array={1,2,3,4,5};
int[] array2=array; //代表将array的地址值赋值给了array2
集合
1.集合与数组的比较
数组和集合都是Java中的容器,但是它们之间还是有很多不同点的。
-
长度:
- 数组的长度是固定的
- 集合长度是可以改变的
-
存储类型
- 数组存放的类型是同种数据类型,可以存放基本数据类型和引用数据类型。
-
集合存放的类型可以是多种的,可以存放引用数据类型,不可以存放基本数据类型,但是可以存放基本数据类型的
包装类
。
基本数据类型的包装类
除了,char(Character)和int(Integer),其他都是把原来的首字母大写
2.集合中的成员方法
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素,返回值表示是否添加成功 |
boolean remove(E e) | 删除指定元素,返回值表示是否删除成功 |
E remove(int index) | 删除指定索引的元素,返回被删除元素 |
E set(int index,E e) | 修改指定索引下的元素,返回原来的元素 |
E get(int index) | 获取指定索引的元素 |
int size() | 集合的长度,也就是集合中元素的个数 |