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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© iWilliam 中级黑马   /  2014-6-8 21:30  /  3961 人查看  /  29 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有这么一段代码
                List list1 = new ArrayList<String>();
                List<Integer> list2=list1;
                list1.add("2");
                list2.add(3);
                System.out.println(list2.get(0));
                System.out.println(list2.get(1));
                System.out.println(list1.get(0));
                System.out.println(list1.get(1));
                System.out.println(list1 == list2);


运行结果:
2
3
2
3
true


求大神给详细解释下~

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

29 个回复

倒序浏览
你明白引用类型吗??相当于一个指针,list1和list2是指向同一个list,所以它们操作同一个list,最后那个TRUE是因为它们比较的是地址,也就是指向同一个list的地址。
回复 使用道具 举报
woshihq 发表于 2014-6-8 21:35
你明白引用类型吗??相当于一个指针,list1和list2是指向同一个list,所以它们操作同一个list,最后那个TR ...

我想他的问题不是侧重是不是指向同一个list,而是那个泛型<String>和<Integer>。
回复 使用道具 举报
哎,我忙了一个月毕业论文,刚刚答辩完,今天才上论坛,好多都忘了。。
没有帮到你,不好意思。

点评

不用这么客气啦~  发表于 2014-6-8 22:02
回复 使用道具 举报
2528870651 发表于 2014-6-8 21:38
我想他的问题不是侧重是不是指向同一个list,而是那个泛型和。

我觉得从内存上分析,应该比较容易理解,但是感觉我的理解还是不太对
回复 使用道具 举报
对,其实我想问的就是那个String和Integer的问题
回复 使用道具 举报
2528870651 发表于 2014-6-8 21:40
哎,我忙了一个月毕业论文,刚刚答辩完,今天才上论坛,好多都忘了。。
没有帮到你,不好意思。 ...

哦,你的头像是哪个理工大学的
回复 使用道具 举报
我的理解是,泛型是给编译器使用的,在编译成.class文件后会进行类型擦除,在ThinkJava4里面有说,擦除后就成了List list1 = new ArrayList();和Lit list2 = list1;==比较的是地址,而他们的地址引用是一样的,加上这句话System.out.println(list1.equals(list2));我原本以为返回的应该是flase,以为equals比较的是内容嘛,但是结果为true,后来想了下应该此时List里面的是Object吧,如有不对的地方,期望下面的同学指正哈,小弟在这先谢过了

点评

类型擦除我貌似有点印象,嗯,应该是这方面的原因,谢过~  发表于 2014-6-8 22:03

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
iWilliam 发表于 2014-6-8 21:56
哦,你的头像是哪个理工大学的

恩呢,武汉的
回复 使用道具 举报
List list1 = new ArrayList<String>();    //告诉编译器list1可以存任何对象
List<Integer> list2 = list1;                //list2只能存放Integer对象或整数
回复 使用道具 举报
有这么一段代码
                List list1 = new ArrayList<String>();//父类接口指向子类对象其实应该这么写List<String> list1 = new ArrayList<String>();
                List<Integer> list2=list1;//小的这句还真的没看懂是什么意思
                list1.add("2");//这个是向集合中添加元素:字符串对象
                list2.add(3);//自动装箱动作,添加的是Integer对象
                System.out.println(list2.get(0));//获取元素,因为List集合有序
                System.out.println(list2.get(1));
                System.out.println(list1.get(0));
                System.out.println(list1.get(1));
                System.out.println(list1 == list2);


运行结果:
2
3
2
3
true

少侠,我就这么一看,怎么感觉你像是传智预热班的呢?

点评

吼吼,这个问题可不是你想象的那么简单哦~  发表于 2014-6-8 22:31
回复 使用道具 举报
本帖最后由 钟成军 于 2014-6-8 22:13 编辑

你确定能运行?为什么我的会报错啊,这样写应该是不行的啊

Exception in thread "main" java.lang.Error: 无法解析的编译问题:
类型不匹配:不能从 ArrayList<String> 转换为 List
类型 List 不是通用的;不能使用参数 <Integer> 将它参数化
没有为类型 List 定义方法 get(int)
没有为类型 List 定义方法 get(int)

at itcast.cn.uploadPic.Fanxin.main(Fanxin.java:12)

点评

编译级别1.7  发表于 2014-6-8 22:13
回复 使用道具 举报
钟成军 发表于 2014-6-8 22:12
你确定能运行?为什么我的会报错啊,这样写应该是不行的啊

Exception in thread "main" java.lang.Error:  ...

我的也是1.7的啊

点评

必须能运行吖  发表于 2014-6-8 22:17
回复 使用道具 举报

不好意思,是我导错了List包,导成了
import java.awt.List;:lol

点评

这个貌似跟编译级别无关,1.5也行的~  发表于 2014-6-8 22:35
回复 使用道具 举报
我郁闷了,你这样的泛型都行,有点颠覆我的java泛型认知了
回复 使用道具 举报
java木 发表于 2014-6-8 22:27
我郁闷了,你这样的泛型都行,有点颠覆我的java泛型认知了

我也有种错觉,所以来求大神指点指点~
回复 使用道具 举报
这就分编译和运行了,编译只考虑语法,运行时,泛型是被jvm去掉的,也就是运行没有泛型的概念,你语法没有错,编译不会报错的,运行时没有泛型的,张老师视频有讲。

点评

嗯,就是泛型擦除的原因~  发表于 2014-6-8 23:00
回复 使用道具 举报
本帖最后由 luoanjade 于 2014-6-8 22:49 编辑

学习了,这个问题,我之前没有见过!
针对你这个问题,我到网上找了一下,找到了一篇文章:Java中泛型是类型擦除的http://blog.csdn.net/hui_lang/article/details/7552564

点评

thank u~  发表于 2014-6-8 22:57
回复 使用道具 举报
原来是这样
回复 使用道具 举报
学习了~~~
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马