Java基础——Set接口

2022/2/3 1:13:27

本文主要是介绍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对象视为不同对象,都可以存放。

特点:

  1. 不允许存储重复的元素
  2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
  3. 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
  4. 底层是一个哈希表结构,存储时依靠哈希值进行存储(查询的速度非常快)

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方法,对类属性进行自然排序



这篇关于Java基础——Set接口的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程