java小案例(1)

本文探讨了Java中方法执行流程及return语句的影响,并通过实例展示了不同情况下的输出结果。同时,深入分析了自定义对象作为Map键时hashCode与equals方法的重要性。最后,介绍了如何实现自定义对象的Comparable接口来对List进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、大家都知道当执行一个方法时,如果中途有return会提前结束方法。思考下面的一段代码会返回什么样的结果?

第一种情况:

public static String methodA(){
       try{
           System.out.println("try methodA");
           return "A";
       }finally{
           System.out.println("run finally");
       }
    }
    public static void main(String[] args) {
        System.out.println(methodA());;
    }

Result:

try methodA
run finally
A

第二种情况:

public static String methodB(){
        System.out.println("methodB");
        return "B";
    }
    public static String methodA(){
       try{
           System.out.println("try methodA");
           return methodB();
       }finally{
           System.out.println("run finally");
       }
    }
    public static void main(String[] args) {
        System.out.println(methodA());;
    }
Result:
try methodA
methodB
run finally
B

结果一目了然,不做具体分析。


二、关于Map与hashcode

Map<K,V>,通常情况下,K定义为:String ,Long,通过key值可以取到关联的value值

但如果K定义为一个对象如Person呢,那是怎么个情况。。。下面有三个例子,可以让你一目了解

第一种情况:

package com.alibaba.model;

/**
 * 类Person.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2012-6-17 下午04:19:49
 */
public class Person {

    private String name;
    private String age;
    private String address;

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

   get/set方法。。。

    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        Person other = (Person) obj;
        if (name != other.getName()) return false;
        return true;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "name=" + name + ";age=" + age + ";address=" + address;
    }

}

 public static void main(String[] args) {

        Map<Person, String> map = new HashMap<Person, String>();
        Person p1 = new Person("a1", "a2", "a3");
        System.out.println("p1 hashcode:"+p1.hashCode());
        map.put(p1, "有结果");
        Person p2 = new Person("a1", "a2", "a3");
        System.out.println("p2 hashcode:"+p2.hashCode());
        System.out.println(map.get(p2));
    }
结果:

p1 hashcode:12677476
p2 hashcode:33263331
null


第二种情况:

package com.alibaba.model;

/**
 * 类Person.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2012-6-17 下午04:19:49
 */
public class Person {

    private String name;
    private String age;
    private String address;

    public Person(String name, String age, String address){
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }
get/set方法。。。

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        Person other = (Person) obj;
        if (name != other.getName()) return false;
        return true;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "name=" + name + ";age=" + age + ";address=" + address;
    }

}
public static void main(String[] args) {

        Map<Person, String> map = new HashMap<Person, String>();
        Person p1 = new Person("a1", "a2", "a3");
        System.out.println("p1 hashcode:"+p1.hashCode());
        map.put(p1, "有结果");
        Person p2 = new Person("a1", "b2", "b3");
        System.out.println("p2 hashcode:"+p2.hashCode());
        System.out.println(map.get(p2));
    }

结果:

p1 hashcode:3087
p2 hashcode:3087
有结果

第三种情况:

package com.alibaba.model;

/**
 * 类Person.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2012-6-17 下午04:19:49
 */
public class Person {

    private String name;
    private String age;
    private String address;

    public Person(String name, String age, String address){
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }
get/set方法。。
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((age == null) ? 0 : age.hashCode());
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        Person other = (Person) obj;
        if (name != other.getName()) return false;
        return true;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "name=" + name + ";age=" + age + ";address=" + address;
    }

}

 public static void main(String[] args) {

        Map<Person, String> map = new HashMap<Person, String>();
        Person p1 = new Person("a1", "a2", "a3");
        System.out.println("p1 hashcode:"+p1.hashCode());
        map.put(p1, "有结果");
        Person p2 = new Person("a1", "b2", "b3");
        System.out.println("p2 hashcode:"+p2.hashCode());
        System.out.println(map.get(p2));
    }

结果:

p1 hashcode:98754
p2 hashcode:98785
null

三、关于借助Comparable接口,快速对List集合按某种规则排序

例子:

定义一个Person对象,其中两个属性name(不可重复)、index(可重复),按index的大小,对List集合中的Person元素排序

Person类:

package com.alibaba.test1;

/**
 * 类Person.java的实现描述:TODO 类实现描述
 * 
 * @author onlyone 2013-4-3 下午10:24:06
 */
public class Person implements Comparable<Person> {

    private String name;
    private int    index;

    public Person(){
    }

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

    public String getName() {
        return name;
    }

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

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    @Override
    public int compareTo(Person o) {
        if (o == null) {
            return 0;
        }
        int ret = 0;
        if (this.index < o.getIndex()) {
            ret = 1;
        } else if (this.index > o.getIndex()) {
            ret = -1;
        } else {
            ret = 0;
        }
        return ret;
    }

    @Override
    public String toString() {
        return "name=" + name + ";index=" + index;
    }

}

Test测试类:

package com.alibaba.test1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 根据index索引排序
 * @author onlyone 2013-4-3 下午10:39:14
 */
public class Test {

    public static void main(String[] args) {

        Person p1 = new Person("a1", 3);
        Person p2 = new Person("a2", 0);
        Person p3 = new Person("a3", 0);
        Person p4 = new Person("a4", 2);
        Person p5 = new Person("a5", 1);
        List<Person> list = new ArrayList<Person>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        Collections.sort(list);
        for (Person p : list) {
            System.out.println(p);
        }

    }

}
结果:

name=a1;index=3
name=a4;index=2
name=a5;index=1
name=a2;index=0
name=a3;index=0


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值