目录
01_java的内存分配
研究内存:应用(运行在内存中),方法变量数组什么都是创建在应用中当然也需要占内存,应用是怎么起来的就是一个个函数填充的。
011_⽅法的内存展示(会)
java的内存分区:
数据结构:
就是描述数据在磁盘当中实际存储的位置,它怎么存的。从逻辑和物理两个角度去描述它叫数据结构。
栈:
先进后出典型的逻辑结构
先进先出典型的逻辑结构 //这两种都是典型的数据结构
先进后出:
原因在栈里面执行的。(递归一旦没有出口栈溢出:内存泄露)
方法区:
把东西放在方法区不会消失除非把内存清掉。
本地方法区:
放外界c c++?,java在执行的时候并不是完全独立的语言,java是面向对象的,肯定是要用到一些面向过程的语言。#c语言就是非常典型非常基础的面向过程的语言。
java语言产生的时候其实是借鉴了一部分的C。
02_方法的内存处理
研究:这个方法是在程序中怎么加载的呢?
注意:
1,任何程序进来第一步都是要先去找main(它是入口对吧)(那找到main后怎么办呢?)
2,找到main之后会去执行main里面的代码(检测mian里面的函数)
3,跳进去执行getMax(执行完)
4,回到调用的位置(也就是getMax() ),接着再去执行main里面函数一直到main结束
你不懂运行流程,就bug一下(右键有两个选项 run运行 bug调试)
03_数组的定义
int a
int b
int c
为什么学习数组?为了一次性存放多个变量(存放100个学生)(而不需要定义100次)
什么是数组?容器
学习数组之前,我们只学了变量,返回值return只能返回一个值
学习了数组,它也只能返回一个值,但是当它返回数组的时候(数组里面有东西啊)(相当于一下子返回多个值)
一:数组的概念:是一个数据容器. 可以存储若干个相兼容的数据类型的数据. 1.数组中可以存储基本数据类型的数据, 也可以存储引用数据类型的数据. 2.数组的长度是不可变的,数组的内存空间是连续的. 一个数组一旦实例化完成,长度不能改变.
031_数组的创建
堆区和栈区操作明白了,有一个地方瞬间就懂了。我们说过数据类型是不是分成简单数据类型和引用数据类型。
简单和引用怎么区分呢?这个区分特别简单。
简单数据类型里边存的是值(直接存值)
引用数据类型里边存的是地址
所以现在能一眼告诉我,a(简单数据类型),b(应用数据类型)是什么数据类型?
这不就区分了吗?就这么点区分。
所以我们以前说半天,高级类型,高级类型,它里面存的就是地址憋。
033_数组的调用
咋们有了这层关系,我们如果再想去用数组的话,我们怎么办?#我不能直接取,我是不是借助b就行。(b存了数组的地址了,通过这个地址去找到数组)
我找到这个数组了,我还不能去找到这个空间吗?于是就能往里面取值存值。
学的时候:脑子要在想(我怎么能找到数组)(位置区别);你带着这个疑问去思考就懂了。
注意: 数组本身是没有地址的,数组就是一个容器。数组去保存地址的时候保存的是第一个元素的地址。 1,数组的内存空间是连续的,所以知道第一个元素地址,就知道后面的。 2,内存当中存的是对应字节(机器码) 3,存字节的话,由于数组是int的【int [] 】,所以意味着第一个元素存了4字节 计算机认识二进制0101,但是二进制太小了,学习八进制和十六进制的目的就是为了更好的表示二进制。所以以后看到的地址都是默认使用的是十六进制。 |
地址有这么难吗?也没那么难。说白了就是无奈之举。 如果所有的数据都能像int a =3;那样存储,谁不希望这么存。这么存多简单,存完了直接用a就可以拿这个值了。只是因为数组是容器(在堆区里面)。(b又在栈区里边)#你想用堆区的东西只能借助b去存储堆区的地址来间接的去找这个数组来干活。 在C当中,有个概念叫指针。什么叫指针?指针就是指向的意思。所以C当中去研究这个地址的时候就非常轻松形象。 java当中有没有这个概念?当然有。什么叫指向?上图“b保存数组的地址,那不就相当于我通过b是不是可以找到数组,不就相当于b有这么一根线指向数组的吗。” 那我只要想找这个数组,我就通过b拿数组的地址就行了。 |
new是一个方法,表示在堆中开辟一块儿空间,还会将数组的地址返回 (或者说以后你只要看到new开头的,那就代表在堆中开辟一块空间) int表示数组中存储的元素的类型 [数字],中括号中的数字表示当前数组能装/装有几个元素 刚刚初始化后的数组,内部没有元素,但是有默认值,默认值随着数组类型的不同而不同 比如:int --- 默认值0 boolean----默认值false String ---- 默认值 null(空) = 前面 int[] 是int数组类型,不能拆开 |
new是一个方法,功能一:表示在堆中开辟一块儿空间,功能二:还会将数组的地址返回。
int[] b = new int[3];
我们不是要把数组的地址扔到变量b里面吗?那new怎么扔过去?
咱们前面刚讲了方法,方法靠返回值。所以这个new方法,不仅在堆中开辟一块儿空间,并且把开辟空间之后把数组的地址返回值返回。
咋们把这个返回值就正好存到的变量b当中。
04_ 数组的基础
041_给数组赋值
下标法取值存值:b[ ]=值;
05_数组与方法的联合使用
这里讲一下实际的应用,可能有一点小难度。但是其实也不难前面我们已经把引用数据类型和简单数据类型说清了。
简单数据类型:直接存值
引用数据类型:数组地址
一个存地址,一个存值。
演示:数组与方法的联合使用
数组能作为参数?能作为参数的就是数据类型,只要是数据类型就能当做参数传递。
int [] 是不是数据类型? 是,它本身是数据类型,当然能作为一个参数去传递。
下面这个算法:
以数组为参数去传递,判断数中最大值的一个算法。
#arr和arr1指向的都是同一个数组,通过它们任何一个都是可以去操作数组的。
演示的重点: 告诉你数组是可以作为参数传递的,但是它传递的是数组的地址,不是数组本身。
把直接传值:值传递(称)
把传地址:地址传递(称)
这两种方法对这道提来说都是可以的,只不过上面传值,下边传地址
优点:简洁。你5个传参传5个写死,我不管别人有多少个参数直接把地址传进去(搞定全部)。
不管别人数据多少个,我就用一个地址操作他们。通用。
数组与方法的联合使用后续会经常使用,数组经常会保存一组数据作为参数传给对应的方法。
这就是我们所说的地址传递和值传递的区别。
06_可变长数组的使用
061_可变长参数
可变参数的意义:通过可变参数可以直接把想放在数组当中的几个值,扔到(),交给方法它会自动的去把它封装到数组当中。#简化代码
我们说类似计算,数组地址传递>值传递
但是也有不方便的地方
求和sum();
用传数组的方式sum(arr);
用传数组的方式那是不是得先定义数组
int[] arr=new int[]{3,4,5};
sum(arr);
但是这种也不简单,如果能直接把3,4,5拿这放在这,让它默认在一个数组当中。是不是更方便
sum(3,4,5); //报错
那怎么简化?直接把数组返回值放进来。
sum(new int[]{3,4,5});
其实是一样的,都是把数组的地址传进去,无非就是
c=a+b
a+b
那能不能写成sum(3,4,5); //报错 ,这样呢?
sum1(3,4,5);
//int...就相当于 int[]---可变参数(可变数组)
public static int sum1(int... arr){
return arr[0]+arr[1];
}
062_可变长参数注意点
1,也就是可变长参数后面不能放东西
(int...arr,int b)你搞什么鬼,可变长就表示了"无限量"参数,你再加一个参数进来无任何意义。
人家囊括你了。
但是前面可以放
(int b,int...arr) 按顺序走。//自己理解
2,两个方法重载,优先调用固定参数那个>可变长
07_二维数组和多维数组
071_一维数组
int[] arr1 = new int[]{3,4,5};
int[] arr11 = new int[2];
二维数组就是一种数组的数组,其本质上还是一个一维数组,只是它的数据元素又是一个一维数组
存储每个学生姓名,一维数组
存储学生姓名和每个学生对应的成绩:二维数组
存储每个学院每个系每个班......三维四维..数组