Set 集合
Set 集合概述
-
特点:无序、无下标、元素不可重复
-
方法:全部继承自Collection中的方法
Set 接口使用
-
/** * Set 接口的使用 * 特点:无序、没有下标 * 不能重复 */ public class Demo01 { public static void main(String[] args) { // 创建集合 HashSet<String> set = new HashSet<>(); // 添加数据 set.add("苹果") ; set.add("香蕉") ; set.add("橘子") ; // set.add("苹果") ; System.out.println("数据个数:"+set.size()); System.out.println(set.toString()); // 删除元素 // set.remove("小米"); // System.out.println(set.toString()); // 遍历 // 使用增强for for (String string : set) { System.out.println(string); } // 使用迭代器 Iterator<String> it = set.iterator(); while (it.hasNext()){ System.out.println(it.next()); } // 判断 System.out.println(set.contains("苹果")); System.out.println(set.isEmpty()); } }
HashSet 使用
-
HashSet :【重点】
- 基于HashCode实现元素不重复
- 当存入元素的哈希码相同时,就会调用equals进行确认,如结果为true,则拒绝后者存入
public class Demo02 {
public static void main(String[] args) {
// 新建集合
HashSet<String> hashSet = new HashSet<>();
// 添加元素
hashSet.add("刘德华");
hashSet.add("梁朝伟");
hashSet.add("林志林");
hashSet.add("周润发");
// hashSet.add("刘德华");
System.out.println("元素个数:"+hashSet.size());
System.out.println(hashSet.toString());
// 删除数据
hashSet.remove("刘德华");
System.out.println("元素个数:"+hashSet.size());
// 遍历
// 增强for
for (String string : hashSet) {
System.out.println(string);
}
// 迭代器
Iterator<String> it = hashSet.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
// 判断
System.out.println(hashSet.contains("成龙"));
System.out.println(hashSet.isEmpty());
}
}
-
package com.gather.Set; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } 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 "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
public class Demo03 {
public static void main(String[] args) {
// 创建集合
HashSet<Person> persons = new HashSet<>();
// 添加数据
Person p1 = new Person("刘德华",20);
Person p2 = new Person("林志林",21);
Person p3 = new Person("成龙",22);
persons.add(p1);
persons.add(p2);
persons.add(p3);
// persons.add(p3); 重复
System.out.println("元素个数:"+persons.size());
System.out.println(persons.toString());
}
}
HashSet 存储方式
-
* 存储过程: * 1.根据HashCode计算保存位置,如果位置为空,则直接保存,如过不为空执行第二步 * 2.再执行equals,如果equals方法为true,则认为是重复,否则,形成链表
HashSet 补充
-
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; // 31是一个质数 ,减少散列冲突 31提高执行效率 31*i=(i<<5)-i result = 31 * result + age; return result; } }
TreeSet 概述
TreeSet:
- 基于排列顺序实现元素不重复
- 实现了SortedSet接口,对集合元素自动排序
- 元素对象的类型必须实现Comparable接口,指定排序规则
- 通过CompareTo方法确定是否为重复元素
TreeSet 使用
-
简单基础使用
public class Demo04 { public static void main(String[] args) { // 创建集合 TreeSet<String> treeset = new TreeSet<>(); // 添加元素 treeset.add("xyz"); treeset.add("abc"); treeset.add("hello"); // treeset.add("xyz"); System.out.println("元素个数:"+treeset.size()); System.out.println(treeset.toString()); 删除元素 // treeset.remove("xyz"); // System.out.println("元素个数:"+treeset.size()); // System.out.println(treeset.toString()); // 遍历 // 使用增强for for (String string : treeset) { System.out.println(string); } // 使用迭代器 Iterator<String> itw = treeset.iterator(); while (itw.hasNext()){ System.out.println(itw.next()); } // 判断 System.out.println(treeset.contains("xyz")); System.out.println(treeset.isEmpty()); } }
-
复杂类型使用 实现排序
/** * TreeSet 保存数据 * 存储结构 : 红黑树 * 要求:元素必须要实现Comparble 接口 */ public class Demo05 { public static void main(String[] args) { // 创建集合 TreeSet<Person> persons = new TreeSet<>(); // 添加元素 Person p1 = new Person("xyz",20); Person p4 = new Person("xyz",21); Person p2 = new Person("abc",21); Person p3 = new Person("成龙",22); persons.add(p1); persons.add(p2); persons.add(p3); persons.add(p4); System.out.println("元素个数:"+persons.size()); System.out.println(persons.toString()); // 删除元素 // persons.remove(p1); // System.out.println(persons.size()); // 遍历 // 增强for for (Person person : persons) { System.out.println(person.toString()); } // 使用迭代器 Iterator<Person> it = persons.iterator(); while (it.hasNext()){ System.out.println(it.next()); } // 判断 System.out.println(persons.contains(p1)); System.out.println(persons.isEmpty()); } }
-
重写 Comparable 接口
@Override // 先按姓名比,然后按年龄比 public int compareTo(Person o) { int n1 = this.getName().compareTo(o.getName()); int n2 = this.age-o.getAge(); return n1 == 0?n2:n1; }
Comparator 接口
/**
* TreeSet 集合的使用
* Comparator :实现定制比较(比较器)
* Comparable : 可比较的
*/
public class Demo06 {
public static void main(String[] args) {
// 创建集合,并指定比较规则
TreeSet<Person> persons = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int n1 = o1.getAge()-o2.getAge();
int n2 = o1.getName().compareTo(o2.getName());
return n1 == 0?n2:n1;
}
});
Person p1 = new Person("xyz",20);
Person p2 = new Person("xyz",21);
Person p3 = new Person("abc",21);
persons.add(p1);
persons.add(p2);
persons.add(p3);
System.out.println("元素个数:"+persons.size());
System.out.println(persons.toString());
}
}
TreeSet 案例
/**
* 要求:使用TreeSet 集合实现字符串按照长度进行排序
* helloworld zhang lisi wangwu beijing xian nanjing
* Comparator 接口实现比较
*/
public class Demo07 {
public static void main(String[] args) {
// 创建集合 并指定比较规则
TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int n1 = o1.length()-o2.length();
int n2 = o1.compareTo(o2);
return n1 == 0?n2:n1;
}
});
// 添加数据
treeSet.add("helloworld");
treeSet.add("zhangsan");
treeSet.add("cat");
treeSet.add("lisi");
treeSet.add("xian");
treeSet.add("nanjing");
System.out.println(treeSet.toString());
}
}