Java数组及常用方法

数组的描述

  在数组中每个元素都具有相同的数据类型,是有序数据的集合。通俗的说数组就相当于一个容器。数组分为一维数组、二维数组和多维数组。

数组的特点:

  • 数组类型是从抽象基类 Array 派生的引用类型。
  • 数值数组元素的默认值为 0,而引用元素的默认值为 null。
  • 数组中存放元素的类型必须与创建数组时声明的类型相一致。
  • 数组的类型可以是任意数据类型,包括基本数据类型和引用数据类型,如String[]、int[] …
  • 数组的索引是从0开始的,如果数组有n个元素,那么它的最大索引为n-1,(数组索引的取值范围[0,n-1])。

数组的创建及赋值

一维数组的创建及赋值

一维数组内存格式(如下图):

一维数组内存格式

动态创建一维数组(如下):
/* 数据类型 数组名[];
 * 数组名 = new 数组类型[数组长度];
 */
String str[];
str = new String[10];
// 数组名[索引下标] = 元素值;
str[2] = "Hello";

/* 或
 * 数据类型[] 数组名;
 * 数组名 = new 数组类型[数组长度];
 */
String[] str1;
str1 = new String[10];
str1[2] = "Hello";

/*
 * 元素类型[]  数组名 = new 元素类型[数组长度];	 (建议使用这一种)
 * 元素类型  数组名[] = new 元素类型[数组长度];
 */
String[] str2 = new String[20];
String str2[] = new String[20];
// 数组名[索引下标] = 元素值;
str2[2] = "Hello";
静态创建一维数组(如下):
// 元素类型[] 数组名 = {元素1, 元素2, 元素3,…};
int sum = {1,2,3,4,5,6};

//元素类型[] 数组名 = new 元素类型[]{元素1, 元素2, 元素3,…};
String[] str2 = new String[]{"a","b","1","2"};

二维数组的创建及赋值

二维数组内存格式(如下图):

二维数组内存格式

动态创建二维数组(如下):

  数组类型[][] 数组名 = new 数组元素类型[行数][列数]
  注意:二维数组中声明列数时可以省略,但行数必须写。

/*  数据类型 数组名[][];
 *  数组名 = new 数组元素类型[行数][列数]}
 */
String str[][];
str = new String[2][3];
str[0][1] = new String("Hello");

/* 或
 * 数据类型[][] 数组名;
 * 数组名 = new 数组元素类型[行数][]}
 */
String[][] str1;
str1 = new String[5][];
str1[0][1] = new String("Hello");

/*
 * 元素类型[][]  数组名 = new 元素类型[数组长度1][数组长度2];	  (建议使用这一种)
 * 元素类型[]  数组名[] = new 元素类型[数组长度1][数组长度2];
 * 元素类型  数组名[][] = new 元素类型[数组长度1][数组长度2];
 * (数组长度1和数组长度2都必须是正整数;数组长度1为行数,数组长度2为列数;数组长度1必须声明长度)
 */
String[][] str2 = new String[2][3];		// 可以认为创建一个两行三列的数组
String[] str2[] = new String[2][3];
String str2[][] = new String[2][3];
str2[0][1] = new String("Hello");
静态创建二维数组(如下):
//数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
String[][] str = {{"a","1"},{"b","2"}};

//数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
String[][] str2 = new String[][]{{"a","1"},{"b","2"}};

数组的遍历

一维数组遍历

使用for循环遍历获取数组元素

int[] arr = {11, 22, 33, 44, 55, 66, 77};
// for循环遍历数组
for (int i = 0; i < arr.length; i++) {
	System.out.println(arr[i]);
}

使用for-each循环遍历获取数组元素
  优点:语法简洁,相对执行效率较高
  缺点:遍历过程中,无法获得数组|集合索引

int[] arr = {11, 22, 33, 44, 55, 66, 77};
// 增强for循环遍历数组
for (int value : arr) {
	System.out.println(value);
}

二维数组遍历

