title: How to use Collections methods(removeAll() and retainAll()) for two objects. (objects are parent-child relation)
body: <p>I expected to result below but actually not. I would like to know how to show the differences between two Collections. (objects are parent and child relationship)
  In this case, can I use standard method like removeAll() or can you recommend another approach like using apache-commons. Thanks.</p>
  
  <pre><code>CONSTRAINT
  ------------------------------
  1.Item.class is unmodifiable(eg. I can not add equals method)
  2.If id is same between two objects, they are assumed as same things.
  ------------------------------
  
  EXPECTED
  ------------------------------
  removed object are:
  2
  same object are:
  1
  3
  add object are:
  4
  ------------------------------
  
  ACTUAL
  ------------------------------
  removed object are:
  1
  2
  3
  same object are:
  add object are:
  1
  3
  4
  ------------------------------
  
  package com.javastudy;
  
  import java.util.ArrayList;
  import java.util.List;
  
  public class CollectionCompareToObjects {
  
      public static void main(String[] args) {
  
          List&lt;Item&gt; before = new ArrayList&lt;Item&gt;();
          List&lt;ItemEx&gt; after = new ArrayList&lt;ItemEx&gt;();
  
          before.add(new Item(1L));
          before.add(new Item(2L)); // delete
          before.add(new Item(3L));
  
          after.add(new ItemEx(1L));
          after.add(new ItemEx(3L));
          after.add(new ItemEx(4L)); // added
  
          List&lt;Item&gt; removed = new ArrayList&lt;Item&gt;(before);
          removed.removeAll(after);
  
          System.out.println("removed objects are:");
          for(Item item : removed){
              System.out.println(item.getId());
          }
  
          List&lt;Item&gt; same = new ArrayList&lt;Item&gt;(before);
          same.retainAll(after);
  
          System.out.println("same objects are:");
          for(Item item : same){
              System.out.println(item.getId());
          }
  
          List&lt;Item&gt; added = new ArrayList&lt;Item&gt;(after);
          added.removeAll(before);
  
          System.out.println("add objects are:");
          for(Item item : added){
              System.out.println(item.getId());
          }
  
      }
  
  }
  
  
  package com.javastudy;
  
  public class Item {
  
      private Long id;
  
      public Item(Long id) {
          this.id = id;
      }
  
      public Long getId() {
          return id;
      }
  
      public void setId(Long id) {
          this.id = id;
      }
  
  }
  
  package com.javastudy;
  
  public class ItemEx extends Item {
  
      private String name;
  
      public ItemEx(Long id) {
          super(id);
      }
  
      public String getName() {
          return name;
      }
  
      public void setName(String name) {
          this.name = name;
      }
  
  }
  </code></pre>