当前位置: 代码迷 >> 综合 >> Java---Set
  详细解决方案

Java---Set

热度:96   发布时间:2023-10-21 18:06:47.0

    按照定义,Set接口继承Collection接口,而且它不允许集合中存在重复项。所有原始方法都是Collection中现成的,没有引入新方法。

    具体的Set实现类依赖添加的对象的equals()方法来检查等同性。

HashSet类和TreeSet类:

        “集合框架”支持Set接口两种普通的实现:HashSet和TreeSet。在更多情况下,会使用HashSet存储重复自由的集合。考虑到效率,添加到HashSet的对象需要采用恰当分配散列码的方式来实现hashCode()方法。当需要从集合中以有序的方式抽取元素时,TreeSet实现会有用处。为了能顺利进行,添加到TreeSet的元素必须是可排序的。

 

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;import org.junit.Test;public class SetDemo {/* Set在Collection基础上没有添加新的功能* * set中元素的顺序(存放位置)只跟各元素的hashCode有关* ---若元素的类型中没有覆盖hashCode,则使用的是Object中的,* 此时就是内存地址(系统随机分配),因此顺序不固定。* * 只有当两个Person对象的hashCode相同且equals方法的返回true时,* set才把这两个对象看成是同一个,后者加不进。* ---注意Person类中hashCode()和equals()方法都要写,否则两个对象都能加进去* 	  */@Testpublic void demo1() {Set set = new HashSet();set.add("abc");set.add(3.14);set.add(100);set.add('q');set.add(new Person("Jack",22));set.add(new Person("Tom",23));set.add(new Person("Rose",24));set.add(new Person("Rose",24));Iterator it = set.iterator();while(it.hasNext()){Object obj = it.next();System.out.println(obj);}}
}
class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic String toString() {return name + "," + age;}}