Bootstrap

程序内存分配 栈和堆

1.变量:基本数据类型在栈内分配空间:整形 int … 浮点型 double… 布尔类型 boolean 字符型 char

 int a = 1;

2.引用类型在堆内分配空间,同时在栈内分配引用的地址空间 都是对象,也就是引用类型,包括数组。
String底层是数组实现的,创建了新数组,所以string是引用类型。

 String hello = "hello";

在这里插入图片描述

Object obj=new Object();

当执行到new这个关键字,会在堆内存分配内存空间,并把该内存空间的地址赋值给栈内的一个空间。
引用类型的属性全部在堆内分配空间。

3.方法调用会将参数复制一份,并且与返回程序指针一起进栈,方法结束时将所有相关栈全部弹出

在这里插入图片描述

5.当双等于号两边是基本数据类型时,比较的是双等于号两边的两个值是否相等,当双等于号两边是引用类型时比较的是两个内存地址,也可以看成是看这两个引用是否指向堆内存里的同一块地址.

int a=1;
int b=1;
System.out.println(a==b);//输出为true

View view1=new View();
View view=new View();
System.out.println(view==view1);//为false 因为他们在堆中分配的地址不同

6.eqauls方法在比较String的时候,=比较的是值,而不是地址,因为String重写了Object的eqauls方法,而Object的equals方法,底层实现是”==“,比较引用类型时比较的是堆地址。

String c="1";
String d="1";
System.out.println(c==d);//输出为true
String e=c;
System.out.println(c==e);//输出为true

7.形如:

int[] a=new int[N];
...
a[i]=123;
...
int[] b=a;
...
b[i]=545;

这样的话 a[i]的值也会变成545
这种情况叫做起别名
数组名表示的是整个数组-----如果我们将一个数组变量赋予另一个变量,那么两个变量将会指向同一个数组
改变b[i] 也就是在堆中的数组值被改变了
如果你想复制一份数组,那么你应该创建一个新的数组来存放这些数据;

;