1.java中棧區里面的數據是共享的,但是不同與C語言里面的多個指針指向同一個變量可以修改變量值,在Java中,當定義一個變量時候,編譯器會首先去查找該變量的值是否存在于棧區,如果有,直接將變量的引用指向該值,否則新創建一個值并讓變量指向它。
int a=3; int b=3;//a,b同時指向3 a=5; System.out.PRintln(b);//輸出為3所以當修改某個變量的值的時候(a=5),就會改變原引用的指向(a:3->5),但是不會影響其他的指向原值的引用(b=3);
2.Java中內存分為堆內存(new出來的對象放在這里)和棧內存(基本數據類型創建的變量都放在這),棧內存的變量的存取比堆內存快。
3.字符串的創建,一種是從字符串池創建(String s=“abc”;),另一種是從堆創建(String s=new String("abc");)
字符串池的速度快,每個串都是唯一的,如果定義的對象已經位于串池,直接將變量引用指向該串,不創建新的串;否則創建新的串,并將變量引用指向該串;String a="csdn"; String b="csdn"; System.out.println(a==b);//輸出為true,//“==” 用來比較變量的引用是否相同; “equals()” 方法使用來比較變量引用里面的內容是否相同;輸出值為“true”說明他們的引用是相同的,也就是說,串池里面的每個內容是唯一的
堆創建,會首先檢查字符串池里面是否存在,如果有,直接復制到堆內,否則,在堆內創建一個串;String a=new String("csdn"); String b=new String("csdn"); System.out.println(a==b);//輸出false L1 System.out.println(a.equals(b));//輸出true L2堆內存創建的每個串,都是不同的對象,它們可能內容相同(L2),但是每個引用都指向不同的對象(L1);String a=new String("csdn"); String b="csdn"; System.out.println(a==b);//輸出為false L1 System.out.println(a.equals(b));//輸出為true L2使用不同的方式創建串,即使引用指向的內容是相同的(L2),引用也不會相同(L1)
新聞熱點
疑難解答