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