文章目录
- 数组
- 概述:数组是存储同一种数据类型多个元素的集合,也可以看成是一个容器。可以存储基本数据类型和引用数据类型。
- 一、一维数组
- 1、定义格式:
- 2、数组的初始化
- A:动态初始化
- B:静态初始化
- 3、数组操作中常见的问题
- 4、一维数组常用操作
- A:遍历数组
- B:获取数组中最大值
- C、数组元素反转(把元素对调)
- D:查表法(根据键盘录入索引,查找对应元素)
- E:元素查找
- 二、二维数组
- 1、定义格式
- 2、二维数组应用举例
- 2.1、二维数组的遍历
- 2.2、求和
- 2.3、杨辉三角
- 三、Java中的内存分配以及栈和堆的区别
- 四、数组内存图
- 1、Java中的参数传递问题及图解
- 内存图
- 2、三个引用2个数组
- 3、二维数组的内存图
数组
概述:数组是存储同一种数据类型多个元素的集合,也可以看成是一个容器。可以存储基本数据类型和引用数据类型。
一、一维数组
1、定义格式:
格式1:数据类型[] 数组名; 例:int[] arr;
格式2:数据类型 数组名[]; 例:int arr[];**
2、数组的初始化
概述:为数组中的数组元素分配内存空间,并为每个数组元素赋值。
A:动态初始化
概述:只指定长度,由系统给出初始化值
格式:数据类型[] 数组名 = new 数据类型[数组长度];
例:int[] arr=new int[2];//定义了一个int类型的数组arr,长度为2.
B:静态初始化
概述:给出初始化值,由系统决定长度
格式:数据类型 [] 数组名={元素1,元素2,元素3,......};
例:int[] arr={1,2,3,4};
3、数组操作中常见的问题
A:ArrayIndexOutOfBoundsException:数组索引越界异常
原因:你访问了不存在的索引。
B:NullPointerException: 空指针异常
原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。
4、一维数组常用操作
A:遍历数组
public class Example1 {
public static void main(String[] args) {
int arr[]={1,2,3,4,5,6}; //定义数组
for (int i = 0; i < arr.length; i++) { //循环遍历数组
System.out.print(arr[i]+"\t");
}
}
}
B:获取数组中最大值
public class GetMax {
public static void main(String[] args) {
int arr[]={1,2,3,4,5,6};
int max = getMax(arr); //调用获取最值得方法
System.out.println("该数组中的最大值为:"+max);
}
//定义获取最值得方法
public static int getMax(int[] arr){
int max=arr[0]; //给max赋初值
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max){
max= arr[i]; //将较大值赋给max
}
}
return max; //返回最大值
}
}
C、数组元素反转(把元素对调)
public class Alignment {
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7};
alignment(arr); //调用反转数组的方法
printArray(arr); //调用打印数组的方法
}
//定义反转数组的方法
public static void alignment(int arr[]){
for (int i = 0; i < arr.length/2; i++) {
//元素位置对调
int t = arr[i];
arr[i]=arr[arr.length-i-1];
arr[arr.length-i-1]=t;
}
}
//定义打印数组的方法
public static void printArray(int[] arr){
System.out.println("数组反转后为:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}
}
D:查表法(根据键盘录入索引,查找对应元素)
import java.util.Scanner;
//以查找星期为例
public class LookUpTable {
public static void main(String[] args) {
//键盘录入索引
Scanner scanner = new Scanner(System.in);
System.out.println("请输入索引 :");
int index= scanner.nextInt();
String[] week={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
String seek = seek(week, index); //调用查表方法,并获取返回值
if(!seek.equals("-1")){
System.out.println("您输入的索引对应的星期为:"+"\n"+seek);
}else{
System.out.println("您输入的索引不存在!");
}
}
//定义查表方法
public static String seek(String[] week,int index){
if(index>=1&&index<=7){
return week[index-1];
}else {
return "-1";
}
}
}
E:元素查找
//以用键盘录入星期查找元素为例
import java.util.Scanner;
public class MyDemo1 {
public static void main(String[] args) {
String[] weeks = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
//键盘录入星期
Scanner scanner = new Scanner(System.in);
System.out.println("请输入星期:");
String s = scanner.nextLine();
int num = search(s, weeks);//调用查找方法,并获取返回值
if(num!=-1){
System.out.println("你输入的星期对应的第一个元素是: weeks["+num+"]");
System.out.println("该元素的索引为:"+(num+1));
}else {
System.out.println("你输入的星期不存在...");
}
}
//定义查找方法
public static int search(String s,String[] weeks){
int num =-1;
for (int i = 0; i < weeks.length; i++) {
if(s.equals(weeks[i])){
num=i;
break;
}
}
return num;
}
}
二、二维数组
1、定义格式
格式1:数据类型[][] 数组名= new 数据类型[m][n];
例:int[][] arr=new int[3][2];
解释:这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2],每个一维数组有2个元素,可以通过arr[m][n] 来获取第m+1个一维数组的第n+1个元素.
格式2:数据类型[][] 变量名 = new 数据类型[m][];
注:m表示这个二维数组有m个一维数组,一维数组元素个数可以动态给出
格式3:数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
注:这个格式属于静态初始化:由我们指定具体的元素值,由系统给分配长度
格式4:数据类型 数组名[][] = new 数据类型[m][n];//不建议使用
格式5:数据类型[] 数组名[] = new 数据类型[m][n];//不建议使用
2、二维数组应用举例
2.1、二维数组的遍历
public class Traversing {
public static void main(String[] args) {
int[][] arr={{1,2,3},{4,5},{6},{7,8,9}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}
2.2、求和
案例演示
需求:求出公司每个季度销售总额及年销售总额
某公司按照季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
public class MyDemo {
public static void main(String[] args) {
int[][] arr = {{22, 66, 44}, {77, 33, 88}, {25, 45, 65}, {11, 66, 99}};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
int sum1=0;
System.out.print("第" + (i + 1) + "季度各月份销售额分别为(单位:万元):");
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
sum += arr[i][j];
sum1+=arr[i][j];
}
System.out.println();
System.out.println("总额为:"+sum1+"(万元)");
sum1=0;
}
System.out.println("全年销售总额为:" + sum + "(万元)");
}
}
2.3、杨辉三角
需求:打印杨辉三角形(行数可以键盘录入)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
.............
import java.util.Scanner;
public class YangHuiTriangle {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入行数:");
int n= scanner.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 < arr[i].length; 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中的内存分配以及栈和堆的区别
A:栈: 存放的是局部变量
局部变量:在方法定义中或者方法声明上的变量都是局部变量。
B:堆: 存放的是所有new出来的东西
特点:
a: 每一个new出来的东西都会为其分配一个地制值。
b: 每一个变量都有一个默认的值
byte,short,int,long -- 0
float,double -- 0.0
char -- '\u0000'
boolean -- false
引用数据类型 -- null
c: 使用完毕就变成了垃圾,等待垃圾回收器对其回收
C:方法区
D:本地方法区:(和系统相关)
E:寄存器:(cpu使用)
四、数组内存图
1、Java中的参数传递问题及图解
看程序写结果,并画内存图解释
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a: " + a + ",b: " + b);
change(a,b);
System.out.println("a: " + a + ",b: " + b);
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[1]);
}
public static void change(int a,int b) {
System.out.println("a: " + a + ",b: " + b);
a = b;
b = a + b;
System.out.println("a: " + a + ",b: " + b);
}
public static void change(int[] arr){
for(int x = 0 ; x < arr.length ; x++){
if(arr[x]%2 == 0){
arr[x] *= 2;
}
}
}
内存图
2、三个引用2个数组
3、二维数组的内存图