1 import java.util.*; 2 3 /* 4 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。 5 6 比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。 7 8 9 思路: 10 1,对人描述,将数据封装进人对象。 11 2,定义容器,将人存入。 12 3,取出。 13 14 15 16 List集合判断元素是否相同,依据是元素的equals方法。 17 18 19 20 */ 21 22 class Person 23 { 24 private String name; 25 private int age; 26 Person(String name,int age) 27 { 28 this.name=name; 29 this.age=age; 30 } 31 public String getName() 32 { 33 return name; 34 } 35 public int getAge() 36 { 37 return age; 38 } 39 40 public boolean equals(Object obj)//一定要复写父类的equals方法 41 { 42 if (!(obj instanceof Person)) 43 return false; 44 45 Person p=(Person)obj; 46 47 ArrayListTest2.sop(this.name+"-------"+p.name); 48 return this.name.equals(p.name) && this.age == p.age; 49 } 50 } 51 class ArrayListTest2 52 { 53 public static void main(String[] args) 54 { 55 ArrayList al =new ArrayList(); 56 57 al.add(new Person("lili",22)); 58 al.add(new Person("liu",20)); 59 al.add(new Person("who",20)); 60 al.add(new Person("liu",20)); 61 62 sop("remove:。。。。"+al.remove(new Person("liu",20)));//remove方法底层也是调用equals方法 63 64 //sop(al);//[Person@1d10caf0, Person@397b6178, Person@533c2ac3, Person@131b92e6] 65 66 //getElements(al); 67 68 al=singleElement(al); 69 70 71 getElements(al); 72 } 73 74 public static void getElements(ArrayList al) 75 { 76 for (Iterator it =al.iterator();it.hasNext() ;) 77 { 78 //sop(((Person)it.next()).getName()); 79 Person p =(Person)it.next(); 80 sop(p.getName()+"::"+p.getAge()); 81 } 82 } 83 84 public static void sop(Object obj) 85 { 86 System.out.println(obj); 87 } 88 89 public static ArrayList singleElement(ArrayList al) 90 { 91 //定义个临时容器用于装载符合条件的对象 92 ArrayList alNew =new ArrayList(); 93 94 95 for (Iterator it =al.iterator(); it.hasNext(); ) 96 { 97 Object obj =it.next(); 98 if (!alNew.contains(obj))//contains方法底层就是调用equals方法 99 alNew.add(obj); 100 } 101 102 return alNew; 103 } 104 } 105 106 import java.util.*; 107 /* 108 |--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、 109 |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。 110 HashSet是如何保证元素唯一性的呢? 111 是通过元素的两个方法,hashCode和equals来完成。 112 如果元素的HashCode值相同,才会判断equals是否为true。 113 如果元素的hashcode值不同,不会调用equals。 114 115 注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。 116 117 118 |--TreeSet: 119 120 Set集合的功能和Collection是一致的。 121 122 123 124 125 */ 126 127 128 class HashSetDemo 129 { 130 public static void sop(Object obj) 131 { 132 System.out.println(obj); 133 } 134 public static void main(String[] args) 135 { 136 137 HashSet hs = new HashSet(); 138 139 sop(hs.add("java01")); 140 sop(hs.add("java01")); 141 hs.add("java02"); 142 hs.add("java03"); 143 hs.add("java03"); 144 hs.add("java04"); 145 146 Iterator it = hs.iterator(); 147 148 while(it.hasNext()) 149 { 150 sop(it.next()); 151 } 152 } 153 } 154 155 156 import java.util.*; 157 158 /* 159 往hashSet集合中存入自定对象 160 姓名和年龄相同为同一个人,重复元素。 161 162 163 164 165 166 */ 167 class HashSetTest 168 { 169 public static void sop(Object obj) 170 { 171 System.out.println(obj); 172 } 173 public static void main(String[] args) 174 { 175 HashSet hs = new HashSet(); 176 177 hs.add(new Person("a1",11)); 178 hs.add(new Person("a2",12)); 179 hs.add(new Person("a3",13)); 180 // hs.add(new Person("a2",12)); 181 // hs.add(new Person("a4",14)); 182 183 //sop("a1:"+hs.contains(new Person("a2",12))); 184 185 // hs.remove(new Person("a4",13)); 186 187 188 Iterator it = hs.iterator(); 189 190 while(it.hasNext()) 191 { 192 Person p = (Person)it.next(); 193 sop(p.getName()+"::"+p.getAge()); 194 } 195 } 196 } 197 class Person 198 { 199 private String name; 200 private int age; 201 Person(String name,int age) 202 { 203 this.name = name; 204 this.age = age; 205 } 206 207 public int hashCode() 208 { 209 System.out.println(this.name+"....hashCode"); 210 return name.hashCode()+age*37; 211 } 212 213 public boolean equals(Object obj) 214 { 215 216 if(!(obj instanceof Person)) 217 return false; 218 219 Person p = (Person)obj; 220 System.out.println(this.name+"...equals.."+p.name); 221 222 return this.name.equals(p.name) && this.age == p.age; 223 } 224 225 226 public String getName() 227 { 228 return name; 229 } 230 public int getAge() 231 { 232 return age; 233 } 234 } 235 236 /* 237 238 239 */
原文:http://www.cnblogs.com/lfjean/p/3655086.html