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. 按日期切割nginx访问日志--及性能优化

    先谈下我们需求,一个比较大的nginx访问日志,根据访问日期切割日志,保存在/tmp目录下. 测试机器为腾讯云机子,单核1G内存.测试日志大小80M. 不使用多线程版: #!/usr/bin/env ...

  2. Bootstrap学习笔记博客

    本片博客用于记录之后要用到Bootstrap的学习笔记   概括: Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASC ...

  3. 堆排序分析及php实现

    堆排序:是一种特殊形式的选择排序,他是简单选择排序的一种改进. 什么是堆? 具有n个元素的序列:{k1,k2,ki,…,kn} (ki <= k2i,ki <= k2i+1) 或者 (ki ...

  4. [Java] ApplicationContext 辅助类

    我们经常需要获取各种 bean , 需要用到 context. 下面的类可以方便的使用 context , 获取 bean 等. import java.io.File; import java.ut ...

  5. PHP XML和数组互相转换

    //数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) ...

  6. Androidstudio预览时出现错误java.lang.NoClassDefFoundError: com/android/util/PropertiesMap

    参考博客;http://blog.csdn.net/daqi1983/article/details/51474588 更改对应版本的SDK即可.

  7. Android之自定义侧滑菜单

    先来上图: 我们把主界面从左向右拉动,可以看到地下有一层菜单页,从透明渐渐变得不透明,从小渐渐变大,感觉上觉得菜单页是从屏幕外面被拉到屏幕中的.下面的代码实现这个DEMO: 首先是自定义控件Slidi ...

  8. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  9. 在布局文件中使用Fragment的步骤

    为了在Activity布局文件中使用Fragment我们需要四个步骤. 1.定义一个Activity,他继承android.support.v4.app.FragmentActivity,下面是关键代 ...

  10. linux命令crontab

    1.需求 服务端计划任务执行 2.例子 使用crontab命令 参考:http://justjavac.com/other/2013/09/22/linux-scheduled-task-cronta ...