Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2655)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2656)
@@ -305,5 +305,11 @@
      */
     public Collection<Node> getSelectedNodes() {
-        return getSelected(nodes);
+        List<Node> result = new ArrayList<Node>(selectedPrimitives.size());
+        for (OsmPrimitive primitive:selectedPrimitives) {
+            if (primitive instanceof Node) {
+                result.add((Node)primitive);
+            }
+        }
+        return result;
     }
 
@@ -312,5 +318,11 @@
      */
     public Collection<Way> getSelectedWays() {
-        return getSelected(ways);
+        List<Way> result = new ArrayList<Way>(selectedPrimitives.size());
+        for (OsmPrimitive primitive:selectedPrimitives) {
+            if (primitive instanceof Way) {
+                result.add((Way)primitive);
+            }
+        }
+        return result;
     }
 
@@ -319,20 +331,11 @@
      */
     public Collection<Relation> getSelectedRelations() {
-        return getSelected(relations);
-    }
-
-    /**
-     * Return all selected items in the collection.
-     * @param list The collection from which the selected items are returned.
-     */
-    private <T extends OsmPrimitive> Collection<T> getSelected(Collection<T> list) {
-        if (list == null)
-            return new LinkedList<T>();
-        // getSelected() is called with large lists, so
-        // creating the return list from the selection
-        // should be faster most of the time.
-        Collection<T> sel = new LinkedHashSet<T>(list);
-        sel.retainAll(selectedPrimitives);
-        return sel;
+        List<Relation> result = new ArrayList<Relation>(selectedPrimitives.size() / 10);
+        for (OsmPrimitive primitive:selectedPrimitives) {
+            if (primitive instanceof Relation) {
+                result.add((Relation)primitive);
+            }
+        }
+        return result;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2655)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2656)
@@ -679,13 +679,5 @@
      */
     @Override public final int hashCode() {
-        final int[] ret = new int[1];
-        Visitor v = new Visitor(){
-            public void visit(Node n) { ret[0] = 0; }
-            public void visit(Way w) { ret[0] = 1; }
-            public void visit(Relation e) { ret[0] = 2; }
-            public void visit(Changeset cs) { ret[0] = 3; }
-        };
-        visit(v);
-        return (int)(id<<2)+ret[0];
+        return (int)id;
     }
 
