JavaAPI学习——java.lang(二)

6 Iterable<T>

  • 已知经常使用子接口:Collection<T>、List<T>、Set<T>;
  • 实现该接口的类能够成为foreach 语句的目标
List<String> list = new ArrayList<String>();
for(List item : list){
    do something...
}
  • 惟一方法:Iterator<T> iterator():返回一个在一组 T 类型的元素上进行迭代的迭代器。
//使用Iterator<T> 遍历Collection对象
    List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){ //判断是否存在下一个元素
            int itme = (int) iterator.next(); //获取下一个元素
            System.out.println(itme);
            iterator.remove(); //移除该元素
        }

7 Readable: 为Scanner类专门建立的接口。

  • 实例化一个Scanner对象,构造方法的入参能够是任何实现了Readable接口的类的对象,该类实现Readable接口的read()方法,当调用Scanner对象的next()方法时,讲使用本身实现的read()方法。
package com.heisenberg.Learn;

import java.nio.CharBuffer;
import java.util.Scanner;
import static java.lang.System.*;

public class Test implements Readable{
    private int readCount = 1;//read()执行次数  
    private int loopCount = 1;  
    public Test() {  }   
    public int read(CharBuffer cb) {  

        if (loopCount == 1){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            cb.append("aa bb cc ");
            loopCount++;return 1;
        }//仅仅在第一次和第六次给CharBuffer添加3个数据  
        if (loopCount == 2){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            loopCount++;
            return 1;
        }//其余的时候返回1,可是并不往Buffer中存放数据,来骗被调用者hasNext(),来观察出现了什么现象  
        if (loopCount == 3){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            loopCount++;
            return 1;
        }  
        if (loopCount == 4){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            loopCount++;
            return 1;
        }  
        if (loopCount == 5){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            loopCount++;
            return 1;
        }  

        if (loopCount == 6){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            cb.append("oo pp qq ");
            loopCount++;
            return 1;
        }  
        if (loopCount == 7){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            loopCount++;
            return 1;
        }  
        if (loopCount == 8){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            loopCount++;
            return 1;
        }  
        if (loopCount == 9){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            loopCount++;
            return 1;
        }  
        if (loopCount == 10){
            out.println("进入read执行第" + readCount + "次");
            readCount++;
            return -1;
        }  
        return 1;     
    }  

    public static void main(String[] args) {  
        int a = 1;//外层循环的次数  
        Scanner s = new Scanner(new Test())  ;
        while(s.hasNext()){//这个hasNext()方法会调用read()方法的  
            out.println("第" + a + "次执行外层循环");  
            a ++;  
            System.out.println("从cb中读出 " + s.next());  
        }  
    }  

}

以上demo的运行结果为:
进入read执行第1次
第1次执行外层循环
从cb中读出 aa
第2次执行外层循环
从cb中读出 bb
第3次执行外层循环
从cb中读出 cc
进入read执行第2次
进入read执行第3次
进入read执行第4次
进入read执行第5次
进入read执行第6次
第4次执行外层循环
从cb中读出 oo
第5次执行外层循环
从cb中读出 pp
第6次执行外层循环
从cb中读出 qq
进入read执行第7次
进入read执行第8次
进入read执行第9次
进入read执行第10次java

当调用s.hasNext()时,程序会判断字符缓冲区中是否还有未读字符,若是有,则返回true,调用s.next()时,返回未读字符串第一个空格前的全部字符。若是缓冲区中没有未读字符,则调用Readable.read()方法,向字符缓冲区中放入字符,Readabel.read()返回-1以外的任何整数,当字符缓冲区没有未读字符时,都将会继续调用Readable.read()方法,直到Readable.read()方法返回-1,才会结束while循环体。多线程

8 Runnable

  • 实现该接口的类必须实现run()方法,run()方法的实现将在新的线程中执行;
  • Thread类实现了Runnable接口,因此一个类经过继承Thread类实现多线程,也是间接的采用实现Runnable接口。
package com.heisenberg.Learn;

import static java.lang.System.*;

public class Test implements Runnable{
    

    @Override
    public void run() {
        for (int i = 0 ; i< 10; i++) {
            out.println("新线程中的第" + i + "次循环");
        }
        
    }

    public static void main(String[] args) {  
        Thread newThread = new Thread(new Test());
        newThread.start();
        for (int i = 0 ; i< 10; i++) {
            out.println("main方法中的第" + i + "次循环");
        }
    }  

}

可能的一种运行结果为:
main方法中的第0次循环
main方法中的第1次循环
新线程中的第0次循环
新线程中的第1次循环
main方法中的第2次循环
main方法中的第3次循环
main方法中的第4次循环
main方法中的第5次循环
main方法中的第6次循环
main方法中的第7次循环
main方法中的第8次循环
main方法中的第9次循环
新线程中的第2次循环
新线程中的第3次循环
新线程中的第4次循环
新线程中的第5次循环
新线程中的第7次循环
新线程中的第8次循环
新线程中的第9次循环app

相关文章
相关标签/搜索