数组
数组
1 数组的使用
数组就是装着相同数据类型变量的容器。
数组中的每一个变量称之为叫元素。
数组的声明格式:
数据类型[] 数组名称;
数据类型 数组名称[];
要想使用数组,需要给数组进行初始化。
初始化就是给数组开辟内存空间,并且为每一个空间赋予一个初始的默认值。
初始化的两种方式:
-
动态初始化(指定长度):在初始化的时候,指定数组的长度,系统根据长度为每一个元素赋予一个初始的默认值。
- 格式: 数据类型[] 数组名称 = new 数据类型[m];
- 数据类型:数组中每一个元素的类型,可以是基本数据类型,也可以是引用数据类型
- []:代表是一个数组
- 数组名称: 就是数组的标识符
- new :开辟内存空间
- m:数组的长度,就是容器中可以存储几个数据
-
静态初始化(指定元素):在初始化的时候直接指定数组的元素,系统会根据元素的个数决定数组的长度
-
完整格式:
-
数据类型[] 数组名称 = new 数据类型[]{元素值1,元素值2,元素值3...元素值n}; -
简便格式:
-
数据类型[] 数组名称 = {元素值1,元素值2,元素值3...元素值n}; -
注意:简便格式不能分开定义
-
public static void main(String[] args) {
// 静态初始化
int[] arr1 = new int[]{1,2,3,4,5};
System.out.println(arr1);// [I@4eec7777
System.out.println(arr1[2]);
int[] arr2 = {3,4,5,6,7};
System.out.println(arr2);
System.out.println(arr2[4]);
int[] arr3;
arr3 = new int[]{3,4,5};
// int[] arr4;
// arr4 = {1,2,3};
}
访问数组元素:
数组名称[索引];
索引是从0开始的,范围是 0 到 数组长度 -1
public static void main(String[] args) {
// 数据类型[] 数组名称 = new 数据类型[m];
int[] arr1 = new int[3];
// [I@4eec7777
// [:代表是一个数组
// I:表示是int类型
// @:分隔符 没有特殊含义
// 4eec7777:内存的地址 十六进制的表示
// 内存的地址是唯一的,如果两个数组的地址相同,那么肯定是同一个数组
System.out.println(arr1);
// 访问数组中的第一个元素
System.out.println(arr1[0]);// 0 数组中的元素具有默认值
arr1[0] = 20;
System.out.println(arr1[0]);
}
2 java中的内存分配
java中的内存区域划分为5个
- 栈内存:存储的都是局部变量
- 局部变量:凡是定义在方法的大括号的变量,都是局部变量。
- 局部变量一旦超出了自己的作用域,就不能使用了,内存空间会被回收。
- 堆内存:存储的都是对象(凡是new出来的东西,都在堆内存中)
- 对象存储在堆内存中,具有一个首地址值。其中针对不同的数据类型,会赋予初始的默认值。
- byte/short/int/long 默认值都是0
- float/double 默认值是0.0
- char 默认值是 \u0000
- boolean 默认值是 false
- 引用数据类型默认值是null
- 方法区:存储与class相关信息
- 本地方法栈
- 寄存器(PC计数器)
3 数组的内存示意图
- 一个数组的示意图

- 两个数组的内存图

- 一个数组指向两个引用的内存图

