Java中set集合

Set集合

set集合简单使用

package com.cloud.vector;

import java.util.HashSet;

import java.util.Set;

public class Day2 {

/*

 --|Set 实现Set接口的集合类,无序,不可以重复

        元素添加输出的顺序不一样

*/

   public static void main(String[] args) {

      Set set=new HashSet();

      set.add("Spring1");

      set.add("Spring2");

      set.add("Spring3");

      System.out.println("添加是否成功?"+set.add("Spring3"));

      System.out.println(set);

   }

}

Set集合添加元素

package com.cloud.vector;

import java.util.HashSet;

public class Day3 {

   public static void main(String[] args) {

      HashSet<Person> set=new HashSet<Person>();

      /* 添加简单元素,该元素不可重复

      set.add("Spring1");

      set.add("Spring2");

      set.add("Spring3");

      set.add("Spring3");

      */

      set.add(new Person(1,"Spring1"));

      set.add(new Person(2,"Spring2"));

      set.add(new Person(3,"Spring3"));

      System.out.println("是否添加成功?"+set.add(new Person(3,"Spring3")));

      System.out.println(set);

   }

}

class Person{

   int id;

   String name;

   public Person(int id,String name){

      this.id=id;

      this.name=name;

   }

   @Override

   public String toString() {

      return "{编号="+this.id+";名字="+this.name+"}";

   }

   @Override

   public boolean equals(Object obj) {

      System.out.println("equals(Object obj)被调用");

      Person p=(Person) obj;

      return this.id==p.id;

   }

   @Override

   public int hashCode() {

      System.out.println("===调用了hashCode()===");

      //这里修改返回id

      return this.id;

   }

}

String类型的比较

package com.cloud.vector;

public class Demo4 {

   public static void main(String[] args) {

      String str1="hello";

      String str2=new String("hello");

      System.out.println("判断两个是否是相同的对象:"+(str1==str2));

      //hashCode默认情况下表示的是内存地址,但是String重写的了objecthashCode()的方法

      System.out.println("hashCode="+str1.hashCode());

      System.out.println("hashCode="+str2.hashCode());

   }

}

HashSet简单使用

package com.cloud.vector;

import java.util.HashSet;

import java.util.Scanner;

public class Demo5 {

   /**

    * 实现的需求:键盘录入用户名和密码,如果用户名和密码已经存在,则重复阻止添加

    */

   public static void main(String[] args) {

      @SuppressWarnings("resource")

      Scanner scanner = new Scanner(System.in);

      HashSet<User> set=new HashSet<User>();

      while(true){

        System.out.println("请输入用户名:");

        String userName = scanner.next();

        System.out.println("请输入密码:");

        String password = scanner.next();

        //创建用户

        User user = new User(userName,password);

        if(set.add(user)){

           System.out.println("注册成功...");

           System.out.println("用户信息:"+set);

        }

        else{

           System.out.println("注册失败...");

        }

      }

   }

}

class User{

   String userName;

   String password;

   public User(String userName,String password){

      super();

      this.userName=userName;

      this.password=password;

   }

   @Override

   public String toString() {

      return "{用户名:"+this.userName+";密码:"+this.password;

   }

   @Override

   public boolean equals(Object obj) {

      User user = (User)obj;

      return this.userName.equals(user.userName)&&this.password.equals(user.password);

   }

   @Override

   public int hashCode() {

      return userName.hashCode()+password.hashCode();

   }

}

 

TreeSet简单用法

package com.cloud.vector;

import java.util.TreeSet;

public class Demo7 {

   public static void main(String[] args) {

      TreeSet tree = new TreeSet();

      /*tree.add(4);

      tree.add(3);

      tree.add(6);

      tree.add(5);

      tree.add(2);

      //打印:[2, 3, 4, 5, 6]

      */

      tree.add('c');

      tree.add('e');

      tree.add('b');

      tree.add('a');

      //打印:[a, b, c, e]

      System.out.println(tree);

   }

}

 

TreeSet添加自定义元素

package com.cloud.vector;

import java.util.TreeSet;

public class Demo8 {

   /**

    * TreeSet处理自定义成员变量

    * 注意事项:

    * 1.如果元素具备自然特性,则按照元素的自然特性进行排序

    * 2.如果元素不具备自然顺序的特性,那么元素所属的类必须实现Comparable接口

    * 3.如果compareTo方法返回的是0,那么该元素视为重复元素,不允许添加

    * 4.在添加元素中,如果该元素不具备自然特性,该元素所属的类也没有实现Comparable接口,就必须

    *   在创建TreeSet的时候传入一个比较器,把元素的比较放到compare方法中即可

    *    比较器使用方法:

    *    class 类名 implements Comparator{

    *    }

    * 5.在传入元素的时候,如果元素本身不具备自然特性,但是元素所属的类实现了Comparable接口,同时

    *   TreeSet对象也传入了比较器,则比较器的规则优先使用

    * 6.TreeSet可以对字符串进行比较

    *    情况1:可以找到对应不同的字符,比较的就是对应的字符

    *

    *    情况2:找不到对应的不同的字符,比较的就是字符串长度

    */

   public static void main(String[] args) {

      TreeSet<Employee> tree = new TreeSet<Employee>();

      tree.add(new Employee(1, "aaa", 500));

      tree.add(new Employee(2, "bbb", 400));

      tree.add(new Employee(3, "ccc", 300));

      tree.add(new Employee(4, "ddd", 200));

      //打印薪水由低到高排序

      System.out.println(tree);

   }

}

@SuppressWarnings("rawtypes")

class Employee implements Comparable{

   int id;

   String name;

   int salary;

   public Employee(int id, String name, int salary) {

      super();

      this.id = id;

      this.name = name;

      this.salary = salary;

   }

