Java基础——Set接口
作者:互联网
Collection接口是Java中所有集合的总接口,Collection将集合划分为两大类:List集合和Set集合。
1.Set接口
Set集合用来存储数据时的特点:
1)无序的
2)存储数据时,不可重复
Set接口下面的常用方法
增加:add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false
删除:remove(Object obj) : 删除Set集合中的元素,删除成功返回true,否则返回false。
判断是否为空:isEmpty() :如果Set不包含元素,则返回 true ,否则返回false
元素个数:size() :返回Set集合中的元素个数
包含:contains(Object o):如果Set包含指定的元素,则返回 true,否则返回false
清空:clear() : 移除此Set中的所有元素
迭代器:iterator() :返回在此Set中的元素上进行迭代的迭代器
示例
public class Test { public static void main(String[] args) { Set<Integer> set = new HashSet<Integer>(); set.add(12); set.add(13); set.add(14); set.remove(14); System.out.println(set); System.out.println(set.isEmpty()); System.out.println(set.size()); System.out.println(set.contains(12)); //迭代器遍历 Iterator<Integer> iterator =set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } //增强for循环遍历 for (Integer integer : set) { System.out.println(integer); } set.clear(); System.out.println(set);
2.Set的子类
Set接口下面有两个实现类HashSet和TreeSet。
1)HashSet使用的是相当复杂的方式来存储元素的,使用HashSet能够最快的获取集合中的元素,效率非常高(以空间换时间)。会根据hashcode和equals来庞端是否是同一个对象,如果hashcode一样,并且equals返回true,则是同一个对象,不能重复存放。
class Student{ int id; public Student(int id) { this.id = id; } @Override public String toString() { return this.id+""; } @Override public int hashCode() { return this.id; } @Override public boolean equals(Object obj) { if (obj instanceof Student){ Student stu = (Student) obj; if (stu.id == this.id) return true; } return false; } } public class HashSetTest { public static void main(String[] args) { Set<Student> set = new HashSet<Student>(); Student s1 = new Student(1); Student s2 = new Student(1); Student s3 = new Student(2); set.add(s1); set.add(s2); set.add(s3); for (Student s : set) { System.out.println(s); } } }
正如上例所示,重写了hashCode()和equals()方法来区分同意对象后,就不能存放同以对象了。如果注释这两个方法,则所有Student对象视为不同对象,都可以存放。
特点:
- 不允许存储重复的元素
- 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
- 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
- 底层是一个哈希表结构,存储时依靠哈希值进行存储(查询的速度非常快)
2)TreeSet存值的时候,底层依赖的是二叉树进行存储的特点:
示例用TreeSet存放自然排序的对象:
class Student1 implements Comparable<Student1>{ int id; public Student1(int id) { this.id = id; } @Override public String toString() { return this.id+""; } @Override public int hashCode() { return this.id; } @Override public boolean equals(Object obj) { if (obj instanceof Student1){ Student1 stu = (Student1) obj; if (stu.id == this.id) return true; } return false; } public int compareTo(Student1 o) { return (this.id-o.id); } } public class TreeSetTest { public static void main(String[] args) { Set<Student1> set = new TreeSet<Student1>(); Student1 s1 = new Student1(5); Student1 s2 = new Student1(1); Student1 s3 = new Student1(2); Student1 s4 = new Student1(4); Student1 s5 = new Student1(3); set.add(s1); set.add(s2); set.add(s3); set.add(s4); set.add(s5); for (Student1 s : set) { System.out.println(s); } } }
3.总结
开发中很少用到set集合,如果使用HashSet存对象的时候,一定记得重写equals方法和hashCode方法
如果使用TreeSet存对象的时候,一定在当前实现Comparebale接口,重写compareTo方法,对类属性进行自然排序
标签:set,Java,Student1,接口,public,Set,Student,id 来源: https://blog.csdn.net/qq_48060243/article/details/122772284