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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

安卓新手

中级黑马

  • 黑马币:3

  • 帖子:27

  • 精华:0

首先,我知道栈内存存放基本类型变量和对象的引用  堆内存存放new出来的对象和数组。
第一个问题,之前我看到一个题目,问创建对象个数。
String a="ABC"; //这条语句创建一个对象。(我的理解是在常量池中创建一个对象)
-------------------------------------------------------------------------------
String a=new String("ABC");//创建两个对象。(我的理解是就在堆内存里生成一个对象,为什么还会在常量池里生成第二个?)

第二个问题是关于java中指针。我的理解是Java程序运行时,堆内存和栈内存之间依靠指针来实现操作,具体就是存在由栈内存指向堆内存的指针(引用在栈,对象实体在堆,我们通过引用调用实体,这是我的理解)那么这样的话,我就能理解下面这个例子:
    String str1 = new String("ABC");
    String str2 = new String("ABC");
    System.out.println(str1==str2);//false
我的理解是因为两个堆内存对象没有指针链接,所以无法比较。
   那么为什么两个栈内存中的变量可以直接比较呢?
   而且由问题1,依照问题1的答案,new String()创建两个对象   包括一个常量池的对象,那么上面的这个例子列子应该创建3个对象--两个堆内存对象,1个常量池对象,即使没有指针,java为什么不能找到常量池对象 "ABC"=="ABC" 呢?

第三个问题,java中的堆内存 栈内存,和数据结构中栈的有什么联系?是否栈就是数据结构中后入先出的栈
堆就是二叉树

4 个回复

倒序浏览
先回答第三个问题,我的理解是不一样的,内存时JVM运行时开辟的空间,数据结构是存储数据的方式,两者根本就不是一个东西,怎么能一样。第一二个问题,我以前也查过资料,整理如下: String是一种特殊的包装类数据,它有两种创建方式:String s1=”ab”

String s2=new String(“ab”)

注:String s1=”ab”, 这种方法先在栈中创建一个对String类的对象引用变量s1,然后再去查找”ab”是否被保存在字符串常量池中,如果没有则在栈中创建两个char型的值’a’、’b’,然后在堆中创建一个String对象,它的值是刚才在栈中创建的两个char类型值组成的数组{‘a’,’b’},接着这个String对象object被存放进字符串常量池,最后将是是s1指向这个对象的地址,如果’ab’已经保存在常量池中,则在字符串常量值中找到值为’ab’的对象object,然后将s1指向这个对象的地址。

String s2=new String(“ab”),这种可以分解成两步1、Stringobject = "ab"; 2、String s = newString(object); 第一步参考第一种创建方式,而第二步由于"ab"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的两个char型值。
回复 使用道具 举报
libin 发表于 2015-7-27 13:13
先回答第三个问题,我的理解是不一样的,内存时JVM运行时开辟的空间,数据结构是存储数据的方式,两者根本 ...

多谢指点,说的很详细。另外栈内存中变量可以比较,是否是因为栈内存内值共享,如果是,这个共享是通过什么实现的呢?
回复 使用道具 举报
不是这样的,存储在堆内存中的对象也可以判断用==号判断,但是一般为false,因为不是同一个对象么,它们比较的是地址值,而不是单纯的内容是否一样。建议好好巩固一下基础知识,这样就能理解了。
回复 使用道具 举报
libin 发表于 2015-7-27 15:26
不是这样的,存储在堆内存中的对象也可以判断用==号判断,但是一般为false,因为不是同一个对象么,它们比 ...

谢谢,我刚想起来 ==用在对象比较的时候是比较哈希值的  在比较基本数据的时候比较的是值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马