您的位置:首页 > 职场人生

来了!Java工程师常见面试题集锦(五)互联网人必看!(附答案及视频教程,持续更新)

2019-01-22 11:45 1266 查看

又一年春运开启,年关将至,回家的火车票抢到了吗?春节嗨喜的心是不是越来越躁动?

来,做几道面试题,沉淀、储备,以最好的状态回家见亲人~

Java工程师常见面试题集锦(一)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/85602533

Java工程师常见面试题集锦(二)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86138938

Java工程师常见面试题集锦(三)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86471513

Java工程师常见面试题集锦(四)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86525565

如果觉得文字学习较慢,也可以跟着老师一起视频学习:

Java面试题视频学习链接:https://edu.csdn.net/course/detail/10533

41. 有n步台阶,一次只能上1步或2步,共有多少种走法?

1)递归

n=1    ->一步                                                              ->f(1) = 1

n=2    ->(1)一 步一步(2)直接2步                                ->f(2) = 2

n=3    ->(1)先到达f(1),然后从f(1)直接跨2步            ->f(3) = f(1) + f(2)

              (2)先到达f(2),然后从f(2)跨1步

n=4    ->(1)先到达f(2),然后从f(2)直接跨2步             ->f(4) = f(2) + f(3)      

              (2)先到达f(3),然后从f(3)跨1步

……

n=x     ->(1)先到达f(x-2),然后从f(x-2)直接跨2步      ->f(x) = f(x-2) + f(x-1

               (2)先到达f(x-1),然后从f(x-1)跨1步   

2)循环迭代      (one保存最后走一步,two保存最后走两步)

n=1    ->一步                                                             ->f(1) = 1

n=2    ->f(1) = 1                                                        ->f(2) = 2         

n=3    ->(1)先到达f(1),然后从f(1)直接跨2步           ->f(3) = two + one 

           (2)先到达f(2),然后从f(2)跨1步                        f(3) = f(1) + f(2)    two = f(1) ; one = f(2) 

n=4   ->(1)先到达f(2),然后从f(2)直接跨2步            ->f(4) = two + one

             (2)先到达f(3),然后从f(3)跨1步                      f(4) = f(2) + f(3)     two = f(2); one = f(3)   

……

n=x     ->(1)先到达f(x-2),然后从f(x-2)直接跨2步     ->f(x) = two + one

               (2)先到达f(x-1),然后从f(x-1)跨1步               f(x) = f(x-2) + f(x-1)   two = f(x-2); one = f(x-1)

小结: 方法调用自身称为递归,利用变量的原值推出新值称为迭代。

1)递归

优点:大问题转化为小问题,可以减少代码量,同时代码精简,可读性好;

缺点:递归调用浪费了空间,而且递归太深容易造成堆栈的溢出。

2)迭代

优点:代码运行效率好,因为时间只因循环次数增加而增加,而且没有额外的空间开销;

缺点:代码不如递归简洁,可读性好

42.变量的分类及其区别

变量的分类有:

1)成员变量:类变量、实例变量

2)局部变量

变量的区别:

①声明的位置

局部变量:方法体{}中,形参,代码块{}中

成员变量:类中方法外

类变量:有static修饰

实例变量:没有static修饰

②修饰符

局部变量:final

成员变量:public、protected、private、final、static、volatile、transient

③值存储的位置

局部变量:栈

实例变量:堆

类变量:方法区

④作用域

局部变量:从声明处开始,到所属的}结束

实例变量:在当前类中“this.”(有时this.可以缺省),在其他类中“对象名.”访问

类变量:在当前类中“类名.”(有时类名.可以省略),在其他类中“类名.”或“对象名.”访问

⑤生命周期

局部变量:每一个线程,每一次调用执行都是新的生命周期

实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例变量是独立的

类变量:随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的

43.Gits实战操练——分支

创建分支

git  branch  <分支名>

git branch –v  查看分支

切换分支

•git checkout  <分支名>

