数组是什么?
数组可存放多个同一类型的数据。数组也是一种数据类型,是引用类型。【数组:一种数据类型,存储一组相同类型的数据】
数组的定义方式
方式一:动态初始化
数据类型 数组名【】 = new 数据类型【数据的容量大小】
//方式1:
int[] a = new int[10];
//一个名为a的数组,存储int类型的数据,可存放10个int型数据
double[] b = new double[20];
//一个名为b的数组,存储double类型的数据,可存放20个double型数据
方式二:静态初始化
数据类型 数组名【】 = {数据常量1,数据常量2,......,数据常量n}
//方式2:
int[] a = {1,2,3,4,5};
//一个名为a的数组,存储int类型的数据。
//存放了5个int型数据,分别为1 2 3 4 5
double[] b = {1.1,2.2,3.3};
//一个名为b的数组,存储double类型的数据。
//存放了3个double型数据,分别为1.1 2.2 3.3
数组的访问
下标访问:数组名【索引】(可以对其进行操作)
int[] a = {1,2,3,4,5};
a[0] = 10;
// a --- { 10 , 2 , 3 , 4 , 5}
double[] b = {1.1,2.2,3.3};
b[1] = 1.1;
// b --- { 1.1 , 1.1 , 3.3}
数组使用注意事项和细节
1.数组只能存放相同类型的数据
int[] arr1 = {1,'a',1.1}; // X 严重错误
int[] arr2 = {1,2,3,4,5}; // √
char[] arr3 = {'a','b','c'}; // √
2.数组可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
int[] arr_int = new int[5];
double[] arr_double = new double[5];
String[] arr_String = new String[5];
3.数组创建后,若没有对其赋值,其存在默认值
int | 0 |
short | 0 |
byte | 0 |
long | 0 |
float | 0 |
double | 0.0 |
char | \u0000(等价于字符'\0') |
boolean | false |
String | null |
//例如: (其他同理)
int[] arr = new int[3];
// arr --- { 0 , 0 , 0}
4.使用数组的步骤
- 声明数组并开辟空间
- 给数组各个元素赋值
- 使用数组
5.数组的下标是从0开始的。
6.数组下标必须在指定范围内使用,否则,会报错出现下标越界异常
//例如:
int[] arr=new int[5];
则有效下标为0-4
int[] arr1 = {1 , 2 , 3 , 4 , 5};
下标(索引) 对应的值
0 1
1 2
2 3
3 4
4 5
7.数组属引用类型,数组型数据是对象(object)
数组赋值机制
int n1 = 10;
int n2 = n1;
n2 = 10;
//这里采用的是值传递---改变n2的值不会影响n1的值
//而数组不同 --- 引用传递
int[] arr1 = {1,2,3};
int[] arr2 = arr1; // arr1 中存储的数据本质是--数组地址
//也就是说 arr2将arr1的地址 拷贝了一份,放入arr2变量中
//arr1和arr2存储的地址是相同的,但地址所在的数据是没有改变的
arr2[0] = 0;
//所以arr2在对该地址上的内容进行操作时,会影响到arr1的值
冒泡排序
// 冒泡排序
int[] arr = {9,8,7,6,5,4,3,2,1};
int temp = 0;
for (int i=0;i<arr.length;i++){
for (int j=0;j<arr.length-1-i;j++){
if (arr[j]>arr[j+1]){
temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
// 输出 排序后的结果
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
二维数组
数组的定义方式
方式一:动态初始化
数据类型 数组名【】【】 = new 数据类型【容量】【容量】
//这三类二维数据定义方式均可行--推荐第一种
int[][] a1 = new int[2][3];
int[] a2[] = new int[2][3];
int a3[][] = new int[2][3];
方式二:静态初始化
数据类型 数组名【】【】 = {{数据常量},{数据常量}..}
// 1 0 0 0 0 0
// 0 1 0 0 0 0
// 0 0 1 0 0 0
int[][] arr = { {1,0,0,0,0,0} , {0,1,0,0,0,0} , {0,0,1,0,0,0} };
数组的经典练习题
例题一:(二维数组的生成)
// 动态初始化确定(列数不确定的情况)
// 1
// 2 2
// 3 3 3
int[][] arr = new int[3][]; //列数不确定
for (int i = 0;i < arr.length;i++){
// 生成一维数组
arr[i] = new int[i+1];
// 对一维数组进行赋值
for (int j = 0;j < arr[i].length;j++){
arr[i][j] = i + 1;
}
}
例题二:(杨辉三角)
//使用二维数组打印一个10行杨辉三角1
//1
//1 1
//1 2 1
//1 3 3 1
//1 4 6 4 1
//1 5 10 10 5 1
//......
//规律
//1. 第一行有1个元素,第n行有n个元素
//2.每一行的第一个元素和最后一个元素都是1
//3.从第三行开始,对于非第一个元素和最后一个元素的元素的值.
//4. arr[i][j]arr[i][j] = arr[ i-1][j] + arr[i-1][j-1];
//必须找到这个规律
row = 10; //需要得到的杨辉三角的行数
int[][] arr = new int[row][];
for (int i=0;i<arr.length;i++){
yanghui[i] = new int[i];
for (int j=0;j<arr[i].length;j++){
if (j==0 || j==arr[i].length-1){
arr[i][j] = 1;
}else{
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
// 输出结果
for (int i=0;i<arr.length;i++){
for (int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
例题三:(空心金字塔)
//实现打印任意阶数的空心金字塔
//以5阶为例
// *
// * *
// * *
// * *
//*********
//1.先打印一个矩形
// ******
// ******
// ******
// ******
// ******
for(int i = 1;i<=5;i++){
System.out.println("******");
}
//2.打印半个金字塔
// * 第一层1个*
// ** 第二层2个*
// *** 第三层3个*
// **** 第四层4个*
// ***** 第五层5个*
for (int i=1;i<=5;i++){
for (int j=1;j<=i;j++){
System.out.print("*");
}
System.out.println();
}
//3.打印整个金字塔
// * 第一层1个* 2*层数-1 4个空格 总层数-当前层数
// *** 第二层3个* 2*层数-1 3个空格 总层数-当前层数
// ***** 第三层5个* 2*层数-1 2个空格 总层数-当前层数
// ******* 第四层7个* 2*层数-1 1个空格 总层数-当前层数
// ********* 第五层9个* 2*层数-1 0个空格 总层数-当前层数
for (int i=1;i<=5;i++){
//打印空格
for (int j=1;j<=5-i;j++){
System.out.print(" ");
}
for (int j=1;j<=2*i-1;j++){
System.out.print("*");
}
System.out.println();
}
//4.实现目标
// * 第一层1个*
// * * 第二层2个*
// * * 第三层2个*
// * * 第四层2个*
// ********* 第五层9个*
for (int i=1;i<=5;i++){
//打印空格
for (int j=1;j<=5-i;j++){
System.out.print(" ");
}
for (int j=1;j<=2*i-1;j++){
//在当前行中(除最后一行),第一个位置和最后一个位置才会打印*号
//最后一行需要全部打印*号
if(j==1 || j == 2*i-1 || i==5){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
//对阶数进行控制---达到任意阶数
int index = 5;
for (int i=1;i<=index;i++){
//打印空格
for (int j=1;j<=index-i;j++){
System.out.print(" ");
}
for (int j=1;j<=2*i-1;j++){
//在当前行中(除最后一行),第一个位置和最后一个位置才会打印*号
//最后一行需要全部打印*号
if(j==1 || j == 2*i-1 || i==index){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
//例:
//index = 10;
// *
// * *
// * *
// * *
// * *
// * *
// * *
// * *
// * *
//*******************