一、大家都知道当执行一个方法时,如果中途有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