Set实现类
1、HashSet。
1、基于HashCode来计算元素存储位置。 2、当存入的元素HashCode相同时,会调用equals方法进行确认,如果为true,则代表已经存在相同元素,则拒绝存入。
特点
1、基于HashMap实现,不允许元素重复。 2、允许存在null值,但只能有一个null值。 3、无序,因为会根据HasCode重新计算元素位置。 4、线程不安全。 5、实现了Set接口。
实例化HashSet对象
HashSet<String> hashSet = new HashSet<>();
添加元素
hashSet.add("苹果"); hashSet.add("橘子"); hashSet.add("香蕉");
删除元素
hashSet.remove("苹果");
清空元素
hashSet.clear();
遍历元素
//1、foreach for (String str : hashSet) { System.out.println(str); } //2、Iterator迭代器 Iterator<String> iterator = hashSet.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }
HashSet中的判断
System.out.println("判断集合是否包含元素:" + hashSet.contains("苹果")); System.out.println("判断集合是否为空:" + hashSet.isEmpty());
创建一个User类
public class User implements Serializable { private String name; private int age; public User(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; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
HashSet<User> userHashSet = new HashSet<>(); userHashSet.add(new User("小明", 18)); userHashSet.add(new User("小明", 18)); System.out.println("userHashSet:" + userHashSet); 输出结果:userHashSet:[User{name='小明', age=18}, User{name='小明', age=18}]
这时我们会发现他们的名称和年龄都是相同的,却还是添加成功了。原因是在使用equals方法比较时他们的地址引用是不同的,如果想要比较具体的值我们就需要去重写它的hashCode方法和equals方法。
@Override public int hashCode() { //因为String和Integer已经重写了HashCode,所以可以直接使用String的HashCode方法。 int num1 = this.name.hashCode(); int num2 = this.age.hashCode(); return num1 + num2; } @Override public boolean equals(Object obj) { //比较是否是同一个对象 if (this == obj) { return true; } //判断obj是否是User对象 if (obj instanceof User) { User u = (User) obj; if (this.name == u.name && this.age == u.age) { return true; } } return false; }
再次运行,输出结果:userHashSet:[User{name='小明', age=18}]。remove方法也是一样。
2、TreeSet。
1、基于排序顺序实现元素不重复。 2、实现了SortedSet接口,对元素自动排序。 3、元素对象的类型必须实现Comparable接口,制定排序规则。 4、通过ComparTo方法判断元素是否重复。
特点
1、底层使用TreeMap保存元素。 2、线程不安全。可以使用下面的语句实现线程安全。 SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...)); 3、不允许null值。 4、底层使用红黑树结构。 5、fail-fast机制。
实例化TreeSet对象
TreeSet<String> treeSet = new TreeSet();
添加元素
treeSet.add("1"); treeSet.add("3"); treeSet.add("2"); treeSet.add("2"); System.out.println(treeSet); //打印结果:[1, 2, 3]。 // TreeSet底层实现了Set接口,所以不允许元素重复。 // TreeSet底层实现了SortedSet接口,会自动进行排序。如果是数值类型则是按照从小到大的顺序排列。如果是字符类型会根据字典表进行排序。
删除元素
treeSet.remove("1");
清空元素
treeSet.clear();
遍历元素
//1、使用foreach for (String str : treeSet) { System.out.println(str); } //使用迭代器Iterator Iterator iterator = treeSet.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); }

浙公网安备 33010602011771号