数组概念
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
数组既可以存储基本数据类型,也可以存储引用数据类型(后面讲解)。
数组定义格式
格式1: 数据类型[] 数组名;
格式2: 数据类型 数组名[];
举例:
int[] a; 定义了一个int类型的数组a;
int a[]; 定义了一个int类型的a数组;
推荐使用第一种定义方式。
*Java中的数组必须先初始化,然后才能使用。所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
初始化的分类:
a:动态初始化: 只指定长度,由系统给出初始化值
b:静态初始化: 给出初始化值,由系统决定长度
*注意事项: 这两种方式,只能使用一种,不能进行动静结合
*动态初始化的格式:
数据类型[] 数组名 = new 数据类型[数组长度];
数组长度其实就是数组中元素的个数。
****举例: int[] arr = new int[3]; 定义了一个int类型的数组arr,这个数组可以存放3个int类型的值
****本人对java中内存分配的理解
{
//栈:局部变量 方法代码片段执行的时候。会给该方法分配内存空间,在栈内存中压栈
public class MethodTest01{
public static void main(String[] args){
int a=10;
int b=20;
int retValue = sumInt(a,b);
System.out.println("retValue="+retValue);
}
public static int sumInt(int i, int j){
int result = i+j;
int num =3;
int retValue =divide(result,num);
renturn retValue;
}
public static int divide(int x,int y){
int z =x/y;
renturn z;
}
}
}
堆: 存放的是所有new出来的东西
特点:
a: 每一个new出来的东西都会为其分配一个地制值。
b: 每一个变量都有一个默认的值
byte,short,int,long – 0
float,double – 0.0
char – ‘\u0000’
boolean – false
引用数据类型 – null
c: 使用完毕就变成了垃圾,等待垃圾回收器对其回收
方法区
***静态初始化的格式:
格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
举例: int[] arr = new int[]{1,2,3};
简化格式:
数据类型[] 数组名 = {元素1,元素2,…};
举例: int[] arr = {1,2,3};
**二维数组其实就是每一个元素为一维数组的数组。
二维数组格式1
数据类型[][] 变量名 = new 数据类型[m][n];
m表示这个二维数组有多少个一维数组 必须写上
n表示每一个一维数组的元素个数 可选
举例:
int[][] arr = new int[3][2];
定义了一个二维数组arr
这个二维数组有3个一维数组,##名称是arr[0],arr[1],arr[2]##
每个一维数组有2个元素,###可以通过arr[m][n]来获取
表示获取第m+1个一维数组的第n+1个元素###
注意事项
以下格式也可以表示二维数组
a:数据类型 数组名[][] = new 数据类型[m][n]; int arr[][]=new int[m][n]
b:数据类型[] 数组名[] = new 数据类型[m][n];
这两种格式不推荐使用
注意下面定义的区别
int x,y;
int[] x,y[];
区别是:
int[] x,y[];//定义了两个数组 一个是一维数组x 一个是二维数组y
x=new int[3];
y=new int[3][];
二维数组格式2
数据类型[][] 变量名 = new 数据类型[m][];
m表示这个二维数组有多少个一维数组
这一次没有直接给出一维数组的元素个数,可以动态的给出。
举例:
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[1];
二维数组格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}…};
简化版:
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
这个格式属于静态初始化:由我们指定具体的元素值,由系统给分配长度
举例:
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
int[][] arr = {{1,2,3},{5,6},{7}};
需求:打印杨辉三角形(行数可以键盘录入)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
分析:看这种图像的规律
A:任何一行的第一列和最后一列都是1
B:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
步骤:
A:首先定义一个二维数组。行数如果是n,我们把列数也先定义为n。
这个n的数据来自于键盘录入。
B:给这个二维数组任何一行的第一列和最后一列赋值为1
C:按照规律给其他元素赋值
从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
D:遍历这个二维数组。
import java.util.Scanner;
class yanghui
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int n = sc.nextInt();
int [][] arr= new int [n][n];
for (int z=0;z<n ;z++)
{
arr[z][0]=1;
arr[z][z]=1;
}
for (int i=2;i<n;i++)
{
for (int j=1;j<i ;j++ )
{
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
}
for (int x=0;x<n ;x++ )
{
for (int y=0;y<=x ;y++ )
{
System.out.print(arr[x][y]);
if (x==y)
{
System.out.println();
}
}
}
}
}
递归概述: 方法定义中调用方法本身的现象
B递归注意事项
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
import java.util.Scanner;
class DiGui
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int x = sc.nextInt();
int r = sum(x);
System.out.println(r);
}
public static int sum(int x){
if (x==1)
{
return 1;
}
return x+sum(x-1); //retrun x*sum(x-1) 阶乘
}
}