Java中的数组
当我们在使用一组数据的时候,如果一个一个的去定义,会非常的麻烦,效率非常低,这个时候我们可以直接定义一个数组把这组数据放进去,如果需要使用这一整组数据,我们直接遍历这个数组就可以了,如果使用的是单独的一个数据,我们就直接输出这个数据对应的数组下标即可。下面我们就来认识一下数组:
一 、数组的概念
存放有限个相同数据类型的变量的集合,我们把它叫作数组。数组的内存是连续的。所以需要开辟连续的内存空间。数组的长度就等于数组当中元素的个数。Java中的数组是在堆上分配内存,不是栈上。
二、数组的定义
数组有三种定义方式,从本质上来说这三种方式没有什么区别。不过需要注意的是第三个是没有赋值的,要赋值的话也是一个一个的赋值。比较麻烦,所以我们一般用的都是第一个或者第二个。
int[] arr = {1,2,3,4};
int[] arr = new int [] {1,2,3,4};
int[] arr = new int [4] //此时数组里面放的是四个0,数组没有初始化里面默认就是0
*注:
①:new:实例化一个对象,此时的对象就是数组。
②:arr是一个数组的名字,是一个变量名,它是引用类型,是在栈上开辟内存。当我们输出它的时候输出的是后面数组对应的堆上的地址,并且这个地址也是经过哈希处理了的,并不是真实的地址。
③:arr是一个引用类型的变量,它指向了后面的这个数组对象,也可以说成它引用了这个数组对象,我们可以通过操纵arr来操作这个数组对象,此时arr的值就是这个数组对象在堆上的地址。*
三、如何求一个数组的长度
public class TestDemo34 {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
int len = arr.length;
System.out.println(len);
}
}
这里我们可以调用数组属性,来计算数组长度。
四、如何打印数组
数组的打印方式一共有三种:
public class TestDemo34 {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
注:
①:数组的下标是从0开始的,利用for循环从0下标对应的元素1开始打印。直到遍历完。
②如果i大于了数组的长度,会抛出异常,称为数组越界。
public class TestDemo34 {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
for (int val : arr) {
System.out.println(val + " ");
}
}
}
注:冒号左边是数组当中元素的类型+val,右边是数组的名字
import java.util.*;
public class TestDemo34 {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
System.out.println(Arrays.toString(arr));
}
}
注:这种方式是将数组以字符串的形式打印出来。Arrays叫作操作数组的工具类,可以提供很多方法供我们操纵数组。需要导入import java.util.Arrays这个包。
五、数组作为参数的传递
Java当中数组可以作为参数进行传递
public class TestDemo34 {
public static void print(int array[]) {
for (int val : array) {
System.out.println(val);
}
}
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
print(arr);
}
}
这里我们可以写一个方法来将数组作为参数传递到方法当中打印。
通过数组交换两个数字:
public class TestDemo34 {
public static void swap(int[] array){
int tmp = array[0];
array[0]=array[1];
array[1]=tmp;
}
public static void main(String[] args) {
int[] arr = new int[]{10, 20};
swap(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
}
}
arr在栈上有一块空间,它是一个引用类型,指向的是后面这个数组,所以保存了10和20的地址,调用函数的时候arr的值拷贝给了array,所以array得到了10和20的地址,所以可以在方法中利用tmp进行交换
六:null
int[] arr = null;
代表空引用,此时arr不引用任何对象,也可以称为arr引用的空对象,跟地址没有任何的牵扯。
七、数组作为方法的返回值
示例:将数组中的元素扩大三倍:
import java.util.Arrays;
public class TestDemo34 {
public static int[] swap(int[] array) {
int[] tmp = new int [array.length];
for (int i = 0; i < array.length; i++) {
tmp[i] = array[i] * 3;
}
return tmp;
}
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 4, 20};
//int[]array = swap(arr);
System.out.println(Arrays.toString(swap(arr)));
}
}
八、工具类Arrays的用法:
- 将一个数组排序:
import java.util.Arrays;
public class TestDemo34 {
public static void swap(int[] array) {
//int[] tmp = new int [array.length];
Arrays.sort(array);
}
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3,18,4,5, 20};
swap(arr);
System.out.println(Arrays.toString(arr));
}
}
- 查找数组当中的指定元素
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3,18,4,5, 20};
int a = Arrays.binarySearch(arr,2,5,18);//在2号位置和5号位置之间找18对应的下标
System.out.println( a);
}
}
注:Java当中遇到的fromlndex,tolndex,一般都是左闭右开的。
将数组中的元素拷贝到新的数组中
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 18, 4, 5, 20};
int[] ret = Arrays.copyOfRange(arr, 2, 6);//将2号位置和6号位置之间的数组拷贝到新数组当中。
System.out.println(Arrays.toString(ret));
}
}
注:同样也是左闭右开。
数组填充
public static void main(String[] args) {
int[] arr = {1, 2, 5, 8, 13, 27, 58};
Arrays.fill(arr, 2,5,3);//将2号位置和5号位置之间填充为3
System.out.println(Arrays.toString(arr));
}
}