Java基础-堆栈

1.栈:存取速度比堆要快,速度仅次于CPU中的寄存器,栈中的生存期是确定的,栈数据可以共享
所有的基本类型和引用类型都存在于栈中,通常用于保存方法中的参数和局部变量
2.堆:可以动态分配内存,生存期可以不确定,垃圾回收可以自动回收
所有通过New()的方法创建出来的对象都存放余堆中
Java中6个不同的放可以存放存储数据
1.寄存器,速度最快,但是数量有限,只能由编译器根据需求进行分配
2.堆栈,速度仅次于寄存器
3.堆,存放new出来的对象
4.静态存储:这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。
5. 常量存储(constant storage)。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中 
6. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。


【栈中存有堆中对象的引用地址,这个堆对象不会被标记为'垃圾】
先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处 理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。 
特别注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另 一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例,我们定义完 a与b的值后,再令a=4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地 址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值
我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,我们创建了String类的对象str。担心陷阱!对象可能并没有被创建!唯一可以肯定的是,指向 String类的引用被创建了。至于这个引用到底是否指向了一个新的对象,必须根据上下文来考虑,除非你通过new()方法来显要地创建一个新的对象。因 此,更为准确的说法是,我们创建了一个指向String类的对象的引用变量str,这个对象引用变量指向了某个值为"abc"的String类
public class StackAndHeap {


    public static void main(String[] args) {
       //基本数据类型对象和值都存放在栈中,
       int a =1;
       int b =1;
       System.out.println("a==b"+(a==b));
       //String 直接使用赋值的方式,对象和字符串值也是存放在栈中
       String aa ="aa";
       String bb ="aa";
       //== 比较的是对象的引用
       System.out.println("aa==bb"+(aa==bb));
       System.out.println("aa:"+aa+"|bb:"+bb);
       //单独改变aa/bb不会对其他值有影响
       bb="aa1";//此时会在栈中创建一个“aa1”然后建对象bb只想"aa1"【栈中的数据是共享的】
       System.out.println("aa:"+aa+"|bb:"+bb);
       
       //String使用new的方式来创建,会在创建的对象会存在堆中
       String cc = new String("aa");
       System.out.println("aa==cc:"+(aa==cc));
       //使用new的方式创建的String不能使用==来比较,因为new的时候会在堆中创建两个“aa”,对象指向的引用地址不同
       String dd = new String("aa");
       System.out.println("dd==cc:"+(dd==cc));
       System.out.println("==================");
       String A1 ="A1";
       String A2=A1;
       System.out.println("A1:"+A1+"|A2:"+A2);
       A1="AA1";
       System.out.println("A1:"+A1+"|A2:"+A2);
       System.out.println("==================");
       /*String B1 = new String("B1");
       String B2=B1;
       System.out.println("B1:"+B1+"|B2:"+B2);
       B1 = new String("BB2");
       System.out.println("B1:"+B1+"|B2:"+B2);*/
       System.out.println("==================");
       String B1 = new String("B1");
       String B2=B1;
       System.out.println("B1:"+B1+"|B2:"+B2);
       B1 = "BB2";
       System.out.println("B1:"+B1+"|B2:"+B2);
       
    }


}

你可能感兴趣的:(java基础)