阿里巴巴一面

阿里巴巴一面总结

  1. 基本数据类型有几种?分别是什么?在内存中是怎么分布的?

答:8种。byte、short,int、long、char、float、double、boolean。

【自我总结】基本数据类型在内存中是怎么分布的?要视情况而定。如果基本数据类型定义在方法中做局部变量,就存放在栈中;如果基本数据类型做成员变量,就存放在堆中;如果基本数据类型做静态成员变量,就存放在方法区中。

方法内定义的基本数据类型放在帧栈里,而且栈里面的数据是线程独有的,不共享。 那么基本数据类型的全局变量,到底是放在栈里面 还是堆里面,或者方法区里?

java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法调用的过程,就代表了一个栈帧在虚拟机栈中入栈到出栈的过程,当进入一个方法时,这个方法在栈中需要分配多大的内存都是完全确定的,方法运行时不会改变局部变量表的大小——《深入理解java虚拟机第二版》
很多java程序员一开始就被网上的一些教程所误导:基本数据类型放在栈中,数组和类的实例放在堆中。这个说法不准确,事实上,如上面的全局变量i,他是存放在java堆中。因为它不是静态的变量,不会独立于类的实例而存在,而该类实例化之后,放在堆中,当然也包含了它的属性i。
如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。 这两个对象都是线程私有(安全)的。 比如定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能通过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。

  1. 抽象类和接口可以被实例化吗?

答:接口不可被实例化,但是抽象类可以被实例化。

抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。

  1. 抽象类和接口的区别?

(1)接口没有构造函数,抽象类有构造函数,接口不可被实例化,抽象类可以被实例化;

(2)接口用关键字interface修饰,抽象类用关键字abstract修饰;

(3)接口里的方法都是抽象方法(public abstract),抽象类中的方法可以有非抽象方法;

(4)接口可以被实现,抽象类可以被继承。一个类只能继承一个抽象类,但可以实现多个接口;

(5)接口里面都是抽象方法,必须都要重写,抽象类里面可以有抽象方法和非抽象方法,抽象方法必须重写,非抽象方法可以不重写。

  1. 什么是封装?

答:隐藏对象的属性和实现细节,仅对外提供访问接口。

  1. HashMap在多线程情况下可能会形成环形链表。
  2. AOP里面的名词。

答:Aspect(切面):通知和切入点的结合。在SpringAOP中,切面通过带有@Aspect注解的类实现。

Joinpoint(连接点):目标对象中,所有可以增强的方法

Pointcut(切入点):目标对象中,已经增强的方法。

Advice(通知/增强):增强的代码

Target(目标对象):被代理对象

Weaving(织入):将通知应用到切入点的过程

Proxy(代理):将通知织入目标对象之后,形成代理对象

  1. 谈谈你对AOP的理解。

答:AOP,面向切面编程,是对OOP(面向对象编程)的补充和完善。简单来讲就是将纵向重复的代码,横向抽取出来。

很明显的一个体现就是在Filter过滤器中。在没有Filter之前,解决servlet的乱码问题是很复杂的,每次在接收请求之前,都要写句代码来解决乱码问题,即:request.setCharacterEncoding(“UTF-8”),只要写一个servlet,就是写这句代码来解决乱码问题。直到有一天,Filter出现了。我们把解决乱码的那句代码放到Filter中去,从此在servlet中,就再也不用重复写那句代码了。从架构上来说,Filter解决乱码的事架在了所有的servlet上,这样一来,切面就形成了。

面向切面编程的思想,还有一个直接的体现就是在拦截器中。(后面待补充)

8.Spring中的AOP思想靠什么来体现的呢?

答:Spring中的AOP思想体现在能够为容器中管理的对象生成动态代理对象。

以前我们要使用动态代理,我们需要自己调用下面的方法:

Proxy.newProxyInstance(xx,xx,xx);

生成代理对象。

Spring能帮助我们生成代理对象。

9.为什么叫springAOP呢?

答:Spring可以为所有service层的类生成动态代理对象,告诉spring,为每一个service层的类里面的方法添加管理事务的代码,spring一听,是!这样我们叫可以只写一遍管理事务的代码,就为所有的service就都加上了管理事务的代码。这样一来,aop思想就体现出来了。

SpringAOP的本质就是帮我们生成动态代理对象。

10.Spring实现AOP的原理?

答:JDK动态代理和cglib代理。

JDK动态代理有缺陷,就是被代理对象必须实现接口才能产生代理对象,如果没有接口,就不能使用动态代理技术。我们用spring容器来实现动态代理,假如要管理的对象没有实现接口,那么就不能产生代理对象了。为了让所有的对象都能产生动态代理对象,Spring又融入了第三方代理技术cglib代理。Cglib可以对任何类生成代理对象,它的原理是对目标对象进行继承代理,如果目标对象被final修饰,那么该类无法被cglib代理。

11.那么Spring到底使用的是JDK代理,还是cglib代理呢?

