A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© DoubleUUU 中级黑马   /  2015-11-18 22:09  /  574 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class StringDemo{
  2. public static void main(String[] args){
  3. String s1 = "abc";
  4. String s2 = new String("abc" );
  5. System.out.println(s1 == s2);
  6. }
  7. }
复制代码
这个程序运行的结果是False,解释的是S1的对象是存储在常量池中,而S2的对象是存在堆中,为什么这两个对象要存在不同的内存中啊?
还有,大牛能不能科普下java的内存机制?栈、堆、方法区、还有现在这个常量池都分别用来存储什么?

7 个回复

倒序浏览
java.exe运行时首先是编译成的字节码文件(.class)文件存储在方法区中,当运行到main时就会在栈内生成一个区存放给定的s1,而s2会在new的作用下在堆中开辟空间存放abc,地址值是不一样的
回复 使用道具 举报
wx_YXxWrUwd 来自手机 中级黑马 2015-11-19 01:34:04
藤椅
今天刚讲到这些东西 看完回复感觉理解了点
回复 使用道具 举报
那个equals是把Object父类中的equals方法重写了,String方法中比较的是字符串是否相同
回复 使用道具 举报
"abc"是存储在堆区的String对象;new String("abc")是在堆区再创建一个对象,其存储"abc"对象在堆区的地址值。个人看法
回复 使用道具 举报
S1是一个对象,S2是2个对象,地址值不同,肯定是flase
回复 使用道具 举报
s1为什么存在常量池中啊,不懂诶,求大神解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马