WEB开发网
开发学院软件开发Java 关于 Java Collections API 您不知道的 5 件事,第... 阅读

关于 Java Collections API 您不知道的 5 件事,第 2 部分:注意可变对象

 2010-06-23 00:00:00 来源:WEB开发网   
核心提示: 此方法的优势是不会在内存中保留整个内容,但是有一个警告就是,关于 Java Collections API 您不知道的 5 件事,第 2 部分:注意可变对象(4),它不能 close() 底层文件句柄(每当 readLine() 返回 null 时就关闭文件句柄,可以修正这一问题,这样容易产生

此方法的优势是不会在内存中保留整个内容,但是有一个警告就是,它不能 close() 底层文件句柄(每当 readLine() 返回 null 时就关闭文件句柄,可以修正这一问题,但是在 Iterator 没有结束时不能解决这个问题)。

4. 注意可变的 hashCode()

Map
是很好的集合,为我们带来了在其他语言(比如 Perl)中经常可见的好用的键/值对集合。JDK 以 HashMap 的形式为我们提供了方便的 Map 实现,它在内部使用哈希表实现了对键的对应值的快速查找。但是这里也有一个小问题:支持哈希码的键依赖于可变字段的内容,这样容易产生 bug,即使最耐心的 Java 开发人员也会被这些 bug 逼疯。

假设清单 3 中的 Person 对象有一个常见的 hashCode() (它使用 firstName、lastName 和 age 字段 — 所有字段都不是 final 字段 — 计算 hashCode()),对 Map 的 get() 调用会失败并返回 null:

清单 3. 可变 hashCode() 容易出现 bug

// Person.java 
import java.util.*; 
 
public class Person 
  implements Iterable<Person> 
{ 
  public Person(String fn, String ln, int a, Person... kids) 
  { 
    this.firstName = fn; this.lastName = ln; this.age = a; 
    for (Person kid : kids) 
      children.add(kid); 
  } 
   
  // ... 
   
  public void setFirstName(String value) { this.firstName = value; } 
  public void setLastName(String value) { this.lastName = value; } 
  public void setAge(int value) { this.age = value; } 
   
  public int hashCode() { 
    return firstName.hashCode() & lastName.hashCode() & age; 
  } 
 
  // ... 
 
  private String firstName; 
  private String lastName; 
  private int age; 
  private List<Person> children = new ArrayList<Person>(); 
} 
 
 
// MissingHash.java 
import java.util.*; 
 
public class MissingHash 
{ 
  public static void main(String[] args) 
  { 
    Person p1 = new Person("Ted", "Neward", 39); 
    Person p2 = new Person("Charlotte", "Neward", 38); 
    System.out.println(p1.hashCode()); 
     
    Map<Person, Person> map = new HashMap<Person, Person>(); 
    map.put(p1, p2); 
     
    p1.setLastName("Finkelstein"); 
    System.out.println(p1.hashCode()); 
     
    System.out.println(map.get(p1)); 
  } 
} 

上一页  1 2 3 4 5  下一页

Tags:关于 Java Collections

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接