java对象比较compareTo和TreeSet

本文探讨了Java中对象的比较方式,特别是在使用TreeSet时需要实现Comparable接口以进行自定义排序。通过Student类的例子展示了如何重写compareTo方法进行比较,并通过测试展示了TreeSet按学号、年龄和姓名进行排序的效果。此外,还介绍了Java的可变参数语法及其使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-----------------------java对象比较和TreeSet-----------------------

 

----------------LinkedHashSet----------------

特点:
  1.
元素唯一性

  2.有序性

  3.允许null存在一个

  4.不是线程安全、不是同步的(效率高)

 

--------------TreeSet-------------------------

TreeSet 可以支持自定义排序,如果TreeSet所存储的对象的类没有实现Comparable接口就会报错ClassCastException。所以我们如果想要使用TreeSet来自定义的对象来排序必须实现Comparable接口。

    特点:

1.        元素唯一性

2.        可自定义排序的(自动做自然排序)

3.        不允许null存在

4.        不是线程安全

排序:

类必须要实现一个接口Comparable<T>才能做排序。

例子:

创建一个Sudent类,重写父类的compareTo方法

package cn.tx.set;

 

public  class  Student  implements  Comparable<Student>{

     

   private  intstuId;

  

   private String name;

  

   privateintage;

 

   public  int  getStuId() {

      return  stuId;

   }

 

   public  void setStuId(intstuId) {

      this.stuId = stuId;

   }

 

   public String getName() {

      returnname;

   }

 

   public  void  setName(String name) {

      this.name = name;

   }

 

   public  int getAge(){

      return  age;

   }

 

   public  void setAge(intage) {

      this.age = age;

   }

 

   public Student(intstuId, String name, intage) {

      super();

      this.stuId = stuId;

      this.name = name;

      this.age = age;

   }

 

   @Override

   public String toString() {

      return"Student[stuId=" + stuId + ", name=" + name + ",age=" + age + "]";

   }

 

   /**

    * 实现两个学生的对象比较

    * 比较规则:

    * 如果先比较学号,按照学号的升序排列

    * 如果学号相等,就按照年龄比较,年龄小的在前面

    * 如果学号和年龄都相等,就按照名字的字符串来比较

    */

   @Override

   public  int  compareTo(Student o) {

      //先比较学号

      intval = this.stuId - o.stuId;

      if(val == 0)

        //如果学号相等比较年龄

        val = this.age - o.age;

        if(val == 0) {

           //如果学号和年龄都相等比较名字的字符串

           if(this.name != null&& o.name!= null )

              val = this.name.compareTo(o.name);

        }

      return  val;

   }

  

  

}

-------------------------------------------

测试TreeSet集合的自然排序

例子:

public  class  TreeSetDemo {

     

   public  static  void  main(String[] args) {

      //创建一个TreeSet集合

      Set<String>  set = new  TreeSet<String>() ;

      set.add("b");

      set.add("a");

      set.add("h");

      set.add("j");

      set.add("aa");

      System.out.println(set);   

     

      //创建一个Person泛型的TreeSet集合

      Set<Student> set1 = new  TreeSet<Student>() ;

      set1.add(new  Student(2, "李昆鹏2", 22));

      set1.add(new  Student(3, "李昆鹏3", 23));

      set1.add(new  Student(1, "李昆鹏1", 21));

  

      System.out.println(set1);

   }

}

结果:

[a, aa, b, h, j]

[Student [stuId=1,name=李昆鹏1, age=21], Student [stuId=2, name=李昆鹏2, age=22], Student [stuId=3, name=李昆鹏3, age=23]]

 

 

 

-----------------------可变参数-------------------------

 

可变参数的语法:
修饰符 返回值类型  方法名(数据类型变量){

 

}

例子:

        public static int sum(int… p){

            return 0;

}

注意:参数p实际是一个数组,p都是同一种类型

public  class  DymanicParam {

   public  static  void  main(String[] args) {

      int[] p ={1,2,3,4,5};

      System.out.println(add(p));;;;;;

   }

  

   public  int add(inta,intb) {

      return a+b;

   }

   public  int add(inta,intb,intc) {

      return add(a,b) + c;

   }

  

   /**

    * 可变参数的定义

    * int...p 参数是一个int类型的数组,相当于int[] p

    */

   public  static  int add(int... p) {

      int  sum = 0;

      for (inti = 0; i < p.length; i++) {

        sum += p[i];

      }

      return  sum;

   }

}

结果:

15

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值