数组创建示例
public class Main{
public static void main(String[] args){
int[] a = new int[5];
int[] b;
b = new int[5];
int c[] = new int[5];//C写法的保留
}
}
数组创建语法:
·先声明、再分配空间
数组类型[] 数组名;
数组名 = new 数据类型[长度];
·声明并分配空间
数据类型[] 数组名 = new 数据类型[长度];
·声明并赋值(繁)
数据类型[] 数组名 = new 数据类型[] {value1, value2, value3, ...};
·声明并赋值(简)
数据类型[] 数组名 = {value1, value2, value3, ...};//显示初始化,注意:不可换行
注:数组名.length 可动态获取数组长度
( Java数组默认值 )
int - - 0 double - - 0.0 boolean - - false
char - - \u0000 (ASCII码的第一个位置,实际上表示一个空)
其他(其他值引用类型):null
数组扩容:
思路:
·创建大于原数组长度的新新数组
·将原数组中的元素依次复制到新数组中
·用新数组的地址替换原来数组的地址
public class Main{
public static void main(String[] args){
int[] nums = {1,2,3,4,5};
int[] newNums = new int[nums.length * 2];
for(int i=0; i<nums.length; i++){
newNums[i] = nums[i];
}
nums = newNums;
System.out.println(Arrays.toString(nums));
}
}//Arrays.toString()在这里用于打印数组
复制的方式
· 循环将原数组中所有元素逐一赋值给新数组
· System.arraycopy(原数组, 原数组起始, 新数组, 新数组起始, 长度);
· java.util.Arrays.copyOf(原数组, 新长度);//返回带有原值的新数组
(示例)
nums = Arrays.copyOf(nums, nums.length * 2); //扩容
nums = Arrays.copyOf(nums, nums.length / 2); //裁剪
地址的替换
· 数组作为引用类型之一,其变量中存储的是数组的地址
· 完成元素复制后,需将新数组地址,赋值给原变量进行替换
数组在方法中的应用
1、数组类型的参数
public class Main{
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
add(nums);
System.out.println(Arrays.toString(nums));
}
public static void add(int[] nums){
for (int i = 0; i < nums.length; i++){
nums[i] += 1;
}
}
}
//[2, 3, 4, 5, 6]
2、数组类型的返回值
public class Main{
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
nums = expend(nums);
System.out.println(Arrays.toString(nums));
}
public static int[] expend(int[] nums){
nums = Arrays.copyOf(nums, nums.length * 2);
return nums;
}
}
//[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
3、可变长参数
· 概念:可接收多个同类型实参,个数不限,使用方法与数组相同
· 语法:数据类型... 形参名 //必须定义在形参列表的最后,且只能有一个
public class TestArrayParameter{
public static void main(String[] args) {
printArray(1,2,3,4,5);
}
public static void printArray(int... oneArray){
for(int i = 0 ;i<oneArray.length; i++){
System.out.print(oneArray[i]+" ");
}
}
}
//1 2 3 4 5
( 数组的十种排序算法 )
冒泡排序 选择排序 插入排序
快速排序 堆排序 希尔排序 归并排序
桶排序 计数排序 基数排序
数组的查找(二分查找)
int index = Arrays.binarySearch(new int[]{1,2,3,4,5},5);
Java源码:
public static int binarySearch(int[] a, int key){
return binarySearch0(a, 0, a.length, key);
}
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key){
int low = fromIndex;
int high = toIndex - 1;
while(low <= high){
int mid = (low + high) >>> 1;
int midVal = a[mid];
if(midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; //key found
}
return -(low + 1); //key not found
}
二维数组
(简单代码示例)
public class Main{
public static void main(String[] args) {
int[][] array = new int[3][5];
array[0][0] = 10;
array[0][3] = 20;
array[1][1] = 30;
array[1][2] = 40;
array[2][4] = 50;
}
}
使用双下标访问二维数组中的元素,
第一个下标:行号 (高维下标)
第二个下标:列号(低维下标)
二维数组创建语法:
· 先声明、再分配空间
数据类型[][] 数组名;
数组名 = new 数据类型[高维长度][低维长度];
· 声明并分配空间
数据类型[][] 数组名 = new 数据类型[高维长度][低维长度];
· 声明并赋值(繁)
数据类型[][] 数组名 = new 数据类型[高维长度][];//不规则数组,自行new低维数组
· 声明并赋值(简)
数据类型[][] 数组名 = {{v1, v2, v3},{v4, v5},{v6, v7, v8, v9}};//显示初始化
(二维数组程序示例 - - 杨辉三角形 (无格式) )
public class Main{
public static void main(String[] args) {
//定义杨辉三角形的数组
int[][] array = new int[10][0];
for (int i = 0; i < array.length; i++) {
array[i] = new int[i + 1];
array[i][0] = 1;
array[i][i] = 1;
for (int j = 1; j < array[i].length - 1; j++) {
array[i][j] = array[i - 1][j - 1] + array[i - 1][j];
}
}
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
}