Java深入数组
1、数组概念
数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。
2、数组的初始化
Java语言中数组必须先初始化才能使用,所谓初始化就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值。一旦数组的初始化完成,数组在内存中所占用的空间将被固定下来,即数组的长度不可改变。
2.1、动态初始化
指定数组的长度:
int size = 10;
type[] arrayName = new type[size]; //推荐使用这一种,可读性较好
arrayName type[] = new type[size];
2.2、静态初始化
指定数组的内容:
int[] arr = new int[]{1,2,3,4,5};
int[] arr = {1,2,3,4,5};
注意:不要同时使用静态初始化与动态初始化,即不要在数组初始化时既指定数组长度又给每个数组元素分配初始值。
2.3、初始化填充数组
int[] arrName = new int[5];
Arrays.fill(arrName, 1); // [1, 1, 1, 1, 1]
2.4、数组元素各类型初始值
基本类型中的整数类型(byte,short,int,long):0
基本类型中的浮点类型(float,double):0.0
基本类型中的字符类型(char):‘\u0000’
基本类型中的布尔类型(boolean):false
引用类型(类,接口,数组):null
3、数组的使用
数组最常用的方法就是访问数组元素:
arrayName[index]; //数组的索引从0开始
ayyayName[0] = 10; //为0位置赋值10
int len = arrayName.length; //获取数组的长度
int len2 = arrayName[0].length; //获取二维数组第一维的第一个数组长度
4、数组的foreach循环
Java5之后可以进行foreach循环遍历数组和集合;
String[] names = {"Fe","Tom","Hxy","Ajax"}
for(String name : names){
System.out.println(name);
}
/*
output : Fe
Tom
Hxy
Ajax
*/
当使用foreach循环迭代访问数组时,foreach中的循环变量相当于一个临时变量,系统会把数组元素依次赋值给这个临时变量,而这个临时变量并不是数组元素,它只是保存了数组元素的值。
所以如果想改变数组的元素值,则不能使用foreach循环。
String[] names = {"Fe","Tom","Hxy","Ajax"}
for(String name : names){
name = Fee;
System.out.println(name);
}
System.out.println(names[0]);
/*
output : Fee
Fee
Fee
Fee
Fe
*/
5、内存中的数组
数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里时分开存放的。
public static void main(String[] args) {
int[] a = {25,4,45,21,7};
int[] b = new int[3];
System.out.println(a); //输出的是数组在内存中的地址
System.out.println(a[2]); //0
}
程序的执行流程:
- main方法进入方法栈执行
- 创建数组,JVM会在堆内存中开辟空间,存储数组
- 数组在内存中会有自己的内存地址,以十六进制数表示
- 对于b,数组中有个元素,默认值为0
- JVM将数组的内存地址赋值给引用类型变量b
- 变量b保存的是数组内存中的地址,而不是一个具体数值,因此称为引用数据类型。
//让b的引用指向a引用指向的数组
b = a;
6、Java8工具类Arrays
Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组,这个Arrays类里包含了如下几个static修饰的方法(static修饰的方法可以直接通过类名调用)。
type[] copyOf(type[] original, int length);
//这个方法将会把 original数组复制成一个新数组,其中,length是新数组的长度。
//如果length大于original数组的长度,则新数组的前面元素就是原数组的所有元素,后面补充0(数值类型)、false(布尔类型)或者null(引用类型)。
type[] copyOfRange(type[] original, int from, int to);
//这个方法与前面方法相似,但这个方法只复制original数组的from索引到to索引的元素。
boolean equals(type[]a, type[]a2);
//如果a数组和a2数组的长度相等,而且a数组和a2数组的数组元素也一一相同,该方法将返回true。
void fill(type[]a, type val);
//该方法将会把a数组的所有元素都赋值为val。
void fill(type[] a, int fromIndex, int toIndex, type val);
//该方法与前一个方法的作用相同,区别只是该方法仅仅将a数组的fromIndex到 toIndex索引的数组元素赋值为 val。
void sort(type[] a);
//该方法对a数组的数组元素进行排序。
void sort(type[] a,int fromIndex,int toIndex);
//该方法与前一个方法相似,区别是该方法仅仅对fromIndex到toIndex索引的元素进行排序。
String toString(type[] a);
//该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号(,)和空格隔开。
XxxStream stream(xxx[] array);
//该方法将数组转换为Stream,Stream是Java8新增的流式编程的API。
XxxStream stream(xxx[]array, int startInclusive, int endExclusive);
//该方法与上一个方法相似区别是该方法仅将fromIndex到toIndex索引的元素转换为Stream。