hgl125 2015-03-18 14:33 采纳率: 14.3%
浏览 2424
已采纳

Java对象引用指向的问题

有以下代码:
package com.lzw;
import java.util.*;
public class UpdateStu implements Comparable{
String name;
long id;
public UpdateStu(long id, String name) {
this.id = id;
this.name = name;
}
public int compareTo(Object o) {
UpdateStu upstu = (UpdateStu) o;
int result = id > upstu.id ? 1 : (id == upstu.id ? 0 : -1);
return result;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
UpdateStu stu1 = new UpdateStu(112,"李同学");
UpdateStu stu2 = new UpdateStu(113,"陈同学");
UpdateStu stu3 = new UpdateStu(114,"王同学");
UpdateStu stu4 = new UpdateStu(115,"马同学");
UpdateStu stu5 = new UpdateStu(116,"赵同学");
TreeSet tree = new TreeSet();
System.out.println("对象tree的地址:"+tree);
tree.add(stu1);
System.out.println("对象stu1对象的地址:"+stu1);
tree.add(stu2);
System.out.println("对象stu2对象的地址:"+stu2);
tree.add(stu3);
System.out.println("对象stu3对象的地址:"+stu3);
tree.add(stu4);
System.out.println("对象stu4对象的地址:"+stu4);
tree.add(stu5);
System.out.println("对象stu5对象的地址:"+stu5);
Iterator it = tree.iterator();
System.out.println("迭代器it(指向)的地址:"+it);
System.out.println("tree.iterator()返回的地址:"+tree.iterator());
System.out.println("Set集合中的所有元素:");
int i=0;
while (it.hasNext()) {
String []dd={"stu1","stu2","stu3","stu4","stu5"};
UpdateStu stu = (UpdateStu) it.next();
System.out.println("stu->"+"对象"+dd[i]+"的地址:"+stu);
System.out.println(stu.getId() + " " + stu.getName());
i++;
}
it=tree.headSet(stu3).iterator();
System.out.println("截取前面部分的集合:");
while (it.hasNext()) {
UpdateStu stu = (UpdateStu) it.next();
System.out.println(stu.getId() + " " + stu.getName());
}
it = tree.subSet(stu2, stu3).iterator();
System.out.println("截取中间部分的集合");
while (it.hasNext()) {
UpdateStu stu = (UpdateStu) it.next();
System.out.println(stu.getId() + " " + stu.getName());
}
}
}
在Java语言里没有指针(地址)的概念,只用引用的概念,但是引用本身就是一个指向new分配的对象地址(希望我没有理解错误),现在问题来了:
1、为什么System.out.println("对象tree的地址:"+tree); 输出的是:[]

2、为什么System.out.println("迭代器it(指向)的地址:"+it);输出的是:”java.util.TreeMap$KeyIterator@5c647e05“与System.out.println("tree.iterator()返回的地址:"+tree.iterator());输出的:”java.util.TreeMap$KeyIterator@33909752“地址不一样?

  • 写回答

1条回答 默认 最新

  • danielinbiti 2015-03-18 15:44
    关注

    1、为什么System.out.println("对象tree的地址:"+tree); 输出的是:[]
    因为最终调用的是tostring,treeset的默认tostring方式是遍历内部对象,如果没有对象返回"[]",看源码就知道了。

    2、为什么System.out.println("迭代器it(指向)的地址:"+it);输出的是:”java.util.TreeMap$KeyIterator@5c647e05“与System.out.println("tree.iterator()返回的地址:"+tree.iterator());输出的:”java.util.TreeMap$KeyIterator@33909752“地址不一样?

    tree.iterator()最终调用treemap的keyiterator的方法,源码是中返回结果是new出来的,所以前后两次不一样。
     Iterator<K> keyIterator() {
            return new KeyIterator(getFirstEntry());
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)