一维数组
数组的基础知识
1、声明数组变量
- 声明一个数组变量(引用类型)
double[] list;
或 double list[];
- 不同于声明基本数据类型变量,声明一个数组变量时不给数组分配任何内存空间。它存储的是指向数组的引用。
2、创建数组
- 让引用指向一个数组变量
list = new double[10];
- 说明:
new double[10]
创建了一个数组,并把这个数组的引用赋值给了变量list,即引用变量指向数组。 -
总结
- 一共三个步骤:声明一个数组变量、创建数组、将数组引用赋值给变量
- 可以合并在一条语句里
double[] list = new double[10];
3、数组大小和默认值
数组名.length
得到数组的大小。
- 注意数组中length是属性不是方法,没有括号()
- 创建数组后,它的元素被赋予默认值(默认初始化)。数值型基本数据类型的默认为0,char型默认为**‘\u0000’**,boolean型 默认为 **false **。
4、访问数组元素
- 通过下标访问。下标从0开始。
- 每个元素可以用下标变量表示:
list[0];
- 下标变量和正常变量的使用方法相同。
如:list[3] = list[2] + list[1];
for(int i = 0; i < list.length; i++){
list[i] = i;
}
5、数组初始化简写方式
- 声明数组、创建数组、初始化数组合并到一条语句中。
double[] list = {1.9, 2.9, 3.4, 3.5};
//{…}:初始化列表- 不使用操作符new。
6、处理数组——for循环
- 相关操作
- 循环输入初始化数组
- 使用随机数初始化数组
- 显示数组
- 所有元素求和
- 找最大值
- 找最大值最小下标
- 随机打乱
- 移动元素
- 简化编码
7、foreach循环
for(double i : list){
System.out.println(i);
}
- 变量 i 必须和 list 中元素的数据类型相同
- 限制
实例1:分析数字
实例:一副牌
复制数组
list2 = list1;
只能将list1的引用值赋值给list2,在这条语句后,list2引用的数组不能再引用,变成垃圾,被Java虚拟机自动收回,这个过程称为垃圾回收(garbabe collector,主动触发)。- 将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用复制给另一个变量,使两个变量都指向相同的内存地址。
- 有三种方法
- 使用循环,逐个赋值
- System类中的静态方法
arraycopy(sourceArray, srcPos, targetArray, tarPos, length);
clone
方法复制
int[] srcArray = {2, 3, 1, 5, 10};
int[] tarArray = new int[srcArray.length];
for(int i = 0; i < srcArray.length; i++){
tarArray[i] = srcArray[i];
}
System.arraycopy(srcArray, 0, tarArray, 0, srcArray.length);
- arraycopy方法没有给目标数组分配内存空间,复制前必须创建目标数组以及分配给它的内存空间。复制完成后,srcArray和tarArray具有相同的内容,但占有独立的内存空间。
arraycopy
违反了Java命名习惯(驼峰命名法)。
将数组传递给方法
- 对于数组类型参数,参数值是数组的引用,给方法传递的是这个引用。
public static void printArray(int[] array){...}
printfArray(new int[]{3, 1, 2, 6, 4, 2});
- 该数组没有显示地引用变量,这样地数组称为匿名数组
- 匿名数组:
new 数据类型[] 初始化列表
- 数组在Java中是对象,JVM将对象存储在一个称作**堆(heap)**的内存区域中。
方法返回数组
public static int[] reverse(int[] list){
int[] result = new int[list.length];
...
return result;
}
实例:统计每个字母出现的次数
RandomCharacter类
中的getRandomLowerCaseLetter()
方法获取一个随机字母
可变长参数列表
数组的查找
1、线性查找
2、二分查找
数组排序
1、选择排序
Arrays类
java.util.Arrays类
包含各种各样的静态方法,用于实现数组的排序和查找、数组的比较和填充数组元素,以及返回数组的字符串表示。这些方法都有对所有基本类型的重载方法。
1、排序
double[] numbers = {6.0, 4.4, 1.9, 2.9, 3.4, 3.5};
java.util.Arrays.sort(numbers);
java.tuil.Arrays.parallelSort(numbers);
sort(numbers);
对整个数组排序。sort(numbers, 1, 3);
对numbers[1,2)部分数组排序。parallelSort(numbers);
多处理器排序
2、查找
int[] list = {2, 4, 7, 10, 11, 45};
java.tuil.Arrays.binarySearch(list, 11);
binarySearch
方法:二分查找。- 前提:数组升序。
- 如果不存在关键字,方法返回
-(insertionIndex+1)
,即返回可以插入的下标。
3、比较
java.util.Arrays.equals(list1, list2);
4、填充
java.util.Arrays.fill(list, 5);
java.util.Arrays.fill(list, 1, 5, 8);
5、数组->字符串
java.util.Arrays.toString(list);
命令行参数
1、向main方法传递字符串
- main方法的声明具有String[]类型参数args。参数args是一个字符串数组,可以从命令行传送参数。
public static void main(String[] args){
}
2、实例:计算器
多维数组
二维数组基础
1、声明二维数组变量并创建二维数组
- 声明二维数组变量:
int[][] matrix;
或 int matrix[][];
- 创建二维数组:
matrix = new int[5][5];
2、获取二维数组的长度
int[] a = new int[3][4];
a.length;
a[0].length;
a[1].length;
a[2].length;
3、不规则数组
int [][] array = new int[5][];
array[0] = new int[5];
array[1] = new int[4];
array[2] = new int[3];
... ...
处理二维数组
循环
java.util.Scanner input = new java.util.Scanner(System.in);
for(int i = 0; i < a.length; i++)
for(int j = 0; j < a[i].length; j++)
a[i][j] = input.nextInt();
将二维数组传递给方法
public static int sum(int[][] m){...}
实例1:多选题测验评分
实例2:找出距离最近的点对
实例3:数独
实例4:每日温度和湿度
实例5:猜生日