// 使用嵌套循环(两层for循环)遍历
for (int i = 0; i < arr.length; i++) {
	for (int j = 0; j < arr[i].length; j++){
		sum +=arr[i][j];
		System.out.print(arr[i][j] + "\t");
	}
}

数组数据结构的优势和劣势

  优势:数组能够实现快速寻址,所以执行“修改”和“查询”的效率非常高!
      快速寻址公式:首地址 + 索引值 * 存储元素占用的字节数。
  劣势:数组实现“插入”和“删除”的效率非常低!

数组中常见的方法

数组(Arrays)常见方法

import java.util.Arrays;

public class ArraysUtil {
	public static void main(String[] args) {
		int[] arr = { 5, 12, 88, 18, 66, 76, 45, 28, 59, 72 };
		
		// 字符串输出
		//toString(arr);
		
		// 升序排序
		//sort(arr);
		
		// 判断数组是否相等
		//equals();

		// 二分法查找
		//binarySearch();
		
		// 数组复制
		//copyOf(arr);
		//copyOfRange(arr);
		
		/* System类中的arraycopy方法
		 public static native void arraycopy(Object src,  int  srcPos,
		                                        Object dest, int destPos,
		                                        int length);
		 作用:就是用于实现数组元素的拷贝工作。
		 建议:如果需要实现对数组元素的拷贝工作,建议使用System类中的arraycopy方法,而不要去用Arrays工具类中的copyOf()和copyOfRange()方法
		 方法参数分析:
		 		src:需要被拷贝的数组(源数组)
		 		srcPos:从源数组中的那个位置开始拷贝,传递是一个索引值
		 		dest:目标数组,也就是把拷贝的元素放入目标数组中
		  		destPos:把拷贝的元素放在目标数组中的哪个位置,传递是一个索引值
		  		length:拷贝数组的元素个数*/
        // 【复制数组建议使用这种】
		int[] dest = new int[5];
		System.arraycopy(arr, 2, dest, 0, 5);
		System.out.println(Arrays.toString(dest));		
	}

	/**
	 * 范围复制数组
	 * @param arr 传入的数组
	 */
	public static void copyOfRange(int[] arr) {
		/*int[] copyOfRange = Arrays.copyOfRange(arr, 2, 8);
		for (int i : copyOfRange) {
			System.out.print(i + "  ");
		}*/
		
		int[] copyOfRangeArrays = copyOfRangeArrays(arr, 2, 8);
		for (int i : copyOfRangeArrays) {
			System.out.print(i + "  ");
		}
	}

	/**
	 * 手写实现范围复制数组
	 * @param arr 传入的数组
	 * @param from  取值的初始索引
	 * @param to  取值的结束索引
	 * @return 返回的新数组
	 */
	public static int[] copyOfRangeArrays(int[] arr,int from,int to) {
		// 0.判断form和to是否合法
		if (to < from || to < 0 || from < 0 || to >= arr.length) {
			System.out.println("传入的to或from不合法!");
			throw new RuntimeException();
		}
		int length = to - from;
		int[] arr2 = new int[length];
		// 方案一:
		for (int i = 0; i < arr2.length; i++) {
			arr2[i] = arr[from + i];
		}
		/*// 方案二:
		  for(int i = from; i < to; i++) { 
			arr2[i - from] = arr[i];
		}*/
		/*// 方法三:
		 for(int i = from, j = 0; i < to; i++, j++) {
			arr2[j] = arr[i];
		}*/
		arr = arr2;
		return arr;
	}
	
	/**
	 * 赋值数组
	 * @param arr 传入的数组
	 */
	public static void copyOf(int[] arr) {
		/*int[] arr2 = new int[4];
		int[] copyOf = Arrays.copyOf(arr, 4);
		arr2 = copyOf;
		for (int i : arr2) {
			System.out.print(i + "  ");
		}*/
		
		int[] copyOfArrays = copyOfArrays(arr,4);
		for (int i : copyOfArrays) {
			System.out.print(i + "  ");
		}
	}
	
