java集合中Comparable和Comparator辨析

简介:

一.Comparable和Comparator简介

在对集合元素进行比较时一般使用TreeSet.对于简单的数据类型,TreeSet可以直接进行比较。但是对于复杂的数据类型,比如自己定义的数据类型或者类,就需要自己设置比较方法与比较规则了,这时就需要使用Comparable和Comparator。 Comparable和Comparator都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现排序,而Comparator是在集合外部实现的排序。所以如果想对结合排序,需要在集合外定义Comparator接口的方法或在集合内部实现Comparable接口的方法。

一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的结合就可以直接使用sort方法排序。

Comparator是策略模式,就是在不改变对象自身,而用一种策略对象来改变它的行为,将算法和数据分离,Comparator还可以在下面两种环境下使用:

   1.类在设计时没有考虑到比较问题而没有实现Comparable接口,则可以通过Comparator来实现排序而不必修改原来的类代码。

2.类设计时实现了Comparable接口,但是后面的使用者却想用一种新的比较规则对类进行比较

二。用法示例:

Comparable排序:

首先定义实现Comparable接口的Item类

package com.collection;
 
import java.util.Objects;
 
/**
 * @author朱伟
 * 定义实现Comparable接口的Item类
 *
 */
public class Item implements Comparable<Item>{
    private String description;
    private int partNumber;
   
    public Item(String aDescription, int aPartNumber)
    {
       description = aDescription;
       partNumber = aPartNumber;
    }
   
    public String getDescription()
    {
       return description;
    }
   
    public String toString()
    {
       return "[description="+description+",partNumber="+partNumber+"]";
    }
   
    public boolean equals(Object otherObject)
    {
       if(this == otherObject)
           return true;
       if(otherObject == null)
           return false;
       if(getClass()!=otherObject.getClass())
           return false;
       Item other = (Item)otherObject;
       return Objects.equals(description, other.description) &&partNumber == other.partNumber;
    }
   
    public int hashCode()
    {
       return Objects.hash(description,partNumber);
    }
 
    //重载compareTo方法,设定Item对象的比较方法
    @Override
    public int compareTo(Item other)
    {
      
       return Integer.compare(partNumber, other.partNumber);      
    }
   
 
}
 


 

定义对Item进行排序的类,对集合进行排序是使用TreeSet或TreeMap,此处用TreeSet存放集合元素。

package com.collection;
 
import java.util.TreeSet;
 
public class ListSortWithComparable
{
 
    public static void main(String[] args)
    {
       TreeSet<Item> set = new TreeSet<>();
       set.add(new Item("zhuwei",26));
       set.add(new Item("yinyuchun",24));
       set.add(new Item("xiaobai",25));
       set.add(new Item("chun",24));
      
       for(Item it : set)
       {
           System.out.println(it.toString());
       }
 
    }
 
}
 


Comparator排序实现示例:

首先定义需要排序的类People

package com.collection;
 
public class People
{
    private String name;
    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;
    }
    private int age;
 
    public People(String name,int age)
    {
       this.name = name;
       this.age = age;
    }
    public String toString()
    {
       return ("name:"+this.name+",age:"+this.age);
    }
}


 

接着建立对People进行排序的类,利用Comparator进行排序有两种方法,第一种方法是把需要排序的People对象放在List集合中,然后调用Collection.sort(list,comparator)方法进行排序;第二中排序方法是直接把Comparator对象传递给TreeSet的构造器,并重载Comparator类的compara方法,指定排序规则,这种方法不需要让People类实现Comparator接口,且其代码较简洁。

Comparator

package com.collection;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
 
public class ListSortWithComparator
{  
    publicstatic void main(String[] args)
    {
       /*
        * 使用comparator进行排序的第一种方法,
        * 定义一个实现Comparator接口的类,并重载compara方法,设定比较规则
        * 利用Collection.sort(list,comparator)方法实现排序,
        * Collection.sort(list,comparator)方法的第一个参数为List类型,因此要排序的元素需要放在List集合中
        */
       List<People>list = new ArrayList<>();
       list.add(newPeople("zhuwei",26));
       list.add(newPeople("yinyuchun",25));
       list.add(newPeople("xiaobai",26));
 
       MComparatorcomparator = new MComparator();
      
       Collections.sort(list,comparator);
      
       for(Peoplep:list)
       {
           System.out.println(p.toString());
       }
      
      
       /*
        * 使用comparator进行排序的第二种方法,
         * 该方法不需要People实现Comparator接口
        * 直接Comparator对象传递给TreeSet的构造器,
        * 并重载Comparator类的compara方法,指定排序规则
        */
//     SortedSet<People>set = new TreeSet<>(
//            newComparator<People>()
//            {
//
//                //重载Comparator类的compara方法,设定比较规则:按名字降序排列
//                @Override
//                publicint compare(People people1, People people2)
//                {
//                   //TODO Auto-generated method stub
//                   if(people1.getName().compareTo(people2.getName())>0)
//                   {
//                       return-1;
//                   }
//                   else
//                   {
//                       return1;
//                   }
//                  
//                }
//               
//            }
//            );
//     set.addAll(list);
//     System.out.println("输出按降序排列的结果:");
//     for(Peoplep: set)
//     {
//         System.out.println(p.toString());
//     }
    }
 
}
 


相关文章
|
7天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
30 3
|
24天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
42 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
46 4
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
37 2
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
8月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
5月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
5月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
3月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
72 5
|
5月前
|
存储 安全 Java
java集合框架复习----(2)List
这篇文章是关于Java集合框架中List集合的详细复习,包括List的特点、常用方法、迭代器的使用,以及ArrayList、Vector和LinkedList三种实现类的比较和泛型在Java中的使用示例。
java集合框架复习----(2)List