一步完成: git checkout  –b  <分支名>

合并分支

先切换到主干   git  checkout  master

git  merge  <分支名>

删除分支

先切换到主干   git  checkout  master

git  branch -D  <分支名>

 44. 请说出与线程同步相关的方法

1)wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;

2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常;

3)notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;

4)notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争;

5)JDK 1.5通过Lock接口提供了显式(explicit)的锁机制,增强了灵活性以及对线程的协调。Lock接口中定义了加锁(lock())和解锁(unlock())的方法,同时还提供了newCondition()方法来产生用于线程之间通信的Condition对象;

6)JDK 1.5还提供了信号量(semaphore)机制,信号量可以用来限制对某个共享资源进行访问的线程的数量。在对资源进行访问之前,线程必须得到信号量的许可(调用Semaphore对象的acquire()方法);在完成对资源的访问后,线程必须向信号量归还许可(调用Semaphore对象的release()方法)。

45. 编写多线程程序有几种实现方式?

Java 5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值,代码如下所示:

[code]package com.lovo.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

class MyTask implements Callable<Integer> {
private int upperBounds;

public MyTask(int upperBounds) {
this.upperBounds = upperBounds;
}

@Override
public Integer call() throws Exception {
int sum = 0;
for(int i = 1; i <= upperBounds; i++) {
sum += i;
}
return sum;
}
}

public class Test {

public static void main(String[] args) throws Exception {
List<Future<Integer>> list = new ArrayList<>();
ExecutorService service = Executors.newFixedThreadPool(10);
for(int i = 0; i < 10; i++) {
list.add(service.submit(new MyTask((int) (Math.random() * 100))));
}

int sum = 0;
for(Future<Integer> future : list) {
while(!future.isDone()) ;
sum += future.get();
}

System.out.println(sum);
}
}

Java工程师常见面试题集锦(一)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/85602533

Java工程师常见面试题集锦(二)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86138938

Java工程师常见面试题集锦(三)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86471513

Java工程师常见面试题集锦(四)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86525565

如果觉得文字学习较慢,也可以跟着老师一起视频学习:

Java面试题视频学习链接:https://edu.csdn.net/course/detail/10533

46.synchronized关键字的用法?

synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问,可以用synchronized(对象) { … }定义同步代码块,或者在声明方法时将synchronized作为方法的修饰符。在第60题的例子中已经展示了synchronized关键字的用法。

 47.举例说明同步和异步

如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数据库操作中的悲观锁就是最好的例子)。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。事实上,所谓的同步就是指阻塞式操作,而异步就是非阻塞式操作。

48.Java线程池概述

Java线程池的工作原理和数据库连接池的差不多,因为每次重新创建线程

都是很耗资源的操作,所以我们可以建立一个线程池,这样当需要用到线程

进行某些操作时,就可以直接去线程池里面找到空闲的线程,这样就可以直接

使用,而不用等到用到的时候再去创建,用完之后可以把该线程重新放入线程池

供其他请求使用从而提高应用程序的性能。

线程池的核心流程:

1.构建一个 ThreadPoolExecutor 并指定默认要创建的线程的数量

2.通过 threadPool.execute()

去添加一个个要执行的线程即实现了Runable接口的java类

3.在实现了Runable接口的java类的run方法中写入具体的业务代码

49.线程的生命周期

50.Java反射机制的作用

(1)在运行时判断任意一个对象所属的类。

(2)在运行时判断任意一个类所具有的成员变量和方法。

(3)在运行时任意调用一个对象的方法。

(4)在运行时构造任意一个类的对象。

Java工程师常见面试题集锦(一)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/85602533

Java工程师常见面试题集锦(二)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86138938

Java工程师常见面试题集锦(三)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86471513

Java工程师常见面试题集锦(四)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86525565

如果觉得文字学习较慢,也可以跟着老师一起视频学习:

Java面试题视频学习链接:https://edu.csdn.net/course/detail/10533

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: