目录
1 定义数组
数组 是一块连续的内存,用来储存相同类型的数据,数组下标从0开始
2 数组的初始化
局部变量在使用时一定要进行初始化
数组的初始化主要分为动态初始化以及静态初始化
2.1 动态初始化
在创建数组时直接指定数组中元素的个数,默认数组初始化为0
2.2 静态初始化
( 静态初始化可以简写,省去后面的 new int[] )
在创建数组时不直接指定数据元素个数
静态和动态初始化也可以分为两步,但是 省略格式不可以
动态:
int[] array= new int[10];
分两步:
int[] array;
array = new int[10];
静态:
int[] array = new int[]{10, 20, 30};
分两步:
int[] array;
array = new int[]{10, 20, 30};
省略格式:
int[] array = {1, 2, 3, ..., n};
省略格式不可以拆分, 否则编译失败
数组就是一个引用数据类型,用来存放地址
int[] array = 0; //会报错,因为数组里面存的是地址
如果数组中存储元素类型为基类类型未初始化,默认值为基类类型对应的默认值,比如:
如果数组中存储元素类型为引用类型,默认值为 null
3 数组的使用
3.1 数组访问
通过下标访问快速访问数组中任意位置的元素,下标从0开始
不能越界,否则会报出下标越界异常
3.2 遍历数组
"遍历" 是指将数组中的所有元素都访问一遍,访问是指对数组中的元素进行某种操作
比如:打印(print输出不换行,println输出换行)
求数组长度:数组名.lenght
使用 for循环 遍历数组
使用 for-each 遍历数组
(遍历这个数组的时候,把数组当中的元素进行赋值给x)
for-each 是 for 循环的另外一种使用方式
能够更方便的完成对数组的遍历,可以避免循环条件和更新语句写错
区别:使用for循环有下标,for-each无下标
4 数组是引用类型
4.1 JVM 内存划分
(便于内存管理)
局部变量 存放于虚拟机栈中
new 对象放入堆中
4.2 引用变量
arr 引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址
通过该地址,引用变量便可以去操作对象
a,b是基本数据类型
4.3 再谈引用变量
一个引用不能同时指向多个对象
对象不能指向对象,只有引用才能指向对象
传引用不一定能改变实参的值,重要的是看拿引用做了什么
是让引用指向了新的对象(只是修改了形参的指向,打印出来的实参并未改变)
还是让引用里面的值改变(修改的是同一块内存,实参改变)
4.4 认识 null
null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用
5 数组的应用场景
5.1 数组作为参数
1、参数传基本数据类型
在 func 方法中修改形参 x 的值, 不影响实参的 num 值
2、参数传数组类型(引用数据类型)
func 方法内部修改数组的内容, 方法外部的数组内容也发生改变.
因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的
5.2 数组作为返回值
数组是可以以返回值形式传递的,(返回值可以是数组)
6 Arrays(操作数组的工具类)
Arrays.toString 把数组以字符串形式进行输出
因为 Arrays.toString 方法本来就有返回值(原码中返回字符串)
因此可以直接作为 println 方法参数进行返回
利用 Arrays.sort 进行排序(排序效率也高)
Arrays.sort 也可以进行区间排序,开发效率非常高
比较两个数组内容一不一样,可以 Arrays.equals
返回值是 true 或 false
填充可以 Arrays.fill
打印出来的都是9
Arrays.fill 也可以区间填充
0到3理论上4个数据,但 Java 里面0到3都是左闭右开区间,只有3个数据
7 数组练习
7.1 数组排序(冒泡排序)
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] array = {44,99,22,4};
bubbleSort(array);
System.out.println(Arrays.toString(array));
}
public static void bubbleSort(int[]array){
if (array == null){
return;
}
// i 代表趟数
for (int i = 0; i < array.length - 1; i++) {
boolean flg = false;
// 进行交换
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j+1]){
int tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
flg = true;
}
}
// !为非,结果为 boolean 类型,非假即为真,执行语句
if (!flg){
//flg = false ,没有进行交换
return;
}
}
}
}
7.2 数组逆序
首尾交换直到相遇
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] array = {44,99,22,4};
reverse(array);
System.out.println(Arrays.toString(array));
}
public static void reverse(int[]arrays){
if (arrays == null){
return;
}
int i = 0;
int j = arrays.length-1;
while (i < j){
int tmp = arrays[i];
arrays[i] = arrays[j];
arrays[j] = tmp;
i++;
j--;
}
}
}
7.3 求数组中元素的平均值
注意打印单个字符和打印字符串的区别
System.out.println(avg(arr));
System.out.println(Arrays.toString(array));
7.4 顺序查找
7.5 二分查找
public class Test {
public static void main(String[] args) {
int[] arrays = {1,2,3,4,5,6};
System.out.println(binarySearch(arrays, 6));
}
public static int binarySearch(int[] arrays,int key){
int left = 0;
int right = arrays.length-1;
while (left <= right){
int mid = (left + right) / 2;
if (arrays[mid] == key){
return mid;
} else if (arrays[mid] < key) {
left = mid + 1;
}else {
right = mid - 1;
}
}
return -1;
}
}
8 数组拷贝
最简单的拷贝方法
可以直接调用工具类 Arrays.copyOf 进行拷贝,有两个参数,一个数组,一个长度
这个拷贝返回值是一个数组,所以定义一个数组变量进行接收然后打印
也可以把这个拷贝当成一个扩容
Arrays.copyOfRange 对一定区间内容进行拷贝
拷贝数组返回的都是一个新的数组
也可以直接用 arraycopy 进行拷贝
两个引用指向同一个引用不属于拷贝
9 二维数组
9.1 二维数组的定义
两行三列
Java 里面行不能省略
列能省略
9.2 二维数组的使用
访问二维数组
打印二维数组
这样打印二维数组,打印出来的是地址
应该用 Arrays.deepToString 打印二维数组
另一种打印二维数组方法
特殊的二维数组打印
只定义了两行,没有定义列有多长,列此时是值null不能.lenght,所以出现空指针异常
定义列后 :
这个二维数组不是方方列列,也就是所说的不规则的二维数组
二维数组是一个特殊的一维数组
因此打印二维数组可修改为: