Java语言基础数组
1.数组概述个定义格式说明
当我们要定义或者表达一个很多的相同类型数据的时候我们如果用单个变量来定义就会很麻烦,这时候我们就引进了数组的概念。
1)数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
2) 数组既可以存储基本数据类型,也可以存储引用数据类型。
数组定义的格式有两个:
格式一 int[] arr ;定义了一个int类型的数组a
格式二 int arr[] ;定义了一个int类型的a数组
(推荐使用第一种)
2.数组的动态初始化和静态初始化
首先在java中数组必须先初始化才能使用
所谓初始化就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
动态初始化是只给定长度,由系统给出初始化值
int[] arr=new int[a] //a为某一确定的值
数组长度就是a,也就是数组中的元素个数。
这个数组就是可以存放a个int类型的值
静态初始化时给出初始化值,由系统决定其长度。
int[] arr=new int[]{1,2,3,4,5}
简写 int[] arr={1,2,3,4,5}
3.java中内存分布(栈内存和堆内存)
栈内存存放的是局部变量而堆内存存放的是所有new出来的东西
特点:
1.每一个new出来的东西都会为其分配一个地址值
2.每一个变量都有一个默认的值
类型 | 默认值 |
---|---|
byte,short,int,long | 0 |
float,double | ‘\u0000’ |
boolean | false |
引用数据类型 | null |
使用完毕后堆内存里的东西变成垃圾,等待垃圾回收器对其回收
方法区(面向对象部分讲解)
本地方法区(和系统有关)
寄存器(cpu使用)
4.做一个简单的数组的程序来分析内存图解
运算结果如下:
右图可知
当arr2等于arr时改变arr2中的元素可以使arr中的内存改变就相当于给堆内存中储存的数赋值再调用。
5.Java数组操作的两个常见小文题越界和空指针
a:ArrayIndexOutOfBoundsException:数组索引越界异常
原因:你访问了不存在的索引。
b:NullPointerException:空指针异常
原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。
6.数组中的基本写法
- 遍历,反遍历和最值
//通过循环来遍历数组
int[] arr4 = {1, 2, 3, 4, 5, 6, 7, 8};
for (int i = 0; i < arr4.length; i++) {
System.out.println(arr4[i]);
}
System.out.println("---------------------------------------");
//反向遍历
for (int i = arr4.length - 1; i >= 0; i--) {
System.out.println(arr4[i]);
}
System.out.println("---------------------------------------");
//获取最大值
int max = getMax(arr4);
System.out.println(max);
}
public static int getMax(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > arr[0]) {
max = arr[i];
}
}
return max;
}
- 反转和查找
1.反转(元素对调)
//采用中间变量进行反转
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
for (int i = 0; i < arr.length/2; i++) {
int t=arr[i];
arr[i]=arr[arr.length-1-i];
arr[arr.length-i-1]=t;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
2.数组查表法(根据键盘录入索引,查找某些东西)
public static void main(String[] args) {
//输入索引查找今天时周几
String[] week = {"周一", "周二", "周三", "周四", "周五", "周六", "周天"};
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个1--7的索引:");
int num = sc.nextInt();
String str = Getday(num, week);
System.out.println("结果是:" + str);
}
public static String Getday(int num, String[] week) {
String ele;
if (num > 0 && num < 8) {
ele = week[num - 1];
} else {
ele = "你输入的索引不正确";
}
return ele;
}
3.根据元素查索引(查询一数再数组中第一次出现的位置)
public static void main(String[] args) {
int arr[] = {11, 32, 55, 47, 55, 79, 23};
Scanner scanner = new Scanner(System.in);
System.out.println("选择你要查询的数:");
int num = scanner.nextInt();
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
System.out.println(num + "在数组中第一次出现的位置是:" + i);
break;
}
}
}
若要输入字符串与字符串相等就要用equals.
Java语言基础二维数组
二维数组其实就是一维数组里面加一维数组
就相当于一个文件夹里面可以储存东西,而二维数组就相当于这个文件夹里面储存了一堆另外的文件夹然后被储存的文件夹里面还可以放其他需要储存的。就跟个矩阵一样不仅有行还有列
1.二维数组的格式和概述
数据类型[][] 变量名 = new 数据类型[m][n];
m表示这个二维数组有多少个一维数组 必须写上
n表示每一个一维数组的元素个数 可不写
不写即为
数据类型[][]变量名= new数据类型[m][]
这个样子没有直接给出一维数组里元素的个数
注意事项:还有两种格式不推荐
a:数据类型 数组名[][] = new 数据类型[m][n];
b:数据类型[] 数组名[] = new 数据类型[m][n];
int[] x,y [];//是定义了两个数组,一个一维数组x和一个二维数组y。
写一个二维数组的程序然后分析
int[][] arr = new int[3][];
//3后面这个框可填可不填,不填的情况和填了是不一样的
System.out.println(arr[0]);
arr[0] = new int[]{1, 2, 3};
arr[1] = new int[2];
arr[2] = new int[3];
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("---------------------");
boolean[][] boolean1=new boolean[3][];
boolean[] booleans={true,false};
boolean[] booleans1={false,true};
boolean[] booleans2={true,true};
boolean1[0]=booleans;
boolean1[1]=booleans1;
boolean1[2]=booleans2;
System.out.println(boolean1[booleans.length-1][booleans2.length-1]);
}
输出结果是
null
[I@1540e19d
[I@677327b6
[I@14ae5a5
---------------------
true
第一个输出的是null因为还没有给数组内赋数组所以是null,然后开始赋值赋值3个,但是3个都是数组所以输出的不是其里面的值而是这个数组的地址,所以输出了三个不同的地址。输出boolean类型的时候给二维数组中的每一个元素都进行了赋值所以赋值完输出的是最后一个数即true
二维数组还有个简单的写法即格式三
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
这个格式属于静态初始化:由我们指定具体的元素值,由系统给分配长度
2.二维数组的练习
- 二维数组的遍历
int[][] arr3 = new int[][]{{1, 2}, {2, 3, 4}, {3, 4}};
//二维数组的遍历(循环)
for (int i = 0; i < arr3.length; i++) {
for (int i1 = 0; i1 < arr3[i].length; i1++) {
System.out.print(arr3[i][i1]+" ");
}
System.out.println(" ");
通过这个方式就可以把一个二维数组中所有的单个元素全部输出。并且表达出来
- 二维数组的求和(我们写个杨辉三角的例题)
public static void main(String[] args) {
// 需求:打印杨辉三角形(行数可以键盘录入)
//
// 1
// 1 1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1
// 1 5 10 10 5 1
Scanner sc = new Scanner(System.in);
System.out.println("请输入行数:");
int n = sc.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < arr.length; i++) {
arr[i][0] = 1;
arr[i][i] = 1;
}
for (int i = 2; i < arr.length; i++) {
for (int j = 1; j <= i; j++) {
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 <= i; j++) {
System.out.print(arr[i][j]+"\t");
}System.out.println();
}
}
这是个可以键盘录入行数的杨辉三角源代码
- Java中参数传递问题
Java基础递归问题
1.递归的概念和注意事项
A:递归概述: 方法定义中调用方法本身的现象
B:递归注意事项
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
2.用一个很典型的题来解释递归
即不死神兔问题
不死神兔即又是用了(斐波那契数列)
A:案例演示: 需求:兔子问题(斐波那契数列)
有一对兔子,从出生后第3个月起每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
由此可见兔子对象的数据是:1 , 1 , 2 , 3 , 5 , 8 ...
源代码是
public static void main(String[] args) {
System.out.println("兔子经过20个月有" + TuZi(20) + "个");
}
public static int TuZi(int sum) {
if (sum == 1 || sum == 2) {
return 1;
} else {
return TuZi(sum - 1) + TuZi(sum - 2);
}
}
输出结果是
兔子经过20个月有6765个
这个源代码是表现了递归的思想,即在方法中调用方法本身也就是自己返回自己,但是一定要有出口,这个出口就是
if (sum == 1 || sum == 2) { return 1;}所以根据题目要求可以写出这个源代码。