java内存中数据存储位置

2018-09-05  本文已影响40人  第四风111

java内存分配

存储位置

int i=5;
int j=5;

那么这段程序中,内存发生了什么变化呢,首先会开辟一个i的存储区,然后会检查栈中有没有5这个值,如果没有,则保存到栈中,然后让i=5,接着开辟一个j的存储区,检查栈中是否有5,如果有,这直接让j=5。即所谓的栈内数据共享。

String s1 = "abc";
String s2 = new String(“abc”);
  1. String s = ”abc“的工作过程可以分为以下几个步骤:
    (1)定义了一个名为"s"的String类型的引用。
    (2)检查在常量池中是否存在值为"abc"的字符串对象;
    (3)如果不存在,则在常量池(字符串池)创建存储进一个值为"abc"的字符串对象。如果已经存在,则跳过这一步工作。
    (4)将对象引用s指向字符串池当中的”abc“对象。
  2. String s = new String(”abc“)的步骤则为:
    (1)定义了一个名为"s"的String类型的引用。
    (2)检查在常量池中是否存在值为"abc"的字符串对象;
    (3)如果不存在,则在常量池(字符串池)存储进一个值为"abc"的字符串对象。如果已经存在,则跳过这一步工作。
    (4)在堆中创建存储一个”abc“字符串对象。
    (5)将对象引用指向堆中的对象。
    这里指的注意的是,采用new的方式,虽然是在堆中存储对象,但是也会在存储之前检查常量池中是否已经含有此对象,如果没有,则会先在常量池创建对象,然后在堆中创建这个对象的”拷贝对象“。这也就是为什么有道面试题:String s = new String(“xyz”);产生几个对象?的答案是:一个或两个的原因。因为如果常量池中原来没有”xyz”,就是两个。
class BirthDate {    
       private int day;    
       private int month;    
       private int year;        
       public BirthDate(int d, int m, int y) {    
           day = d;     
           month = m;     
           year = y;    
       }    
       省略get,set方法………    
   }    
       
   public class Test{    
       public static void main(String args[]){    
            int date = 9;    
            Test test = new Test();          
            test.change(date);     
            BirthDate d1= new BirthDate(7,7,1970);           
       }      
       
       public void change1(int i){    
           i = 1234;    
       }    
上一篇下一篇

猜你喜欢

热点阅读