	/**
	 * 手写实现copy数组方法
	 * @param arr 传入的数组
	 * @param length 截取的长度
	 * @return 返回截取的数组
	 */
	public static int[] copyOfArrays(int[] arr,int length) {
		int[] arr2 = new int[length];
		for (int i = 0; i < arr2.length; i++) {
			arr2[i] = arr[i];
		}
		arr = arr2;
		return arr;
	}

	/**
	 * 二分法查找 (数组必须有序)
	 * @param arr 传入的数组
	 */
	public static void binarySearch() {
		int[] arr = {1,2,3,4,5,6,7,8,9};
		
		/*int binarySearch = Arrays.binarySearch(arr, 6);
		System.out.println(binarySearch);*/
		
		int binarySearch = binarySearch(arr, 6);
		System.out.println(binarySearch);
		
	}
	
	/**
	 * 手写实现二分法查找
	 * @param arr 传入的数组
	 * @param value 传入的值
	 * @return 返回数组中查找值的索引
	 */
	public static int binarySearch(int[] arr,int value){
		int min = 0,max = arr.length - 1,mid = 0;
		for (int i = 0; i < arr.length; i++) {
			mid = (min + max) / 2;
			if (value > arr[mid]) {
				min = mid + 1;
			}else if(value < arr[mid]){
				max = mid - 1;
			}else {
				return mid;
			}
			if (max < min) {
				return -1;
			}
		}
		return mid;
	}

	/**
	 * sort方法
	 * @param arr 传入的数组
	 */
	private static void sort(int[] arr) {
		// Arrays.sort(arr);
		int[] sortArrays = sortArrays(arr);
		for (int i : sortArrays) {
			System.out.print(i + "  ");
		}
	}
	
