1.Comparable接口

说明:可比较(可排序的)

例子:按照MyClass的y属性进行生序排序

class MyClass implements Comparable<MyClass>{
private int x;
private int y; public MyClass(int x,int y){
this.x=x;
this.y=y;
} @Override
public int compareTo(MyClass o) {
//按照y进行升序排序
return y<o.y?-1:(y==o.y?0:1);
} @Override
public String toString(){
return x+"@"+y;
}
} main函数
List<MyClass> list=new ArrayList<>(Arrays.asList(new MyClass(1,2),new MyClass(3,1),new MyClass(2,3)));
Collections.sort(list);
System.out.println(list); 结果:
[3@1, 1@2, 2@3]

2.Comparator接口

说明:迭代器,是sort函数的参数

例子:按照MyClass的x属性进行排序

class MyClass{
public int x;
public int y; public MyClass(int x,int y){
this.x=x;
this.y=y;
} @Override
public String toString(){
return x+"@"+y;
}
} class MyComparator implements Comparator<MyClass>{
@Override
public int compare(MyClass o1,MyClass o2){
return o1.x<o2.x?-1:(o1.x==o2.x?(o1.y<o2.y?-1:(o1.y==o2.y?0:1)):1);
} } 

main函数 
List<MyClass> list=new ArrayList<>(Arrays.asList(new MyClass(1,2),new MyClass(3,1),new MyClass(3,3),new MyClass(3,2),new MyClass(2,3)));
Collections.sort(list,new MyComparator());
System.out.println(list);
结果: [1@2, 2@3, 3@1, 3@2, 3@3]

3.Iterable接口

说明:可迭代,实现Iterable<T>接口之后,可以用Foreach遍历

例子:有点多余,List直接就可以用foreach遍历

class MyClass implements Iterable<Integer>{
public List<Integer> list=new ArrayList<>(Arrays.asList(new Integer(1),new Integer(2),new Integer(3))); @Override
public Iterator<Integer> iterator() {
return list.iterator();
} @Override
public String toString(){
return super.toString();
}
}

例子:结合Iterator接口

class MyClass implements Iterable<Integer>{
int[] array=new int[]{1,2,3,4,5,6,7};
int index=0; @Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
@Override
public boolean hasNext() {
return index<array.length;
} @Override
public Integer next() {
return array[index++];
} @Override
public void remove() {
throw new UnsupportedOperationException();
}
};
} @Override
public String toString(){
return super.toString();
}
}

4.Readable接口

说明:实现Readable接口后可以作为Scanner对象的输入流

例子:

public class TaskTimeoutDemo {
public static void main(String[] args) {
Scanner scanner=new Scanner(new MyClass(2));
while(scanner.hasNext()){
System.out.println(scanner.nextLine());
}
}
} class MyClass implements Readable{
private int count;
public MyClass(int count){
this.count=count;
} @Override
public int read(CharBuffer cb) throws IOException {
if(count--==0) return -1;
cb.append("Aa");
cb.append("Bb");
cb.append("Cc");
cb.append("Dd");
cb.append("Ee");
cb.append("Ff");
cb.append("Gg");
cb.append("Hh");
cb.append("Ii\n");
return 1;
}

这里需要注意一点什么时候会调用read函数?

1.scanner.hasNext()后发现缓冲区中没有数据,就回去读区输入流中的数据,输入流的数据存储在CharBuffer中,上边的例子中一次read会向缓冲区中添加一行字符串,整个程序会调用两次read函数。

12.Java中Comparable接口,Readable接口和Iterable接口的更多相关文章

  1. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  2. Java中的集合(十二) 实现Map接口的WeakHashMap

    Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...

  3. Java 中 Comparable 和 Comparator 比较

    Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...

  4. java中封装,继承,多态,接口学习总结

    ### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通 ...

  5. Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  6. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

    1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...

  7. [转] Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  8. java中有关流操作的类和接口

    一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...

  9. 多线程——Java中继承Thread类与实现Runnable接口的区别

    线程我只写过继承Thread类的,后来知道java多线程有三种方式,今天首先比较一下常用的继承Thread类和实现Runnable接口的区别. 按着Ctrl键进入Thread之后,发现Thread类也 ...

随机推荐

  1. redis 操作string 的测试

    1>set  set name zhangsan :OK get name: zhangsan set name lisi:OK get name: lisi   2> setnx 如果存 ...

  2. Zabbix自定义监控8080端口的连接数

    Zabbix自定义监控8080端口的连接数 一 zabbix自定义监控实现思路 实际上我们要想使用zabbix来监控一些服务的原理很简单,步骤分别是:1.写一个脚本用于获取待监控服务的一些状态信息2. ...

  3. 关于node的http模块

    var http = require('http'); /** * 创建服务器的两种写法,第一种写法如下 * 由于server已经继承了EventEmitter的事件功能,所以可以使用高级函数编写方式 ...

  4. zend studio面板功能

    不小心把zend界面右边的显示类中各个方法的窗口关掉了,如何打开呢: 法一:点击Windows菜单,选择show view项,选择outline即可: 法二:点击Windows菜单,选择Reset P ...

  5. 转→js数组遍历 千万不要使用for...in...

    看到一篇内容还不错,但是排版实在糟糕, 逼死强迫症患者啊,直接拉下去找原文连接,找到了,但是已经消失了···500错误... 第一次因为实在看不下去一篇博客的排版, 为了排版而转载... 转载地址:h ...

  6. mac 快捷键拾遗

    1.隐藏所有其它窗口 (hide) 窗口太多太乱,按下Command+Option/alt+H组合键,除了当前窗口以外的其它窗口会自动隐藏(不是缩小). 2. Command X        留意, ...

  7. 通过transform修改位置 大小 旋转 形变

    --通过transform修改位置(平移)- CGAffineTransformMakeTranslation(**X偏移量**, **Y偏移量**);- CGAffineTransformTrans ...

  8. Toad各版本所包含的组件

    Toad for Oracle Base Edition Toad for Oracle Knowledge Xpert for PL/SQL Knowledge Xpert for Oracle A ...

  9. python的反转(切片)

    看下面代码吧,简单来说不如直接看代码.如下: #coding=utf-8 __author__ = 'debude' a = 'python' print a[::-1] #从最后n开始,每走一位都打 ...

  10. springmvc拦截器验证登录时间

    在前一篇[Filter实现用户名验证]的随笔里,记录了如何使用filter 这次增加了拦截器实现 ①filter实现用户登陆时验证用户名是否为null ②interceptor实现用户登陆时时间判断, ...