1. Java基础常见面试题

1.1. Java支持的数据类型有哪些?什么是自动拆装箱?

1.2. 什么是值传递和引用传递?

1.3. Java中什么是构造方法?什么是构造方法重载?什么是复制构造方法?

1.4. 集合框架中的泛型有什么优点?

1.5. 实现一个线程有哪几种方式,各有什么优缺点,比较常用的是那种?

1.6. 事务的ACID是指什么?

1.7. 谈谈Java中的内存划分(分配)。

任何计算机程序,如果想要运行,都需要开辟一块内存空间。

计算机整体的内存都是由操作系统来进行管理的,所以Java程序运行需要向计算机操作系统申请一块内存。这块专属内存被划分为了五部分,这样一来每一小块内存能被更好的使用和分门别类来管理。

栈中执行每个方法的时候,方法中的局部变量都会存在这块内存中。jvm会创建一个栈帧来存储局部变量表,栈帧还存有:操作数栈,动态链接,方法出口等信息。

1.7.1. 堆(Heap)

堆是Java对象在内存中的存储区域,凡是用new出来的东西都在这里面。Java中的对象和数组都被分配在堆中。

堆内存里面的数据,都有默认值。规则:

数据类型 默认值
整形 0
浮点型 0.0
字符型 'u000'
布尔型 false
引用类型 null

1.7.2. 方法区(Method Area)

它用于存储已被虚拟机加载的类信息,常量,静态变量,方法的信息,即时编译器编译后的代码等数据。

注意:仅仅是包含了类的相关信息。

1.7.3. 本地方法栈(Native Method Stack)

与虚拟机栈发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的本地方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

很多的算法或者一个功能的实现,都被java封装到了本地方法中,程序直接通过调用本地的方法就行了,本地方法栈就是用来存放这种方法的,实现该功能的代码可能是C也可能是C++,反正不一定就是java实现的。

1.7.4. Program Count Register(PC寄存器,程序计数器)

指示Java虚拟机下一条需要执行的字节码指令。

程序计数器是一块较小的内存区域,作用可以看做是当前线程执行的字节码的位置指示器。分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖这个计算器来完成。


以上五个区域是Java虚拟机内存划分情况,其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。 所以Java在通过new创建一个类对象实例的时候,一方面会在虚拟机栈中创建一个该对象的引用,另一方面会在堆上创建类对象的实例,然后将对象引用指向该对象的实例。对象引用存放在每一个方法对应的栈帧中。

1.8. 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。

1.9. 请求方式中get方式和post方式有何区别?

1.10. Spring MVC的流程?

1.11. Spring中AOP的原理、好处、场景?

1.12. Spring Bean的作用域之间有什么区别?

1.12.1. singleton

这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

1.12.2. prototype

原形范围与单例范围相反,为每一个bean请求提供一个实例。

1.12.3. request

在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

1.12.4. session

与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

1.12.5. GlobalSession

global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。 global-session(全局作用域)与Servlet中的session作用域效果相同。

1.13. Spring中自动装配的方式有哪些?

1.13.1. 什么是Spring内部的bean?

当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring的基于XML的 配置元数据中,可以在或元素内使用元素,内部bean通常是匿名的,它们的Scope一般是prototype。

1.13.2. 什么是bean装配?

bean装配是指在Spring容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。

1.13.3. 什么是bean的自动装配?

Spring容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。

1.13.4. 不同方式的自动装配

no

这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。

<!-- no – 缺省情况下,自动配置是通过“ref”属性手动设定 -->
<bean id="person" class="org.spring.autowring.Person">
    <property name="ability" ref="ability"></property>
</bean>
<bean id="ability" class="org.spring.autowring.Ability">
    <property name="skill" value="Java Programming"></property>
</bean>

byName

根据Bean的名字进行自动装配。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。

<!-- Auto-Wiring "byName" 按属性名称自动装配 -->
<bean id="person" class="org.spring.autowring.Person" autowire="byName"/> 
<bean id="ability" class="org.spring.autowring.Ability"> 
    <property name="skill" value="Java Programming"></property> 
</bean>

byType

根据Bean的类型进行自动装配。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。

<!-- Auto-Wiring "byType" 按属性名称自动装配 -->
<bean id="person" class="org.spring.autowring.Person" autowire="byType"/>
<bean id="ability" class="org.spring.autowring.Ability">
    <property name="skill" value="Java Programming"></property>
</bean>

constructor

类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误;

<!-- constructor – 在构造函数参数的byType方式。 -->
<!-- 构造方法的参数 -->
<bean id="person" class="org.spring.autowring.Person">
    <constructor-arg>
        <ref bean="ability"></ref>
    </constructor-arg>
</bean>
<bean id="ability" class="org.spring.autowring.Ability">
    <property name="skill" value="Java Programming"></property>
</bean>

autodetect

该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。

<bean id="HelloWorld" class="com.example.demo.test.HelloWorld" autowire="autodetect">
    <property name="msg">
        <value>HelloWorld</value>
    </property>
</bean>
<bean id="date" class="java.util.Date"></bean>

1.13.5. 自动装配有哪些局限性?

  • 重写

    • 你仍需用 < constructor-arg > 和 < property > 配置来定义依赖,意味着总要重写自动装配。
  • 基本数据类型

    • 你不能自动装配简单的属性,如基本数据类型,String字符串和类。
  • 模糊特性

    • 自动装配不如显式装配精确,如果有可能,建议使用显式装配。

1.14. 最佳实践中,通常一个xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

1.15. Mybatis是如何进行分页的?分页插件的原理是什么?

1.16. Mybatis是否支持延迟加载?如果支持,它实现的原理是什么?

1.17. MySQL数据库中drop、delete、truncate的区别?

Copyright © 神都花已开 2021 all right reserved,powered by Gitbook修订时间: 2021-11-01 15:05:12

results matching ""

    No results matching ""