目录
一、一维数组
数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致。
1.数组的定义
方式一:
数据类型[] 数组名 = new 数据类型[长度];
public class Test_array {
public static void main(String[] args) {
//1.定义数据类型为int的数组
int[] arr = new int[3];//定义了一个有3个数据的int数组
//动态初始化
arr[0] = 1;
arr[1] = 5;
arr[2] = 9;
System.out.println(arr[0]);//0
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr.length);//3,arr数组的长度
}
}
方式二:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};
public class Test_array {
public static void main(String[] args) {
String[] arr1 = new String[]{"你好","我好","大家好","你真漂亮"};
System.out.println("arr1的长度是:"+arr1.length);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
}
}
方式三:
数据类型[] 数组名 = {元素1,元素2,元素3…};
public class Test_array {
public static void main(String[] args) {
char[] arr2 = {'a','b','中','国'};
System.out.println("arr2的长度是:"+arr2.length);
arr2[0] = '人';
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
}
}
2.数组遍历
1)普通的for循环
public class Test_array {
public static void main(String[] args) {
double[] arr = {1.0,1.2,2.5,3.2};
for(int i=0;i<arr.length;i++){
arr[i] += 1.0;
System.out.println(arr[i]);
}
System.out.println("************倒着输出");
for(int i=arr.length-1;i>=0;i--){
System.out.println(arr[i]);
}
}
}
2)增强for循环
public class Test_array {
public static void main(String[] args) {
double[] arr = {1.0,1.2,2.5,3.2};
//for(数据类型 变量名:要遍历的对象) 这里的变量名不再是索引,而是数组的直接的内容
for(double i:arr){
i += 1.0;
System.out.println(i);
}
}
}
3.数组常见异常
1)空指针异常
public class Test_array_exception {
public static void main(String[] args) {
int[] arr = new int[4];
arr = null;
System.out.println(arr[0]);//1.java.lang.NullPointerException
}
}
2)数组长度为负数
public class Test_array_exception {
public static void main(String[] args) {
int[] arr = new int[4];
arr = new int[-1];//java.lang.NegativeArraySizeException
}
}
3)数组越界异常
public class Test_array_exception {
public static void main(String[] args) {
int[] arr = new int[4];
System.out.println(arr[4]);//java.lang.ArrayIndexOutOfBoundsException
}
}
4.数组作为方法参数和返回值
定义一个可以把数组正序打印的的方法(返回值类型 int[] or void,是否需要参数int[] arr)
顺序输出:
public static void print(int[] arr) {
for(int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
}
倒序输出:
public static int[] dprint(int[] arr) {
for(int i=arr.length-1; i>=0; i--) {
System.out.println(arr[i]);
}
return arr;
}
二、二维数组
二维数组:数组中的数据又是一个数组
1.二维数组的定义
方式一:
数据类型[][] 二维数组名 = new 数据类型[一维长度][二维长度];
public class Array {
public static void main(String[] args) {
//动态定义1
int[][] arr = new int[2][3];
//赋值
arr[0][0] = 1;
arr[0][1] = 2;
arr[1][0] = 3;
arr[1][2] = 4;
System.out.println(arr[0][0]);
System.out.println(arr[0][1]);
System.out.println(arr[1][0]);
System.out.println(arr[1][1]);//默认值
}
}
方式二:
数据类型[][] 二维数组名 = new 数据类型[一维长度] [];
注意:
一维必须给值
二维长度可以定义
public class Array {
public static void main(String[] args) {
//动态初始化2
char[][] arr1 = new char[3][];
arr1[0] = new char[1];
arr1[1] = new char[2];
arr1[2] = new char[]{'z','s'};
}
}
方式三:
数据类型[][] 二维数组名 = new 数据类型[][]{{1,2,3},{5,4,6}…};
public class Array {
public static void main(String[] args) {
//静态初始化1
double[][] arr2 = new double[][]{{1.1,2.2},{0.5,3.6}};
System.out.println(arr2[1][0]);
}
}
方式四:
数据类型[][] 二维数组名 = {{1,2,3},{5,4,6}…};
public class Array {
public static void main(String[] args) {
//静态初始化2
String[][] arr3 = {{"好好","学习"},{"理想","科学家"}};
System.out.println(arr3[0][1]);
}
}
2.二维数组的遍历
双重循环(普通for,增强for) 随意嵌套使用
public class Array {
public static void main(String[] args) {
int[][] arr = {{1,2,3},{7,5},{9}};
System.out.println("普通for里面嵌套增强for");
for(int i=0;i<arr.length;i++){//i表示外层数组的索引
//增强for循环,确定需要遍历的对象,遍历对象里数据的类型
for(int j:arr[i]){//增强for循环中,j代表的是内层数组中的数据
System.out.println(j);
}
}
System.out.println("增强for里面嵌套增强for");
for(int[] a:arr){
for(int i:a){
System.out.println(i);
}
}
}
}
三、Arrays类
操作数组的一个工具类,封装了很多常用来操作数组的方法
1.toString()方法
把数组中的内容用字符串的形式返回。
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = new int[]{2,3,1,6,5,8};
//toString() 把数组中的内容用字符串的形式返回,
System.out.println(arr);//[I@15db9742 (对象,后面的是当前对象所在内存的地址)
System.out.println(Arrays.toString(arr));//[2, 3, 1, 6, 5, 8]
}
}
2.equals()方法
比较两个数组的内容是否相等。
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = new int[]{2,3,1,6,5,8};
int[] arr1 = new int[]{2,3,1,6,5,8};
//equals() 比较两个数组的内容是否相等
System.out.println(arr==arr1);//false (比较的是地址,自然不相同)
System.out.println(Arrays.equals(arr, arr1));//true,这里比较的是内容
}
}
3.针对多维数组使用
public class ArraysDemo {
public static void main(String[] args) {
double[][] arr3 = {{1.5,2.5,3.4},{3}};
double[][] arr4 = {{1.5,2.5,3.4},{3}};
/*
* 针对多维数组使用
* deepEquals()
* deepToString()
*/
System.out.println(Arrays.toString(arr3));//I@15db9742
System.out.println(Arrays.deepToString(arr3));
System.out.println(Arrays.deepEquals(arr3, arr4));//true
}
}
4.fill方法
public class ArraysDemo {
public static void main(String[] args) {
int[] arr = new int[]{2,3,1,6,5,8};
/*
* static void fill(int[],int val)
* 将指定的int值分配给指定的int型数组的每个元素
*
* static void fill(int[],int fromIndex,int toIndex,int val)
* 将指定的值分配到指定的数组的指定范围(前闭后开)
*/
Arrays.fill(arr, -1);
System.out.println(Arrays.toString(arr));
Arrays.fill(arr, 1,3,100);
System.out.println(Arrays.toString(arr));
}
}
5.sort排序
public class ArraysDemo {
public static void main(String[] args) {
int[] arr1 = new int[]{2,3,1,6,5,8};
/*
* static void sort(int[] a)
* 对指定的数组进行排序(数字的升序)
*/
Arrays.sort(arr1);//排序了
System.out.println(Arrays.toString(arr1));
}
}
6.二分查找法
public class ArraysDemo {
public static void main(String[] args) {
int[] arr1 = new int[]{2,3,1,6,5,8};
int[] arr5 = new int[]{2,3,1,6,5,8};
/*
* 二分查找法
* binarySearch(int[] arr,int value)
* 使用二分查找法,首先需要保证数组是有序的。
*/
//如果值为负数,代表没有找到这个指定数。返回的数字是-(应该在数组中的索引+1)
System.out.println(Arrays.binarySearch(arr1, 3));
System.out.println(Arrays.binarySearch(arr5, 9));
}
}
7.数组拷贝
1.Arrays. copyOf(源数组,长度)
public class ArrayTest01 {
public static void main(String[] args) {
int[] arr = {1,5,3,8,2,10,16,14,19};
//从arr数组中复制前3个元素到arr2数组中
//重新又开辟了一个数组
int[] arr2 = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(arr2));
}
}
2.System.arraycopy(源数组,源起始索引,目标数组,目标起始索引,长度)
/**
* src - 源数组。
* srcPos - 源数组中的起始位置。
* dest - 目标数组。
* destPos - 目标地数据中的起始位置。
* length - 要复制的数组元素的数量。
*/
int[] arr3 = new int[3];
System.arraycopy(arr,5,arr3,0,3);
System.out.println(Arrays.toString(arr2));