2014-08-27 67 views
0

我有用于测试一个静态成员序列化的代码。使用HashCode方法进行序列化

这里是汽车类

public class Car implements Serializable { 

    private String number; 
    private String color; 
    private String model; 
    static int y = 23; 

    public boolean equals(Object object) 
    { 
     System.out.println("Equals Called..."); 
     if(object instanceof Car) 
     { 
      Car car = (Car) object; 
      if(car.getNumber() == this.number) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

    public String toString() 
    { 
     System.out.println("ToString Called..."); 
     return "Number : "+this.number+" Color : "+this.color+" Model : "+this.model+" Y : "+this.y; 
    } 

    public int hashCode() 
    { 
     return this.y * 23; 
    } 

    Getters And Setters 
} 

,这里是我的主类

public static void main(String args[]) 
    { 
     Car car1 = new Car(); 
     car1.setColor("red"); 
     car1.setModel("23023"); 
     car1.setNumber("1212"); 
     System.out.println(car1.toString()); 

     Car car2 = new Car(); 
     car2.setColor("red"); 
     car2.setModel("23023"); 
     car2.setNumber("1212"); 
     System.out.println(car2.toString()); 

     Map<Car, String> map = new HashMap<Car, String>(); 
     map.put(car1, "Kshitij_1"); 

     System.out.println("Map : "+map.toString()); 
     System.out.println(map.get(car2)); 
     System.out.println(car2.getY()); 
     System.out.println("---------------------------------------------Before"); 
     try 
     { 
      FileOutputStream fout = new FileOutputStream("D://map.ser"); 
      ObjectOutputStream objectOutputStream = new ObjectOutputStream(fout); 
      objectOutputStream.writeObject(map); 
      objectOutputStream.close(); 

      FileInputStream fin = new FileInputStream("D://map.ser"); 
      ObjectInputStream inputStream = new ObjectInputStream(fin); 
      map = (Map<Car, String>) inputStream.readObject(); 
      inputStream.close(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

     System.out.println("Map : "+map.toString()); 
     System.out.println(map.get(car2)); 
     System.out.println(car2.getY()); 
     System.out.println("---------------------------------------------After"); 
} 

我希望的是结果应该是相同的之前和之后。但我正在逐渐空

输出

ToString Called... 
Map : {Number : 1212 Color : red Model : 23023 Y : 23=Kshitij_1} 
Equals Called... 
Kshitij_1 
23 
---------------------------------------------Before 
ToString Called... 
Map : {Number : 1212 Color : red Model : 23023 Y : 23=Kshitij_1} 
Equals Called... 
null 
23 
---------------------------------------------After 

System.out.println(map.get(car2)); 

按照系列化规则在反序列化过程中的静态变量将被初始化为默认值。如果它初始化为23而不是为什么它无法从HashMap中找到对象?

回答

0

静态字段是一个红色的鲱鱼(和我建议你重新考虑的东西)。然而现在它是等号检查有它的错误在丢弃哈希映射。

if(car.getNumber() == this.number) 

应该

if(Objects.equals(car.getNumber(), this.number)) 

你被这恰好字符串文字而不是反序列化字符串自动串实习抓了出来。欲了解更多详情,请阅读What is a string literal pool

+0

你也可以使用'if(car.getNumber()。equals(this.number))'这是一个更可读的恕我直言 – rthur 2014-08-27 12:50:27

+0

完美......... – KSHiTiJ 2014-08-27 12:59:04

相关问题