黑马程序员技术交流社区

标题: 关于集合。。。 [打印本页]

作者: 史卜坤    时间: 2012-7-11 10:28
标题: 关于集合。。。
package execisetest;
import java.util.*;
public class CollectionTest {
        public static void main(String [] args){
                ArrayList al=new ArrayList();
               
                al.add(3);
                al.add("jacaa");               
                sop(al);               
        }
        public static void sop(Object obj){
                System.out.println(obj);
        }
}
al.add(3);
这里的3是不是装箱成了Integer对象?如果我想输出存储3的内存地址,可以吗?
作者: 孙新强    时间: 2012-7-11 11:04
import java.util.*;
public class CollectionTest {
        public static void main(String [] args){
                ArrayList al=new ArrayList();
               
                al.add(3);
               
                al.add("jacaa");               
                //sop(al);  
                for(Object obj:al){
                          System.out.println(obj);
                          if(obj.equals((Integer)3))
                          System.out.println(obj.hashCode());//我不太确定,仅供参考吧
                }
        }
   
        public static void sop(Object obj){
                System.out.println(obj);
                //System.out.println(obj.hashCode());//这样可以打印出集合的地址
        }
}
作者: 黄丽慧    时间: 2012-7-11 12:09
本帖最后由 黄丽慧 于 2012-7-11 12:11 编辑

1楼的 for方法里面的obj.equals((Integer)3)这个不对吧,我一开始也是跟一楼一样,用obj.hashCode()来打印集合的地址值,运行结果为603574a(十六进制的)。后来一看楼主想要打印的是元素3的内存地址值。于是我就把代码改成下面这样的了:
import java.util.*;
public class CollectionTest {
        public static void main(String [] args){
                ArrayList al=new ArrayList();
               
                al.add(3);
                al.add("jacaa");               
                sop(al);
                Iterator i=al.iterator();
                if(i.hasNext())
                {
                        Object o=i.next();
                        if(o instanceof Integer)
                        {
                                Integer in=(Integer)o;
                                if(in==3)
                                {
                                        System.out.println(in+"的内存地址为" + Integer.toHexString(in.hashCode())
);
                                }
                        }
                }
               
        }
        public static void sop(Object obj){
                System.out.println(obj);
        }
}

但是运行的结果是:
3的内存地址为3
我一下子就蒙了,上网查了很久也没有正解,我就想是不是因为JVM在给al对象分配内存空间时,分配的是一片连续的内存地址,各个元素按照顺序存放进去的。另外hashCode()只能取单个对象的内存,并不能取元素的内存地址。
期待高手正解。。。。。。。

作者: 陆强强    时间: 2012-7-11 13:02
import java.util.*;
class CollectionTest {
        public static void main(String [] args){
                ArrayList al=new ArrayList();
               
                al.add(3);
               
                al.add("jacaa");
        al.add("3");
                al.add(3.0);
                sop(al.get(0).hashCode());  //3              
                sop(al.get(1).hashCode()); //100881196
                sop(al.get(2).hashCode()); //51   
                sop(al.get(3).hashCode());//1074266112
                sop(al.hashCode());               
        }
        public static void sop(Object obj){
                System.out.println(obj);
        }
}
所以猜想整数的哈希码就是它本身
作者: 。_Smileヾ淡莣    时间: 2012-7-11 13:37
package execisetest;

import java.util.*;

public class CollectionTest {
        public static void main(String[] args) {
//        因为没有定制泛型所以类型还不确定;泛型是jdk1.5以后的新特性;
                ArrayList al = new ArrayList();
//这个地方使用了jdk1.5以后的新特性;自动拆装箱;这个地方使用了自动装箱;把int类型装成了integer类型;
                al.add(3);
                al.add("jacaa");
//                 sop(al);
                for (Object o : al) {
//                比较对象是否相同;
                        if (o instanceof Integer) {
                                Integer in = (Integer) o;
                                if (in == 3) {
                                        System.out.println(Integer.toHexString(in).hashCode());
                                }
                        }
                }
        }

        public static void sop(Object obj) {
                System.out.println(obj);
        }
}
是使用了自动装箱,为integer类型;可以得出3的地址值为51我也不知道是不是对的;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2