AlanJiang_NLP 2017-08-13 08:00 采纳率: 54.5%
浏览 1273
已采纳

java中this关键字的疑惑

this关键字表示当前的对象,按这种理解,下面的代码中就有点问题了,代码如下:

public class Person implements Comparable {
    private String name;
    private int age;

    public Person(String name, int i) {
        super();
        this.name = name;
        this.age = i;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Object o) {
        if (o instanceof Person) {
            Person p = (Person) o;
            int temp = this.age - p.age;//这里的this.age和p.age难道不是始终相等?
            return temp == 0 ? this.name.compareTo(p.name) : temp;
        }

        return 0;
    }

}


上述代码是给Person类加一个比较功能(先比较age,如果age相同则再比较name),通过实现Coparatable接口并重写compraTo()方法来实现,但是this.age和p.age不是应该始终相等吗?因为this表示当前Person的一个对象,而p也是当前Person类的一个对象,p和this的hash值应该是相同的,怎么这里表示的意思是不同,忘大神解释下?

  • 写回答

7条回答

  • 鼠晓 博客专家认证 2017-08-13 08:44
    关注
       public V put(K key, V value) {
            Entry<K,V> t = root;
            if (t == null) {
                compare(key, key); // type (and possibly null) check
    
                root = new Entry<>(key, value, null);
                size = 1;
                modCount++;
                return null;
            }
            int cmp;
            Entry<K,V> parent;
            // split comparator and comparable paths
            Comparator<? super K> cpr = comparator;
            if (cpr != null) {
                do {
                    parent = t;
                    cmp = cpr.compare(key, t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
            }
            else {
                if (key == null)
                    throw new NullPointerException();
                    Comparable<? super K> k = (Comparable<? super K>) key;
                do {
                    parent = t;
                                    //在这里做了显示的调用
                    cmp = k.compareTo(t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
            }
            Entry<K,V> e = new Entry<>(key, value, parent);
            if (cmp < 0)
                parent.left = e;
            else
                parent.right = e;
            fixAfterInsertion(e);
            size++;
            modCount++;
            return null;
        }
    
    

    这是我在TreeSet源码中找到的一段,,看到我注释的哪一行,,就是对你那个接口的显示调用,

         do {
                    parent = t;
                                    //在这里做了显示的调用
                    cmp = k.compareTo(t.key);
                    if (cmp < 0)
                        t = t.left;
                    else if (cmp > 0)
                        t = t.right;
                    else
                        return t.setValue(value);
                } while (t != null);
    

    就是这一段,,,意思是对集合进行排序。。。

    有问题还可以追问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services