Java Generator,java基础面试笔试题


我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
推荐文章:Java 面试知识点解析Mysql优化技巧(数据库设计、命名规范、索引优化

以前我以为只有Python才会有generator,看来当时的我才年轻,后来认真研读《Thinking in Java》之后大有感悟,原来Java亦有generator,故做一次记录分享。过程中主要通过具体代码展示笔记简单比较Python generator来加深理解。

1、什么是Java Generator

关于Generator我的理解主要如下,如有不妥,希望大家指正!

(1)python中这样理解:在一个过程中一边循环一边计算返回,能让单独的循环功能模块(也可以理解为一个单线程)不断“挂起”生成结果而不会一直循环到return为止。 其中能说明的就是求斐波拉契数列,关键字yield是不断返回下一个b的值,也就是return next()

注意:有些博主以为Python协程中有yield关键字,所以跟generator是一回事,但是我不这么认为。

1 def fib(max):

2     n, a, b = 0, 0, 1

3     while n < max:

4         #之前是print (b)

5         yield b

6         a, b = b, a + b

7         n = n + 1

输出结果:

#第一次next():1

print(fib(1))

#第二次next():2

print(fib(2))

#第三次next():3

print(fib(2))

(2)Java中这样理解:将泛型应用于接口,接口必须有返回类型为泛型T的next()方法,是一种专门负责创建对象的类。在很多设计模式都会用到(比如工厂方法模式),类似于Iterable对象中使用使用next()不断获得下一个值,这里泛型接口中的next()方法返回创建对象。

2、实现一个CommonGenerator通用生成器

实现一个通用生成器,通过next不断返回一个对象的实例

interface Generator

1 /**

2  * Generator泛型接口 

3  * @author Jian

4  * @param <T>

5  */

6 public interface Generator<T> {

7     T next();

8 }

CommonGenerator:

 1 /**

 2  * CommonGenerator继承Generator泛型接口,实现通过next不断返回实例

 3  * @author Jian

 4  * @param <T>

 5  */

 6 public class CommonGenerator<T> implements Generator<T>{

 7     private Class<T> type;

 8     /**

 9      * CommonGenerator Constructor

10      * @param type

11      */

12     public  CommonGenerator(Class<T> type) {

13         this.type = type;

14     }

15     /**

16      * next()不断返回xxx.class的对象

17      */

18     @Override

19     public T next() {

20         try {

21             //传入class返回对象

22             return type.newInstance();

23         } catch (Exception e) {

24             throw new RuntimeException(e);

25         }

26     }

27     /**

28      * @param type 传入创建类xxx.class

29      * @return CommonGenerator实例

30      */

31     public static <T> Generator<T> create(Class<T> type){

32         return new CommonGenerator<T>(type);

33     }

34 }

TestObject:

 1 /**

 2  * 测试类:统计返回测试类的引用实例的数目

 3  * @author Jian

 4  *

 5  */

 6 public class TestObject {

 7     private static long counter= 0;//统计计数器

 8     public String toString() {

 9         //注意:这里return中不能用this,否则会出现递归

10         return "TestObject " + (counter++);

11     }

12 }

MainClass:

1 public class MainClass {

2     public static void main(String[] args) {

3         Generator<TestObject> generator = new CommonGenerator<>(TestObject.class);

4         for(int i=0;i<3;i++) {

5             //generator.next()返回对象,输出调用toString方法

6             System.out.println(generator.next());

7         }

8     }

9 }

输出:

TestObject 0

TestObject 1

TestObject 2


转载:https://www.cnblogs.com/jian0110/p/9341175.html

推荐内容:
深入理解Java反射+动态代理
Java连接Oracle
Java面试总结
由浅入深理解Java线程池及线程池的如何使用
Java在常见的spring面试问题TOP50
Java 11 新功能来了!
两道面试题,带你解析Java类加载机制
JAVA工程师面试题库
java面试教程视频
java对list进行排序

猜你喜欢

转载自blog.csdn.net/bee_wa/article/details/89710159