2014-08-27 69 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

相關問題