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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马一刘昭 高级黑马   /  2013-5-15 16:49  /  2201 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马一刘昭 于 2013-5-15 21:40 编辑

代码:

class kiop
{
        public static void main(String[] args)
        {
                int i = 9;
                int k = 9;
                Integer h = new Integer(523);
                Integer p = new Integer(523);
                System.out.println(i == k);
                System.out.println(h == p);
                h = 12;
                p = 12;
                System.out.println(h == p);
                h = 1200;
                p = 1200;
                System.out.println(h == p);
        }
}

---------- 运行Java ----------
true
false
true
false

输出完成 (耗时 0 秒) - 正常终止


求从内存分配角度讲解,什么堆啊栈啊不理解,谢谢!



16 个回复

倒序浏览
    这个int类型的 在 -128到 127之间的数值都会出现在 data segment中   所以可以相等
class kiop
{
        public static void main(String[] args)
        {
                int i = 9;                                              //这里在 data segment中创建了一个 9;
                int k = 9;                                              //  因为已经创建过了  所以  k指向的也是这个9
                Integer h = new Integer(523);           //这里是new出来的对象 指向 data segment中的 523  h在栈内存中
                Integer p = new Integer(523);           // 这里也是new出来的对象
                System.out.println(i == k);            //这里指向同一个数值 肯定为true
                System.out.println(h == p);       // 这里的对象都不相同肯定为false
                h = 12;                                   //同样在 data segment 中 有了一个12
                p = 12;
                System.out.println(h == p);            //所以这里为true
                h = 1200;                         //因为数值h大于127  所以 这个和下面的p 不是同一个
                p = 1200;
                System.out.println(h == p);               所以为false
        }
}

回复 使用道具 举报
这个建议你把毕老师的视频认真看看。
回复 使用道具 举报
楼上的说的很对, 就是有一点不全
Integer i = 12;
Integer i = 12;
在 -128 到 127范围内, 用 == 比较都为true
超过这个范围的用 == 比较就用false, 暂时你就记个结论吧!!  等以后了, 自己看看源码你就明白了!!
回复 使用道具 举报
花开花落总相似 发表于 2013-5-15 17:32
这个int类型的 在 -128到 127之间的数值都会出现在 data segment中   所以可以相等
class kiop
{

String a = "123";
String b = "123";
System.out.println(a == b);//结果为true

String a = "123";//创建它的时候调用内存给分配空间了吗?
String b = new String ("123");//这个创建它的时候调用内存给分配空间了吗?
System.out.println(a == b);//结果为false

这两个能给我具体说下吗?
回复 使用道具 举报
xuemeng 发表于 2013-5-15 18:02
楼上的说的很对, 就是有一点不全
Integer i = 12;
Integer i = 12;

int i ;声明后是不是java就给i分配内存空间了,这个空间是栈内存还是堆内存?

int a = 2;
int b = 2;
a==b;
这时候a和b比较的是什么?谢谢
回复 使用道具 举报
黑马一刘昭 发表于 2013-5-15 18:42
String a = "123";
String b = "123";
System.out.println(a == b);//结果为true

String a = “123";  这个直接在 data segment 里面有了个 "123"  
你第二个是new出来的对象  String b = new String("123");  这个其实是2个对象  首先 b在栈内存中 指向堆内存的 一个空间  然后 堆内存的空间又指向了 data segment 中的 "123"  就这样啦  这是我的理解   
回复 使用道具 举报
花开花落总相似 发表于 2013-5-15 18:52
String a = “123";  这个直接在 data segment 里面有了个 "123"  
你第二个是new出来的对象  String b = ...

1,这个data segment 是什么?不会是字面意思上说的字符段吧?
2,栈内存和堆内存有什么不一样?是用来存储什么的?谢谢
回复 使用道具 举报
黑马一刘昭 发表于 2013-5-15 18:49
int i ;声明后是不是java就给i分配内存空间了,这个空间是栈内存还是堆内存?

int a = 2;

这个是栈内存中, 比较的是值.  所以比较结果为true
回复 使用道具 举报
xuemeng 发表于 2013-5-15 19:11
这个是栈内存中, 比较的是值.  所以比较结果为true

那堆内存会在哪里用到?谢谢
回复 使用道具 举报
黑马一刘昭 发表于 2013-5-15 20:01
那堆内存会在哪里用到?谢谢

创建对象啊!
回复 使用道具 举报
xuemeng 发表于 2013-5-15 20:14
创建对象啊!

String  s = new String();
s = new String();

原句:再次新建一个对象,地址变了。
能不能解释下。谢谢!!
回复 使用道具 举报
推荐一本入门书籍 《疯狂java讲义》 有的地方还是讲的很透彻的。入门书籍。
回复 使用道具 举报
黑马一刘昭 发表于 2013-5-16 00:23
String  s = new String();
s = new String();

只要是new, 那么就是创建一个新的对象!!!
回复 使用道具 举报
不胖的胖子 发表于 2013-5-16 02:00
推荐一本入门书籍 《疯狂java讲义》 有的地方还是讲的很透彻的。入门书籍。 ...

谢谢亲,我会看看的!!
回复 使用道具 举报
其实我也有一本 PDF的 但做了 注释 。我个人觉得这本书还是蛮好的 。由于做了注释 , 怕给你阅读造成影响。 面向对象 还是毕姥爷的讲的好,建议你多看,重点是看多态。这本书讲的比较专业化,不是很通俗。但是当你对JAVA有较为深入的理解,你会发现,学语言不需要进行类比,那些专业化的描述反而更能说明问题。希望你在看视频的时候有一本参考书那是最好的,毕竟视频的内容你不可能记住那么多,做笔记压力也很大,我当初也是边看边记笔记,表示效果不好,脑子也塞满了。希望能帮到你。
回复 使用道具 举报
xuemeng 发表于 2013-5-16 02:45
只要是new, 那么就是创建一个新的对象!!!

你好,BigInteger a = new BigInteger("1");为什么BigInteger创建对象,赋值要加上“”呢?谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马