Java面试题-2
程序员文章站
2022-05-06 17:22:15
...
1.实例方法和静态方法有什么不一样?
1.在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象.方法
"的方式。而实例方法只有后面后面这种方式。
2.静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),
而不允许访问实例成员变量和实例方法;实例方法则无此限制。
3.程序的static块只能调用静态方法,不能调用实例的方法
原因:静态方法是随着类的加载而加载的,在编译期间静态方法的行为已经确定,
而实例方法只有在运行期间当实例确定之后才能确定。
2.谈谈Servlet的执行流程
Servlet的生命周期:
1.执行servlet的构造器
2.执行init初始化方法:工程启动之后,我们第一次访问Servlet程序的时候执
行1和2两个步骤
3.执行service业务方法:每次都会执行service方法
4.执行destory销毁方法:当web工程停止的时候(重新部署)
3.谈谈你对volatile以及synchronized的理解
Java多线程中的原子性、可见性、有序性
1.原子性:是指线程的多个操作是一个整体,不能被分割,要么就不执行,要么
就全部执行完,中间不能被打断。
2.可见性:是指线程之间的可见性,就是一个线程修改后的结果,其他的线程能
够立马知道。
3.有序性:为了提高执行效率,java中的编译器和处理器可以对指令进行重新排
序,重新排序会影响多线程并发的正确性,有序性就是要保证不进行重新排序。
volatile:volatile是轻量级的synchronized,它在多线程开发中保证了共享变
量的“可见性”。它比synchronized的使用和执行成本更低,因为它不会引起线程上
下文的切换。
synchronized:sychronized提供了同步锁的概念,被sychronized修饰的代码
段可以防止被多个线程同时执行。因为sychronized保证了在同一时刻,只能有一个
线程执行同步代码块,所以执行同步代码块的时候相当于是单线程操作了,那么线程的
可见性、原子性、有序性它都保证。
volatile和synchronized关键字的区别:
1.volatile只能作用于变量,使用范围较小。synchronzied可以用在变量、
方法、类、同步代码块等,使用范围较广。
2.volatile之恩呢保证可见性和有序性,不能保证原子性。而可见性、有序性、
原子性synchronized都可以保证。
3.volatile不会造成线程阻塞。synchronized可能会造成线程阻塞。
4.说说JVM内存结构,什么时候发生YGC,什么时候发生FGC
JVM分为堆区、栈区、方法区、本地方法栈和程序计数器。堆内存逻辑上分为新生代、
养老代、永久代,新生代又法分为伊甸园区、幸存者0区和幸存者1区。
YGC:对新生代进行gc。频率比较高,因为大部分对象的存活寿命较短,在新生代里被
回收,性能耗费较小。
FGC:全堆范围的gc。默认堆空间使用到达80%(可调整)的时候会触发FGC。以我们生
产环境为例,一般比较少会触发FGC,有时10天或者一周左右会有一次。
1.伊甸园区空间不足时,执行YGC
2.养老代空间不足,永久代空间不足,调用方法System.gc(),此时会执行FGC
5.谈谈你对索引的理解,为什么索引可以加快查询速度?在哪些情况下索引无效
索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构。
索引为何加快查询的速度?=:DB在执行一条SQL语句的时候,默认的方式是根据搜索
条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索
引,查询时就会先去索引列表中一次定位到特定值得行数,大大减少遍历匹配的行数,
所以能明显增加查询的速度。
索引何时失效:
1.如果条件中有or,即使有条件带索引也不会使用(只能让or条件中的每个列都加上
索引)
2.对于多列索引,不是使用的第一部分,索引会失效
3.like查询是以%开头
4.如果列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不使用索引
5.如果MySQL使用全表扫描比索引快,则不使用索引
6.谈谈Spring IOC和AO
IOC:所谓控制反转,即由Spring来负责控制对象的生命周期和对象间的相互关系。
IOC对相互依赖对象的创建和协调工作都交由Spring容器来实现,当某个对象需要其
他协作对象时,由Spring动态的通过依赖注入的方式来提供协作对象,其只需要关注
业务本身的逻辑即可。
AOP:与AOP相对的OOP(Object Oriented Programming,面向对象编程),
OOP引入封装、继承、多态等概念建立一种纵向的开发方式,而AOP则是建立了一种横
向的开发方式。对于如权限认证、日志、事务等几乎业务功能都需要的功能,若采用
OOP的设计则会产生大量的重复代码,不利于各模块的重用。
而AOP则把系统分为两部分:核心关注点和横切关注点。业务的核心处理流程为核
心关注点,与之相对的诸如上面提到的权限认证、日志、事务等则为横切关注点。AOP
思想的作用在于分离系统中的各种关注点,进一步解耦合块将的相互依赖,提高模块的
重用性。
7.如何解决跨域问题?
跨域问题:当前端异步请求时,访问的请求地址的协议、ip地址、端口号任意一个与当
前站点不同时,就会涉及跨域访问。
解决方案:
1.response添加header
2.JQuery提供了JSONP思想
3.HttpClient请求转发
4.Nginx转发:利用Nginx方向代理,将请求分发到部署到相应项目的tomcat服
务器
8.谈谈你对单点登录的理解。当用户登录之后访问了系统A与系统B,用户在系统A退出,如何实现系统B的同步退出
删除Cookie和缓存中的用户数据(不确定是否为正确答案)
9.SOA与微服务的区别
1.微服务剔除SOA中复杂的ESB企业服务总线,所有的业务智能逻辑在服务内部处理,
使用Http(Rest API)进行轻量化通信
2.SOA强调按水平架构划分为:前、后端、数据库、测试等,微服务强调按垂直架构划
分,按业务能力划分,每个服务完成一种特定的功能,服务即产品。
3.SOA将组件以library的方式和应用部署在同一进程中运行,微服务则是各个服务独
立运行。
4.传统应用倾向于使用统一的技术平台来解决所有问题,微服务可以针对不同业务特征
选择不同技术平台,去中心统一化,发挥各种技术平台的特长。
5.SOA架构强调的是异构系统之间的通信和解耦合;微服务架构强调的是部署,系统按
业务边界做细粒度的拆分和部署。
10.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月兔子总数为多少?(写一个简单程序,输入想要查询的月份回车,打印出这个月的兔子总数,并将此次查询记录保存在E盘Log目录下面的log.txt文件里面)
public class Rabbit {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int month = scanner.nextInt();
String log ="";
if (month <= 0) {
log=new Date() +"---输入的月份有误";
} else {
int sum = func(month);
log=new Date() +"---第" + month + "个月有" + sum + "对兔子";
}
System.out.println(log);
FileOutputStream fos=null;
try {
fos=new FileOutputStream(new File("E://log.txt"));
byte[] b = log.getBytes();
fos.write(b);
} catch (Exception e) {
e.printStackTrace();
}finally {
fos.close();
}
}
public static int func(int month) {
if (month == 1 || month == 2) {
return 1;
} else {
return func(month - 1) + func(month - 2);
}
}
}
推荐阅读
-
开发zeroc ice应用入门(java开发ice应用,python开发ice应用,java与python结合开发ice服务)
-
4999元起 小米10 Pro首销战绩公布:55秒全平台销售额突破2亿元
-
TCP-IP详解 卷2 :实现 pdf下载
-
[20181124]关于降序索引问题2.txt
-
SpringBoot:Java High Level REST Client 搜索 API
-
微信公众号内测文章“打赏”功能 小费最低2元
-
Java自学-数组 Arrays
-
从一道没人能答对的面试题聊聊Java的值传递
-
SpringBoot2.x+Redis+nginx实现session共享和负载均衡
-
SSH开发模式——Struts2(第二小节)