欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
        }
    }

}