java 数组是一组连续的存储空间,存储多个相同数据类型的值,特点是类型相同、长度固定。
有待确定的地方,因为 OC 里 NSMutableArray 可变数组对象是可以存储不同数据类型,并且长度也不用在定义时固定,我想 java 应该有相同功能的对象,但我还没学到,所以这篇文章都是按目前的概念来写。
数组的4要素: 数组名称、数组元素、元素类型、元素下标。
数组的4种初始化方法,前两种常用。
// 1
int[] data1 = new int[5];
// 2
int[] data2 = {1, 2, 3, 4, 5};
//3
int[] data3;
data3 = new int[5];
// 4
int[] data4 = new int[] {1, 2, 3, 4, 5};
各种类型的数组元素默认值。
// 没有默认值
int a;
// 0
int b[] = new int[5];
// 0.0
double[] c = new double[5];
// false
boolean[] d = new boolean[5];
// 空字符
char[] e = new char[5];
// 默认值为 null
String[] f = new String[5];
String g = null;
// 使用 . 语法时会报空指针的错误
// g.equals("dd");
数组的两种扩容方法。
import java.util.Arrays;
// 数组扩容
public class test4 {
public static void main(String[] args) {
int[] data = {1,2,3,4,5};
int[] newArr = new int[data.length * 2];
/**
* 1
* System.arraycopy(src, srcPos, dest, destPos, length); 无返回值
* Object src 源数组
* int srcPos 从源数组的下标开始复制
* Object dest 目标数组
* int destPos 从目标数组下标接受值
* int length 从源数组的srcPos开始接收多少长度的数据,注意源数组的srcPos + length 不能大于 src.length,否则数组越界报错
*/
System.arraycopy(data, 0, newArr, 0, data.length);
/**
* 2
* Arrays.copyOf(original, newLength); 返回一个新数组
* Object original 源数组
* int newLength 新数组长度
*/
int[] newArr2 = Arrays.copyOf(data, 20);
for (int i = 0;i < newArr2.length; i ++) {
System.out.println(newArr2[i]);
}
}
}
基本数据类型和引用数据类型的传递参数。
package com.qf;
public class test5 {
public static void main(String[] args) {
int sum = 10;
int[] arr = {10,11,12};
String str = "在吗?";
method1(sum); // 10
method2(arr); // 100
method3(str); // 在吗?
System.out.println(sum);
System.out.println(arr[0]);
System.out.println(str);
}
public static void method1(int sum) {
sum = sum + 1;
}
public static void method2(int[] arr) {
arr[0] = 100;
}
public static void method3(String str) {
str = str + "增加";
}
}
基本数据类型是值传递,在函数内部改变后,不会改变函数外面的变量值;基本数据类型以外都是引用数据类型,引用数据类型(String 除外)的传递是内存地址的传递,在函数内改变存储变量的值会改变函数外的变量值。但代码里可以看到,String 也是引用数据类型,并没有改变函数外 String 的值,因为 String 是特例,打印数组的时候,打印的内存地址,打印 String 的时候,跟基本数据类型一样,打印的是值,所以 String 也是值传递。
java 内存分配默认为机器内存的 1/8,基本数据类型存储在栈区,引用数据类型的元素存储在堆区。数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中,实际的数组元素被存储在一组连续的堆(heap)内存空间中。