很显然在两个地方 int i=10; int j=10; 如果来一个i++怎么办?!要在一个地方还乱套了呢! String s1="123"; String s2="123"; 这两句是在同一个地方,String常量池中
同意,补充一下: int i=10;和int j=10; 如果是在类中定义的,那么i和j将作为类实例对象在JVM运行过程中创建的对象所在的堆中存放值。 如果是在方法中定义的,那么i和j是局部变量,将在方法运行的过程中创建该方法的栈帧,并在操作数栈中短暂的存储其值,当方法运行结束后,栈帧空间将被回收掉。无论在哪里,i和j都对应了两个不同的内存空间。这一点和String s="123"的常量内存结构是不同的。关于String,还是老生常谈,看看文章吧:《String in Java》
建议读一下《深入JVM》这本书,里面讲的很详细。1,"==" 运算符,对于基础数据类型,比较的就是值,而不是内存地址,对于复杂类型,比如自定义的对象,比较的就是地址。2,equals()方法,默认的实现也是比较地址,不过在String类中重写了,所以string.equals("")比较的是值而不再是地址3,对于int i=10; int j=10; 这种定义,10是作为一个常量,放在常量池中的,但是i、j本身不是存在同一个地址的,相当于int i = 1; int j = 10; 1,10在常量池里,而i,j不是同一个地址 也就是说,1,10这些值只会保存一份,而i、j这些变量则不是。好像是这么回事
首先它会在栈中创建一个变量为i的引用,然后查找栈中是否有10这个值,如果没找到,就将10存放进来,然后将i指向3。接着处理int j = 10;在创建完j的引用变量后,因为在栈中已经有10这个值,便将j直接指向10。这点和堆内存是一样的。
int i=10;
int j=10;
如果来一个i++怎么办?!要在一个地方还乱套了呢!
String s1="123";
String s2="123";
这两句是在同一个地方,String常量池中
同意,补充一下:
int i=10;和int j=10;
如果是在类中定义的,那么i和j将作为类实例对象在JVM运行过程中创建的对象所在的堆中存放值。
如果是在方法中定义的,那么i和j是局部变量,将在方法运行的过程中创建该方法的栈帧,并在操作数栈中短暂的存储其值,当方法运行结束后,栈帧空间将被回收掉。无论在哪里,i和j都对应了两个不同的内存空间。这一点和String s="123"的常量内存结构是不同的。关于String,还是老生常谈,看看文章吧:《String in Java》
拿 i 和j 在不同的内存地址中,为什么实用 “==”的时候却能比较出来了?
实际上我是由于 "==" 和 equels这个问题演化而来的问题。。感觉的无比郁闷!
对于应用类型,默认比较的是地址,除非重写equals方法了
忘各位继续解答 谢谢。
int j=10;
这种定义,10是作为一个常量,放在常量池中的,但是i、j本身不是存在同一个地址的,相当于int i = 1;
int j = 10;
1,10在常量池里,而i,j不是同一个地址
也就是说,1,10这些值只会保存一份,而i、j这些变量则不是。好像是这么回事