java面试宝典(24)

152 阅读3分钟

学习java.java企业级实战项目

  1. 迭代器 Iterator 是什么?

    迭代器是一种设计模式,也是一个对象,可以用来遍历并选择序列(比如ArrayList或HashMap)中的对象,而开发人员不需要了解该序列的底层结构。

    迭代器通常被称为“轻量级”对象,因为创建它的代价小。

  1. Iterator 怎么用?有什么特点?

Iterator比较好用,而且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。比如list.iterator()

(2) 用next()得到序列中的下一个元素。

(3) 使用hasNext()检查是否还有其它元素。

(4) 使用remove()将迭代器新返回的元素删除。但不建议一遍迭代一边删除,有可能引发并发问题。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

  1. Iterator 和 ListIterator 有什么区别?

Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。 

Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。 

ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引等等,但在实际用的时候,大多也是只用到迭代的功能。

一般只建议使用Iterator,别区分地对List对象用ListIterator。

  1. 并行和并发有什么区别?

并行是指两个或多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。

实际应用场景里,一般是考虑多并发问题,而不是多并行问题。

  1. 线程和进程的区别?

进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程,但一个进程一般有多个线程。

进程在运行过程中,需要拥有独立的内存单元,否则如果申请不到,就会挂起。而多个线程能共享内存资源,这样就能降低运行的门槛,从而效率更高。

线程是是cpu调度和分派的基本单位,在实际开发过程中,一般是考虑多线程并发。

  1. 守护线程是什么?

守护线程(daemon thread),是个服务线程,用来监视和服务其它线程。

  1. 创建线程有哪几种方式?

①. 继承Thread类创建线程类

通过extends Thread定义Thread类的子类,并重写该类的run方法。

创建Thread子类的实例,并调用线程对象的start()方法来启动该线程。

②. 通过Runnable接口创建线程类

implements Runnable接口的实现类,并重写该接口的run()方法。

创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

调用线程对象的start()方法来启动该线程。

③. 通过Callable和Future创建线程

创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

使用FutureTask对象作为Thread对象的target创建并启动新线程。

调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

    另外,还有通过线程池来创建线程