答:混合使用。如果被代理对象实现了接口,就优先使用JDK代理,如果没有实现接口,就用用cglib代理。

12.ofo面试题:aop机制,实现,具体怎样使用,具体到标签?

答: AOP,面向切面编程,是对OOP(面向对象编程)的补充和完善,简单来讲就是将纵向重复的代码,横向抽取出来。最明显的体现就是过滤器和拦截器的使用。

   Spring实现AOP的本质是动态代理,Spring采用两种动态代理的方式,分别是JDK动态代理和cglib动态代理。JDK动态代理的被代理对象必须实现接口,而cglib动态代理的被代理对象原则上可以是任何类,cglib实现动态代理的原理是对被代理对象进行继承,重写被代理对象中所有的方法,所以被代理对象不能被final修饰。

   Spring操作AOP,具体可分为4步。1.导包;2,准备目标对象;3.准备通知;4,将通知织入目标对象。其中2(准备目标对象)和3(准备通知)由java代码实现,4(将通知织入目标对象)有两种实现方式,一种是xml配置,一种是注解配置。其中,xml配置用的标签有<aop:config>、<aop:pointcut>、<aop:aspect>、<aop:before>、<aop:after-returning>、<aop:around>、<aop:after-throwing>、<aop:after>。注解配置用到的注解有:@Aspect、@Pointcut、@Before、@AfterReturning、@Around、@AfterThrowing、@After。

依赖注入问题

  1. 依赖注入的三种方式?

答:set方法注入、构造方法注入、属性注入。

构造方法注入:先实例化对象依赖的对象,再实例化这个对象。

优点:(1)构造方法注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。(2)因为没有setter方法,所有的依赖关系全部在构造器中设定,因此,无须担心后续的代码对依赖关系产生破坏。

缺点:当依赖对象过多时,采用构造方法注入会使构造函数过于臃肿。

Set方法注入:先实例化对象,再实例化对象依赖的对象。

优点:(1)与传统的JavaBean写法相似,程序开发人员更加容易理解。(2)因为方法可以命名,所有setter方法注入在描述性上比构造方法注入更好一些

缺点:对象无法在构造完成之后马上进入就绪状态。

属性注入:在属性上加@Autowired注解。官方不推荐使用,但我在项目中经常使用,方便、简单。

  1. 构造函数注入能不能和set方法注入一块使用?

答:不能。为什么?这里尚不清楚!

  1. 事务4大特性:ACID。
  2. 事务并发问题。
  1. 脏读:如果一个事务A正在更新数据,另一个事务B尝试读取同一个数据,B在更新期间读取了数据,但是事务A可能最后回滚了事务,导致事务B读取的数据不准确,视为脏读。
  2. 不可重复读:如一个事务在操作期间两次读取同一批数据,结果发现不一样,说明另一个事务在此期间更新了数据,视为不可重复读。
  3. 幻读:如一个事务操作期间两次读取同一个表的数据,结果发现第二次读取的数据多了几条,说明在此期间有其他事务插入数据到该表,跟幻觉一样,视为幻读。
  1. 事务的隔离级别。

答:读未提交:设置值为1,说明当一个事务修改数据的时候,另一个事务可以读取数据,这样会导致脏读、不可重复读、幻读等并发问题,所以是最不安全的隔离级别,不太常用。

读已提交:设置值为2,说明当一个事务修改数据的时候,另一个事务必须等待修改完成,才能读取数据,这样可以防止脏读,但是不可重复读和幻读问题还会发生。

可重复读:设置值为4,比读已提交安全一些,因为限制一个事务修改数据时,另一个事务不能读取该数据,同时,限制一个事务读取数据时,其它事务不能修改该数据,从而防止脏读和不可重复读问题的发生,但是还是会发生幻读问题。

串行化:设置值为8,最安全的隔离级别,能同时预防脏读、不可重复读、幻读等问题。

  1. 对象都在堆里吗?

答:不是。类的字节码对象存放的位置就不确定,可能在方法区。

  1. 有哪些垃圾回收算法?

答:标记-清除算法、复制回收算法、标记-整理算法、分代回收算法。

  1. 怎么判断一个对象是否可以被回收?

答:可达性分析算法。

  1. 什么对象可以作为根节点?

答:虚拟机栈中引用的对象;

方法区中静态属性引用的对象;

方法区中常量引用的对象;

本地方法栈中JNI(即一般说的Native方法)引用的对象;

  1. try{}里面有一个return语句,那么紧跟在这个try后的finally{}中的代码是否会被执行?如果会的话,什么时候被执行,在return之前还是return之后?

答:会。会在return之前执行。

  1. 出现在Java程序中的finally块是不是一定会被执行?

答:不一定会被执行。(1)当程序在进入try语句块之前就出现异常时,会直接结束,不会执行finally块中的代码。(2)当程序在try块中强制退出时也不会去执行finally块中的代码。

  1. 数据结构与算法
  2. 编程题

 

猜你喜欢

转载自blog.csdn.net/lz1170063911/article/details/81364865