Java基础 数组;内存分配;内存图

55 篇文章 0 订阅
37 篇文章 0 订阅

数组

概述:数组是存储同一种数据类型多个元素的集合,也可以看成是一个容器。可以存储基本数据类型和引用数据类型。

一、一维数组

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、二维数组的内存图

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值