4 数组常见的两个问题
- ArrayIndexOutOfBoundsException:数组越界异常
- NullPointerException:空指针异常
5 遍历数组
获取数组中的每一个元素
public static void main(String[] args) {
int[] arr = {3,4,5};
// JDK5特性:增强for循环 只能遍历,不能做其他操作
for (int e : arr){
e *= 10;
}
// arr.length 动态获取数组的长度
for (int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
}
6 获取数组的最值
public static void main(String[] args) {
// 获取数组的最值
int[] arr = {3,2,5,1,6,4};
// 设置最大值
int max = arr[0];
for (int i = 1;i < arr.length;i++){
if (max < arr[i]){
max = arr[i];
}
}
System.out.println("最大值是" + max);
}
7 数组的反转
public static void main(String[] args) {
// 数组的反转
int[] arr = {1,2,3,4,5};
System.out.println(arr);
// 方式一:
// 定义新数组,长度和arr长度一样
// [0,0,0,0,0]
// int[] tempArr = new int[arr.length];
// for (int i = 0;i < arr.length;i++){
// tempArr[arr.length - 1 - i] = arr[i];
// }
// // 改变arr的引用
// arr = tempArr;
// 方式二:
// for (int min = 0,max = arr.length - 1;min < max;min++,max--){
// int temp = arr[max];
// arr[max] = arr[min];
// arr[min] = temp;
// }
// 方式三:
for (int i = 0;i < arr.length / 2;i++){
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
8 数组的查找
public static void main(String[] args) {
// 遍历查找
int[] arr = {3,5,2,1,9};
int num = 2;
// 依次比较
// for (int i = 0;i < arr.length;i++){
// if (arr[i] == num){
// System.out.println("数字的索引是" + i);
// }
// }
// 定义变量,记录索引
int index = 0;
for (int e : arr){
if (e == num){
System.out.println(index);
break;
}
index++;
}
}
折半查找/二分查找:要求数组是升序或者降序
public static void main(String[] args) {
// 二分查找
int[] arr = {1,3,6,8,10};
// 定义要查询的数字
int num = 10;
// 定义最小和最大索引
int min = 0;
int max = arr.length - 1;
// 计算中间索引
int mid = (min + max) / 2;
// 定义标记位 true代表找到了 false代表没找到
boolean flag = true;
while (arr[mid] != num){
// 判断是否大于num
if (arr[mid] > num){
max = mid - 1;
}
// 判断是否小于num
if (arr[mid] < num){
min = mid + 1;
}
// 重新计算新的中间索引
mid = (min + max) / 2;
if (min > max){
System.out.println("查无此数");
flag = false;
break;
}
}
if (flag)
System.out.println("查找的数字索引是" + mid);
}
9 数组的排序
- 冒泡排序
public static void main(String[] args) {
int[] arr = {4,3,6,2,1,7,43,23,2345,234};
for (int i = 1;i < arr.length;i++){// 轮数
System.out.println("i = " + i);
for (int j = 0;j < arr.length - i;j++){
System.out.println("j = " + j);
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
- 选择排序
public static void main(String[] args) {
int[] arr = {4,3,6,2,1,7};
for (int i = 0;i < arr.length - 1;i++){
System.out.println("i = " + i);
for (int j = i + 1;j < arr.length;j++){
System.out.println("j = " + j);
if (arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
10 数组的扩容
数组的长度是固定不变的。一旦创建之后,数组长度不可更改。
public static void main(String[] args) {
// 数组扩容方式一
int[] arr = {1,2,3,4,5};
System.out.println(arr);
// int[] arr1 = new int[arr.length * 2];
// // 参数一: 要拷贝的数组的来源
// // 参数二: 要拷贝的起始索引
// // 参数三: 要拷贝到哪个数组
// // 参数四: 要拷贝到的数组的起始索引
// // 参数五: 要拷贝的数据长度
// System.arraycopy(arr,0,arr1,0,arr.length);
// arr = arr1;
// System.out.println(arr);
// 参数一: 要扩容的数组
// 参数二: 要扩容的长度
arr = Arrays.copyOf(arr,arr.length * 2);
System.out.println(arr);
System.out.println(Arrays.toString(arr));
}
99 乘法表
public static void main(String[] args) {
// *****
// for (int i = 0; i < 5; i++) {
// System.out.print("*");
// }
// ctrl + alt + l 格式化代码
// *****
// *****
// *****
// *****
// *****
// for (int i = 0; i < 5; i++) {
// for (int j = 0; j < 5; j++) {
// System.out.print("*");
// }
// System.out.println();
// }
// *
// **
// ***
// ****
// *****
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "X" + i + "=" + i * j + "\t");
}
System.out.println();
}
}

浙公网安备 33010602011771号