又一年春运开启,年关将至,回家的火车票抢到了吗?春节嗨喜的心是不是越来越躁动?
来,做几道面试题,沉淀、储备,以最好的状态回家见亲人~
Java工程师常见面试题集锦(一)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/85602533
<https://blog.csdn.net/CSDNedu/article/details/85602533>
Java工程师常见面试题集锦(二)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86138938
<https://blog.csdn.net/CSDNedu/article/details/86138938>
Java工程师常见面试题集锦(三)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86471513
<https://blog.csdn.net/CSDNedu/article/details/86471513>
Java工程师常见面试题集锦(四)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86525565
<https://blog.csdn.net/CSDNedu/article/details/86525565>
如果觉得文字学习较慢,也可以跟着老师一起视频学习:
Java面试题视频学习链接:https://edu.csdn.net/course/detail/10533
<https://edu.csdn.net/course/detail/10533?utm_source=Javablog_01>
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方法可以在线程执行结束时产生一个返回值,代码如下所示:
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
<https://blog.csdn.net/CSDNedu/article/details/85602533>
Java工程师常见面试题集锦(二)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86138938
<https://blog.csdn.net/CSDNedu/article/details/86138938>
Java工程师常见面试题集锦(三)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86471513
<https://blog.csdn.net/CSDNedu/article/details/86471513>
Java工程师常见面试题集锦(四)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86525565
<https://blog.csdn.net/CSDNedu/article/details/86525565>
如果觉得文字学习较慢,也可以跟着老师一起视频学习:
Java面试题视频学习链接:https://edu.csdn.net/course/detail/10533
<https://edu.csdn.net/course/detail/10533?utm_source=Javablog_01>
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
<https://blog.csdn.net/CSDNedu/article/details/85602533>
Java工程师常见面试题集锦(二)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86138938
<https://blog.csdn.net/CSDNedu/article/details/86138938>
Java工程师常见面试题集锦(三)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86471513
<https://blog.csdn.net/CSDNedu/article/details/86471513>
Java工程师常见面试题集锦(四)互联网人必看!https://blog.csdn.net/CSDNedu/article/details/86525565
<https://blog.csdn.net/CSDNedu/article/details/86525565>
如果觉得文字学习较慢,也可以跟着老师一起视频学习:
Java面试题视频学习链接:https://edu.csdn.net/course/detail/10533
<https://edu.csdn.net/course/detail/10533?utm_source=Javablog_01>
热门工具 换一换