java的栈内存中基本数据类型的内存比较问题

梦觉游仙 2020-07-26 08:23:54
最近研究JVM,发现成员变量的基本数据类型是存在常量池中的。而局部变量的基本数据类型是存在栈中的。
这两个的内存地址按照道理来说应该不是一个。
那么为啥他们用 “==” 比较,还会返回true?
public class AAA {

int tc=1231;

void compare(){
int t1=1231;
System.out.println(t1==tc);
}

public static void main(String[] args) {
new AAA().compare(); //true
}
}
...全文
6016 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
梦觉游仙 2020-07-29
  • 打赏
  • 举报
回复
引用 5 楼 大圣 的回复:
最后的比较操作,肯定是从栈中pop出两个数进行比较,程序运行过程中,一直是利用栈来执行命令的,常量池与栈是有相关的字节码指令来操作的,可以将常量池中的数据放到栈中;两个基本类型的值比较,肯定是相等的;如果是两个Integer比较,如果采用了自动装箱操作,而且比较的又是 大于-128小于127的数字,结果应该也是相等的,如果是大于127的,就不相等了


的确。我也觉得这两是被压到栈中进行的比较。无奈,jvm的字节码的时候死活都验证不出来。 大神可以用字节码指令的案例解释的下不? 实在是搞不懂我哪点分析错了。
案例:
public class AAA {
int t=9;
public void testAddOperation(){
int j=9;
boolean tb=(t==j);
}
}
无名一小卒 2020-07-27
  • 打赏
  • 举报
回复
使用=,好像会先去常量池里找,有的话直接返回了,不new 的是相等的
廾匸随笔 2020-07-27
  • 打赏
  • 举报
回复
你再怎么绕最后你依旧使用==在进行两个基本数据类型的比较,那最终就回到了常量池VS常量池。如果不等于,那才是问题大了
大圣 2020-07-27
  • 打赏
  • 举报
回复 1
最后的比较操作,肯定是从栈中pop出两个数进行比较,程序运行过程中,一直是利用栈来执行命令的,常量池与栈是有相关的字节码指令来操作的,可以将常量池中的数据放到栈中;两个基本类型的值比较,肯定是相等的;如果是两个Integer比较,如果采用了自动装箱操作,而且比较的又是 大于-128小于127的数字,结果应该也是相等的,如果是大于127的,就不相等了
lkj2016 2020-07-26
  • 打赏
  • 举报
回复
Java中存在整数(Integer 对象,而非基本类型)pool。在Java中1字节大小以内的Integer(0-127)都是存在一个常量池中的,(不包含new Integer(xx)初始化),所以他们的引用也是相同的。
  • 打赏
  • 举报
回复
基本类型比较值,引用类型比较地址

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