	/**
	 * 手写实现sort方法(冒泡法)
	 * @param arr 传入的数组
	 * @return 返回排序后(升序)的数组
	 */
	public static int[] sortArrays(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++) {
			// 假设数组是有序的
			boolean flag= true;
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] > arr[j+1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					flag = false; // 推翻假设
				}
			}
			if (flag) { // 如果有序直接跳出循环
				break;
			}
		}
		return arr;
	}

	/**
	 * toString方法
	 * @param arr 传入的数组
	 */
	public static void toString(int[] arr) {
		// System.out.println(Arrays.toString(arr));

		System.out.println(toStringArrys(arr));
	}

	/**
	 * 手写实现tostring方法
	 * @param arr 传入的数组
	 * @return 返回的字符串
	 */
	private static String toStringArrys(int[] arr) {
		String str = "";
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i != arr.length - 1) {
				str += arr[i] + ",";
			} else {
				str += arr[i] + "]";
			}
		}
		return str;
	}
	
	/**
	 * rquals方法
	 */
	public static void equals() {
		int[] arr1 = {1,2,3,4};
		int[] arr2 = {1,2,3,4};
		/*boolean equals = Arrays.equals(arr1, arr2);
		System.out.println(equals);*/
		
		boolean equals = equalsArrays(arr1, arr2);
		System.out.println(equals);
	}

	/**
	 * 手写实现rquals方法
	 * @param arr1 传入的第一个数组
	 * @param arr2 传入的第二个数组
	 * @return 如果相同则为true,不同则为false
	 */
	public static boolean equalsArrays(int[] arr1, int[] arr2) {
		if (arr1 == arr2) 
			return true;
		if (arr1 == null || arr2 == null) 
			return false;
		if (arr1.length != arr2.length) 
			return false;
		for (int i = 0; i < arr2.length; i++) {
			if (arr1[i] != arr1[i]) {
				return false;
			}
		}
		return true;
	}
    
}
<think>好的,用户想了解Java数组常用方法。首先,我需要整理Java数组相关常用方法,可能涉及到java.util.Arrays类和System类中的方法。根据用户提供的引用内容,特别是引用[1]和[2],里面提到了Arrays类提供的静态方法,比如排序、二分查找等。同时,引用[3]提到了数组的整除操作,虽然这可能和数组方法无关,但需要注意用户可能对基础操作也有兴趣。 首先,java.util.Arrays类中的方法应该是重点。比如排序sort()、二分查找binarySearch()、填充fill()、复制copyOf()、比较equals()和转换为字符串toString()。这些方法都是静态的,可以直接通过类名调用。需要给出每个方法的用途、参数和示例代码,比如sort()如何对数组进行排序,binarySearch()的前提是数组已排序。 另外,引用[2]提到Java库中的二分查找实现,应该强调使用前必须排序,否则结果不可预测。同时,System类中的arraycopy()方法也是处理数组的重要部分,用于高效复制数组,虽然参数较多,但性能较好。 用户可能还关心这些方法的时间复杂度。例如,排序方法的时间复杂度通常是O(n log n),而二分查找是O(log n)。引用[3]中的复杂度分析可能需要结合到回答中,让用户了解这些方法的性能。 另外需要注意,用户提供的引用中有提到并发编程的例子,但可能和数组方法关系不大,所以可以忽略这部分。但需要确保回答中提到的所有方法都正确引用来源,例如Arrays类的方法来自引用[1]和[2],arraycopy()来自引用[1]。 还需要检查是否有其他常用方法被遗漏,比如parallelSort()、stream()等,但考虑到用户可能更关注基础方法,可能需要保持简洁,重点放在最常用方法上。同时,示例代码需要用Java,并确保语法正确,比如正确的参数类型和异常处理,比如binarySearch()未找到元素时的返回值。 最后,生成相关问题时要围绕用户的问题扩展,比如询问不同排序算法的选择、处理对象数组的注意事项、多维数组方法等,这些可以帮助用户深入理解。</think>### Java数组常用方法总结 Java数组常用方法主要集中在`java.util.Arrays`和`System`类中,以下是核心方法及其说明: --- #### 1. **排序:`Arrays.sort()`** - **用途**:对数组进行升序排序,支持基本类型和对象数组。 - **时间复杂度**:$O(n \log n)$(基于双轴快速排序或归并排序)[^2]。 - **示例**: ```java int[] arr = {5, 3, 1, 4, 2}; Arrays.sort(arr); // 排序后 arr = [1, 2, 3, 4, 5] ``` --- #### 2. **二分查找:`Arrays.binarySearch()`** - **用途**:在已排序的数组中查找元素,返回索引(未找到时返回负数)。 - **时间复杂度**:$O(\log n)$。 - **示例**: ```java int index = Arrays.binarySearch(arr, 3); // 返回2 ``` --- #### 3. **填充值:`Arrays.fill()`** - **用途**:将数组的所有元素初始化为指定值。 - **示例**: ```java int[] arr = new int[5]; Arrays.fill(arr, 10); // arr = [10, 10, 10, 10, 10] ``` --- #### 4. **复制数组:`Arrays.copyOf()`** - **用途**:复制数组并指定新长度(多余位置填充默认值)。 - **示例**: ```java int[] newArr = Arrays.copyOf(arr, 10); // 新数组长度为10 ``` --- #### 5. **比较数组:`Arrays.equals()`** - **用途**:判断两个数组内容是否完全一致。 - **示例**: ```java boolean isEqual = Arrays.equals(arr1, arr2); ``` --- #### 6. **转换为字符串:`Arrays.toString()`** - **用途**:将数组转换为易读的字符串格式。 - **示例**: ```java String str = Arrays.toString(arr); // 输出如"[1, 2, 3]" ``` --- #### 7. **高效数组复制:`System.arraycopy()`** - **用途**:底层方法,高效复制数组片段。 - **参数**:`(源数组, 源起始位置, 目标数组, 目标起始位置, 复制长度)`[^1]。 - **示例**: ```java int[] src = {1, 2, 3}; int[] dest = new int[5]; System.arraycopy(src, 0, dest, 0, 3); // dest = [1, 2, 3, 0, 0] ``` --- #### 8. **并行排序:`Arrays.parallelSort()`** - **用途**:利用多线程对大型数组加速排序(Java 8+)。 - **适用场景**:数据量超过 $2 \times 10^4$ 时性能更优。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值