文章目录
一.数组的基本概念
1.数组介绍
数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。
可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。
即:数(数据)组(一组)就是一组数据
public static void main(String[] args) {
double[] hens = {1,2,3,4,5,6,};
double totalweight = 0;
for (int i = 0; i <hens.length ; i++) {
totalweight += hens[i];
}
}
// 1. double[] 表示 是 double 类型的数组, 数组名 hens
// 2. {1,2,3,4,5,6,}表示数组的值/元素,依次表示数组的第几个元素
// 3. 我们可以通过 hens[下标] 来访问数组的元素
// 4. 数组下标是从 0 开始编号的比如第一个元素就是 hens[0],第 2 个元素就是 hens[1] , 依次类推
// 5. 通过 for 就可以循环的访问 数组的元素/值
2.数组的创建和初始化
数组的定义:数据类型[ ] 数组名 = new 数据类型[大小]
例:int[ ] a = new int [5]; //创建了一个数组,名字为a,存放了5个int
数组的引用:数组名[下标/索引/index ]
数组的创建:两种动态分配方式
- double scores[] = new double[5];
- 先声明数组,再 new 分配空间
double scores[] ; //声明数组,这时 scores 是 null
scores = new double[5]; // 分配内存空间,可以存放数据
数组的初始化:
- 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
int[] a = {1,2,3,4};
- 动态初始化:在创建数组时,直接指定数组中元素的个数
int[] a = new int[4];
注意事项:
1. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
2. 数组创建后,如果没有赋值,有默认值 int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
3. 数组的下标是从 0 开始的。
4. 数组下标必须在指定范围内使用,否则报:下标越界异常。
5. 数组属引用类型,数组型数据是对象(object)
6. 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
3.遍历数组
int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}
//1.在数组中可以通过 数组对象.length 来获取数组的长度
//2.另一种for-each遍历数组
int[] array = {1, 2, 3};
for (int x : array) {
System.out.println(x);
}
4.数组赋值机制
null空引用
int[] arr = null;
System.out.println(arr[0]);
// 执行结果
//Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:6)
//null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用.
赋值机制
int[] arr1 = {1,2,3,};
int[] arr2 = arr1;
arr2[0] = 10;
二.一些方法
Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法. import
java.util.Arrays;
1.打印数组Arrays.toString()
使用Arrays中的的toString方法可以来打印数组中的数据
int[] intArray = { 1, 2, 3, 4, 5, 6, 7 };
System.out.println(Arrays.toString(intArray));
//打印结果:[1, 2, 3, 4, 5, 6, 7]
//这个方法是用来将数组转换成String类型输出的
//传入的参数可以是boolean,byte,char,double,float,int,long,Object,short类型的数组。
2.数组填充Arrays.fill()
使用Arrays中的的fill方法可以来填充数组数据
int[] arr = new int[5];//新建一个大小为5的数组
Arrays.fill(arr, 2,4,6);//给第2位(0开始)到第4位(不包括)赋值6
System.out.println(Arrays.toString(arr));
//1.方法参数是数组下标
//2.数组下标从0开始
//3.第二个参数指起始元素下标(包括该下标)
//4.第三个参数指结束下标(不包括该下标)
Arrays.fill(arr,4);//给所有值赋值4
System.out.println(Arrays.toString(arr));
打印结果:[0, 0, 6, 6, 0]
[4, 4, 4, 4, 4]
3. 比较数组元素是否相等Arrays.equals()
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
System.out.println(Arrays.equals(arr1,arr2));
打印结果:true
//如果是arr1.equals(arr2),则返回false,因为equals比较的是两个对象的地址,不是里面的数,而Arrays.equals重写了equals,所以,这里能比较元素是否相等。
4. 数组拷贝
copyOf方法完成数组的拷贝
int[] arr = {10,20,30,40,50};
int[] newArr = Arrays.copyOf(arr, 3);
System.out.println("newArr: " + Arrays.toString(newArr));
//输出:[10, 20, 30] (截取arr数组的3个元素赋值给新数组arr1)
newArr = Arrays.copyOf(arr, arr.length);
System.out.println("newArr: " + Arrays.toString(newArr));
//输出:[10, 20, 30, 40, 50]
1.arr和newArr引用的不是同一个数组
2.copyOf方法在进行数组拷贝时,创建了一个新的数组
copyOfRange拷贝数组某个范围
int []arr = {10,20,30,40,50};
int []newArr = Arrays.copyOfRange(arr,1,3);
System.out.print(Arrays.toString(newArr));
//输出:[20, 30] (从第1位(0开始)截取到第3位(不包括))
int[] array = {1,2,3,4,5};
int[] copy = array.clone();//clone():产生对象的一个副本
System.out.println(Arrays.toString(array));
System.out.println("=====================");
System.out.println(Arrays.toString(copy));
打印结果:
[1, 2, 3, 4, 5]
=====================
[1, 2, 3, 4, 5]
int[] array = {1,2,3,4,5};
int[] copy = new int[array.length];
/**
* 1、是你要拷贝的数组
* 2、你要从这个数组的哪个下标开始拷贝
* 3、你要拷贝到哪个数组
* 4、你要拷贝到这个数组的哪个位置开始
* 5、你要拷贝多大
*/
System.arraycopy(array,0,copy,0,array.length);
System.out.println(Arrays.toString(array));
System.out.println("=====================");
System.out.println(Arrays.toString(copy));
5.数组排序Array.sort()
1.数字排序
int[] intArray = new int[] { 4, 1, 3, -23 };
Arrays.sort(intArray);
//输出: [-23, 1, 3, 4]
2.字符串排序,先大写后小写
String[] strArray = new String[] { “z”, “a”, “C” };
Arrays.sort(strArray);
//输出: [C, a, z]
6.二分查找法找指定元素的索引值Arrays.binarySearch()
查找有序数组
int[] arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 30));
//输出:2 (下标索引值从0开始)
int[] arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 36));
//输出:-4 (找不到元素,返回-x,从-1开始数,如题,返回-4)
int []arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 0,3,30));
//输出:2 (从0到3位(不包括)找30,找到了,在第2位,返回2)
int []arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 0,3,40));
//输出:-4 (从0到3位(不包括)找40,找不到,从-1开始数,返回-4)