Java学习笔记——Collections、Comparable、Comparator

Collections、Comparable、Comparator

Collections

操作集合的工具类,包含很多操作集合的静态方法

直接Collections.方法名就可以使用

返回值方法名说明
booleanaddAll(Collection<?super T> c,T…elements)往集合中添加一些元素
voidshuffle(List<?> list)使用默认的随机源重新排列指定的集合
voidsort(List list, Comparator<? super T> c)使用指定的比较器对集合进行排序
  • sort()方法也可以不指定比较器,使用默认的规则,那么就要我们存储在集合中的元素实现Comparable接口,就是写一个排序规则,一般系统定义的类都会实现这个方法,

Comparable接口

  • 当成一个内比较器,实现这个接口的类可以给自己实例化的对象做比较,从而将这个类创建的对象排出个序来。

    • Integer类中就实现了这个接口:

      public final class Integer extends Number implements Comparable<Integer> {
      
  • 但是我们自定义的类要使用sort方法时,就需要我们自己去实现Comparable接口

    • (类名后加implements Comparable,根据提示重写compareTo方法即可)
        @Override
        public int compareTo(Object o) {
            Student student = (Student)o;
            if (this.getId()>student.getId()){
                return 1;
            }else if (this.getId()<student.getId()){
                return -1;
            }else {
                return 0;
            }
        }
    

Comparator接口

可以将它当成一个外比较器。实现这个接口专门写出一个比较器类来,用来给特定的类个性化排序。

在我们使用sort()方法时,除了使用类去实现Comparable接口外,其实还可以自定义一个比较器,当我们想要使用自己指定的规则去排序时,就可以直接使用写好的比较器。

Comparator接口,排序是它能实现的功能之一

public class MyComparator1 implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {

        if (o1.getId()> o2.getId()){
            return 1;
        }else if (o1.getId()<o2.getId()){
            return -1;
        }else {
            return 0;
        }
    }
}

Comparable 和Comparator接口的区别

  • Comparable:
    • 强行对实现它的每一个类的对象进行整体排序,这种排序被称为类的自然排序,类的compareTo方法被称为自然比较方法,只能在类中实现compareTo方法一次,使用十分死板。但是实现此接口的对象可以直接通过Collection.sort()方法来进行排序.
  • Comparator:
    • 强行对某个对象进行整体排序,可以将Comparator传递给sort方法,从而允许排序的规则自定义控制。
  • Comparator的两个优点
    • 个性化比较:Comparator是单独定义的一个类,使用修改起来更加自由。想使用不同的排序规则就可以写不同的Comparator实现类。和需要排序的类放在一起就可以使用。
    • 解耦:在类中实现Comparable接口的耦合性更大一些,我们想要修改排序规则时,Comparable就要修改实现类内部的compareTo方法,而Comparator在外部比较,直接修改(或者更换)比较器就可以。
自己做的TEST网络聊天 package com.tsing.chat.frame; import java.awt.*; import java.awt.event.*; import java.util.EventListener; import java.io.*; import java.net.*; import javax.swing.JOptionPane; public class ClientFrame extends Frame implements ActionListener { //窗体应该有发送按钮、文本框用来输入东西、List列表用来显示信息 Button connectbutton = new Button("连接"); Button sendbutton = new Button("发送"); List list = new List(); TextField content = new TextField(20); TextField servername = new TextField("localhost", 20); Label label = new Label("输入服务器名字:"); Socket socket; String num; public ClientFrame(String num) { this.num = num; this.setTitle("山寨QQ (用户:" + num + ")"); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { try { MsgBean bean = new MsgBean(); bean.setType("请求下线"); bean.setSource(ClientFrame.this.num); //发送消息请求下线 OutputStream out = socket.getOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream( out); objectOutputStream.writeObject(bean); objectOutputStream.flush(); } catch (Exception ew) { ew.printStackTrace(); } //退出系统 System.exit(0); } }); sendbutton.addActionListener(this); connectbutton.addActionListener(this); Panel p1 = new Panel(); p1.add(label); p1.add(servername); p1.add(connectbutton); Panel p2 = new Panel(); p2.add(content); p2.add(sendbutton); Panel p3 = new Panel(); p3.setLayout(new BorderLayout()); p3.add("South", p2); list.setFont(new Font("微软雅黑", Font.BOLD, 14)); p3.add(new ScrollPane().add(list)); this.add("South", p1); this.add(p3); this.setSize(400, 300);// this.setResizable(false); //不能缩放窗口 this.setVisible(true); } public static void main(String[] args) { String num = JOptionPane.showInputDialog(null, "输入自己的QQ号码"); boolean b = false; do { b = false; if (num == null || num.equals("")) { num = JOptionPane.showInputDialog("QQ号码不能为空,请重新输入:"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值