1.数组动态初始化(声明并开辟数组)
数据类型 [ ] 数组名称 = new 数据类型 [ 长度 ]
eg:声明并开辟一个长度为5的整形数组
int [ ] data = new int [5];
当数组开辟之后,可采用如下方式进行操作:
a.数组通过下标来取得元素,下标默认从0开始。数组下标超出数组长度,数组越界异常(运行时异常)。
b.数组中每个元素都有默认值,默认值是该数据类型默认值。
c.数组名称.length:取得数组长度。
d.数组遍历推荐使用for-each循环(仅限于数组的内容读取),要修改数组内容,还是使用常规for循环
for( int x : data ){……}
注意:数组属于引用数据类型,必须在使用前先初始化。否则会NullPointerException(空指针异常),属于运行时异常。
2.数组静态初始化
在数组定义时直接设置内容,根据值的个数确定数组长度,并且长度不可修改。
简化格式:
数据类型[ ] 数组名称 = {值,值......}
完整格式(推荐):
数据类型[ ] 数组名称 = new 数据类型[ ] {值,值......}
eg:int [ ] data = new int [ ] {1,3,5,7,9,10};
public class Test{ public static void main(String[] args){ //数组的动态初始化 int[] data1 = new int[3]; data1[0] = 1; data1[1] = 2; data1[2] = 3; for(int x:data1) { System.out.print(x+"、"); } System.out.println(); //数组的静态初始化 int[] data2 = {11,22,33,44}; for(int x:data2) { System.out.print(x+"、"); } } }二维数组:
二维数组只要了解即可,在这里不做阐述。
数组作为引用数据类型,也一定可以发生引用传递。
观察一个简单的程序:
public class Test{ public static void main(String[] args){ //数组的动态初始化 int[] data = null; data = new int[3]; data[0] = 1; data[1] = 2; data[2] = 3; for(int x:data) { System.out.print(x+"、"); } } }引用传递:同一块堆内存空间同时可以被不同的占内存指向。
public class Test{ public static void main(String[] args){ int[] data = null; int[] tmp = null;//声明对象 data = new int[3]; data[0] = 1; data[1] = 2; data[2] = 3; for(int x:data) { System.out.print(x+"、"); } System.out.println(); tmp = data;//如果要发生引用传递,不要出现[] tmp[0] = 10; for(int x:tmp) { System.out.print(x+"、"); } } }引用传递的内存分析都是类似的:同一块堆内存被不同的栈内存所指向。
数组是引用数据类型,所有引用数据类型都可以为其设置多个栈内存指向。所以在数组操作的时候,可以将其通过方法进行处理。
方法接收数组:
public class Test{ public static void main(String[] args){ int[] data = new int[]{1,2,3,4}; printArray(data);//其效果等价于int[] tmp = data; } public static void printArray(int[] tmp){ for(int x:tmp) { System.out.println(x); } } }方法返回数组:
public class Test{ public static void main(String[] args){ int[] data = init(); printArray(data);//其效果等价于int[] tmp = data; } public static int[] init(){ return new int[]{1,2,3,4};//匿名数组 } public static void printArray(int[] tmp){ for(int x:tmp) { System.out.println(x); } } }方法修改数组:
public class Test{ public static void main(String[] args){ int[] data = init(); changeArray(data); printArray(data);//其效果等价于int[] tmp = data; } public static int[] init(){ return new int[]{1,2,3,4};//匿名数组 } //将数组中的值扩大两倍 public static void changeArray(int[] arr){ for(int i = 0; i < arr.length; i++) { arr[i] = arr[i]*2; } } public static void printArray(int[] tmp){ for(int x:tmp) { System.out.println(x); } } }1.排序---java.util.Arrays.sort(数组名称);
支持所有基本数据类型数组
内部使用双轴快速排序
public class Test{ public static void main(String[] args){ int[] data = new int[]{1,99,34,76,55}; char[] arr = new char[]{'d','a','w','y'}; java.util.Arrays.sort(data); java.util.Arrays.sort(arr); printArray(data); printArray(arr); } public static void printArray(int[] tmp) { for(int x:tmp) { System.out.print(x+"、"); } System.out.println(); } //重载 public static void printArray(char[] tmp) { for(int i = 0; i < tmp.length; i++) { System.out.print(tmp[i]+"、"); } } }2.数组部分拷贝
System.arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,拷贝长度);
注意:目标数组的选取
例:数组arr1:1,2,3,4,5,6 数组arr2:11,22,33,44,55 结果数组:1,2,33,44,55,6
public class Test{ public static void main(String[] args){ int[] arr1 = new int[]{1,2,3,4,5,6}; int[] arr2 = new int[]{11,22,33,44,55}; System.arraycopy(arr2, 2, arr1, 2, 3); for(int x:arr1) { System.out.print(x+"、"); } } }3.数组全拷贝
Java动态数组动态扩容方法
java.util.Arrays.copyOf(源数组名称,新数组长度);
public class Test{ public static void main(String[] args){ int[] arr1 = new int[]{1,2,3,4,5,6}; int[] arr2 = new int[3]; arr2 = java.util.Arrays.copyOf(arr1, 3); for(int x:arr2) { System.out.print(x+"、"); } } }