   @Override

   public String toString() {

      return "{编号:"+this.id+";姓名:"+this.name+";薪水:"+this.salary+"}";

   }

   //该方法定义元素之间的比较规则

   //比较此对象(this)与制定对象的顺序

   @Override

   public int compareTo(Object o) {

      Employee emp=(Employee) o;

      System.out.println(this.name+""+emp.name+"比较");

      return this.salary-emp.salary;

   }

}

 

TreeSet中比较器的使用

package com.cloud.vector;

import java.util.Comparator;

import java.util.TreeSet;

public class Demo9 {

   /**

    * 比较器使用的案例

    *   比较器使用方法:

    *    class 类名 implements Comparator{

    *    }

    */

   public static void main(String[] args) {

      //创建一个比较器

      MyComparator mycom = new MyComparator();

      //把比较器传入

      TreeSet<Employee2> tree = new TreeSet<Employee2>(mycom);

      tree.add(new Employee2(1, "aaa", 500));

      tree.add(new Employee2(2, "bbb", 400));

      tree.add(new Employee2(3, "ccc", 300));

      tree.add(new Employee2(4, "ddd", 200));

      System.out.println(tree);

   }

}

@SuppressWarnings("rawtypes")

class Employee2 /*implements Comparable*/{

   int id;

   String name;

   int salary;

   public Employee2(int id, String name, int salary) {

      super();

      this.id = id;

      this.name = name;

      this.salary = salary;

   }

   @Override

   public String toString() {

      return "{编号:"+this.id+";姓名:"+this.name+";薪水:"+this.salary+"}";

   }

   //该方法定义元素之间的比较规则

   //比较此对象(this)与制定对象的顺序

   /*

   @Override

   public int compareTo(Object o) {

      Employee2 emp=(Employee2) o;

      System.out.println(this.name+""+emp.name+"比较");

      return this.salary-emp.salary;

   }

   */

}

//自定义一个比较器

class MyComparator implements Comparator{

   @Override

   public int compare(Object o1, Object o2) {

      Employee2 emp1=(Employee2) o1;

      Employee2 emp2=(Employee2) o2;

      return emp1.id-emp2.id;

   }

}

 

TreeSet比较字符串

package com.cloud.vector;

import java.util.TreeSet;

public class Demo10 {

   /**

    * TreeSet比较字符串案例

    */

   public static void main(String[] args) {

      TreeSet tree = new TreeSet();

      //abcabw比较的是cwabcabcd比较的是d

      tree.add("abc");

      tree.add("abcd");

      tree.add("abw");

      System.out.println(tree);

      System.out.println("a".compareTo("c"));

   }

}

 

TreeSet案例

package com.cloud.vector;

import java.util.TreeSet;

public class Demo11 {

   /**

    * 对字符串进行排序

    * String ='2 15 17 4 8 6 12'

    */

   public static void main(String[] args) {

      String str="2 15 17 4 8 6 12";

      String[] datas = str.split(" ");

      TreeSet tree = new TreeSet();

      for(int i=0;i<datas.length;i++){

        tree.add(Integer.parseInt(datas[i]));

      }

      System.out.println(tree);

   }

}


### JavaSet 集合概述 #### Set 接口特性 SetJava 集合框架中的一个重要接口,其主要特点是不允许存储重复元素[^2]。这使得 Set 类似于数学上的集合概念,在实际应用中非常有用。 #### 实现类及其特点 - **HashSet** - 基于哈希表实现,内部通常使用 `HashMap` 来管理数据[^1]。 - 提供常数时间复杂度 O(1) 的性能用于基本操作(add, remove 和 contains),假设哈希函数分配得当。 - **LinkedHashSet** - 继承自 HashSet 并保持插入顺序不变。 - 同样提供高效的存取速度,但在迭代访问时会按照元素被添加到集合中的先后次序返回。 - **TreeSet** - 底层基于红黑树实现,能够自动对元素进行排序。 - 支持自然排序或通过 Comparator 定制排序逻辑。 - 插入、删除和查找的时间复杂度均为 O(log n)。 #### 数据结构与应用场景 对于不同类型的 Set 实现: - 当需要快速的成员测试而不在乎顺序时可以选择 `HashSet`. - 如果希望保留元素加入集合时的顺序,则应考虑使用 `LinkedHashSet`. - 对有序性的需求较高,比如要频繁获取最小/最大值的情况下推荐选用 `TreeSet`. #### 示例代码展示常见操作 下面给出一段简单的例子来说明如何创建 Sets 及执行一些基础的操作如求交集和差集: ```java import java.util.HashSet; import java.util.Set; public class Example { public static void main(String[] args) { // 创建两个整型的 HashSet Set<Integer> setA = new HashSet<>(); Set<Integer> setB = new HashSet<>(); // 添加元素至第一个集合 setA.add(1); setA.add(2); setA.add(3); // 添加元素至第二个集合 setB.add(2); setB.add(3); setB.add(4); // 计算 A ∩ B (即两者的公共部分) Set<Integer> intersection = new HashSet<>(setA); intersection.retainAll(setB); System.out.println("Intersection of sets is: " + intersection); // 计算 A - B (即只存在于前者而不属于后者的部分) Set<Integer> differenceAB = new HashSet<>(setA); differenceAB.removeAll(setB); System.out.println("Elements only in first set are: " + differenceAB); // 计算 B - A Set<Integer> differenceBA = new HashSet<>(setB); differenceBA.removeAll(setA); System.out.println("Elements only in second set are: " + differenceBA); } } ``` 这段程序展示了怎样利用 `retainAll()` 函数计算两个集合之间的交集,以及运用 `removeAll()` 方法找出差异项[^3].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值