2018初级JAVA面试提问总结

1.什么是事务。
事务是一组原子性的sql查询,在事务内的语句,要么全部执行,要么全部不执行。
事务的ACID性质:
(1)原子性:最小的不可分割的业务单元(Atomic) 
(2)一致性:都执行或者都不执行,保持同一个状态(Consistent) 
(3)隔离性:多个事务并发,相互不影响,如果不隔离则会导致数据的脏读、不可重复读和幻读 (Isolated)
(4)持久性:commit之后,数据保存在数据库中 (Durable) 
2.MySQL事务有哪些操作。
(1)使用事务的要求
        --在mysql众多的引擎中,innodb和NDB Cluster支持事务。
        --mysql默认自动提交事务,想手动提交,需要把默认提交关闭。
(2)关闭默认提交
        show variables like 'autocommit';  ----------查看自动提交是否开启
        set autocommit=0;  ------------关闭自动提交,0是关闭,1是开启
        start transaction;  -------------开启事务
(3)业务逻辑
        commit;  -------------中间的代码都执行
        rollback;  --------------中间的代码都不执行
3.什么情况下需要进行事务处理,什么时候需要事务回滚 。
(1)只要是对数据库进行增、删、改操作,而且需要保证数据的一致性、完整性的时候就需要对sql语句进行事务处理,每一个对数据库的增删改操作都是一个事务操作(原子操作)。
(2)当对数据库操作失败报错,需要撤销已进行的数据改变时,就需要进行事务回滚
4.关联表有几种方法。
三种:
(1)等值连接/内连接:
        三种书写形式:
        a. select * from A,B where A.某字段=B.某字段;
        b. select * from A join B on A.某字段=B.某字段;
        c. select * from A [ inner ] join B on A.某字段=B.某字段;(完整版)
(2)左外连接:
        以 join 左侧表作为基准表(驱动表--所有数据都会被显示出来,不管是否符合连接条件),那么当该表中的某条记录不满足连接条件时,来自右表的字段全部为null。
        select e.ename,d.dname from dept d left join emp e on d.deptno=e.deptno;
(3)右外连接
        以 join 右侧表作为基准表(驱动表--所有数据都会被显示出来,不管是否符合连接条件),那么当该表中某条记录不满足连接条件时,来自左表的字段全部为null。
        select e.ename,d.dname from dept d right join emp e on d.deptno=e.deptno;
5.如何在创建表之前判断表是否存在。
DROP TABLE IF EXISTS 表名;
6.什么是Servlet。
Servlet是sun公司制定的一种用来扩展web服务器功能的组件规范
7.什么是jsp,是先有jsp还是先有Servlet。
(1)jsp是sun公司制定的一种服务器端动态页面技术规范
(2)先有的Servlet,虽然直接使用Servlet就可以生成动态页面,但是过于繁琐(需要使用out.println()方法输出静态页面),也不利于后期页面的维护(需要修改java代码),所以,sun公司才制定了jsp技术规范。
8.Mybatis是如何将查询到的数据返回到实体类中的。
(1)实体类中的属性名和数据库中表的字段名一致的时候,Mybatis会直接将查询到的字段值赋值到实体类的属性当中。
(2)属性名和字段名不一致的时候
        a. 在sql语句中给字段名设置别名,使别名和实体类中的属性名相同。
        b. 在Mybatis的mapper文件中创建resultMap,只需要将和字段名不一致的属性名和字段名重新关联起来即可。
9.关于反射机制你了解多少。
(1)反射是Java的动态机制,用于在运行期间检查对象的类型,检查对象的类结构(属性,方法等),还可以动态加载类,动态创建对象,动态访问属性和方法,等。(反射是Java的 API )
(2)反射的功能:a. 动态加载类    b. 动态创建对象(前提是类中必须存在无参构造器)    c. 动态调用对象方法和属性
        (静态调用是指一般的程序在编译后就已经确定了执行顺序,执行期间按照编译时确定的执行顺序执行,而动态调用则是指程序在编译之后,仍可以动态地改变程序的执行过程)
(3)必须使用反射实现的案例:执行一个类中的全部以test为开头的方法,这些方法全部都是非静态方法,方法中没有返回值,没有参数。
        实现过程:动态输入一个类名-->动态加载类型-->动态创建对象-->利用反射查找全部方法信息-->遍历找到以test为开头的方法-->动态调用执行对象的方法。
(4)使用反射机制最大的好处就是可以最大程度地对程序进行解耦,大大降低耦合度,为代码的编写和后期的维护提供了很大的遍历。
(5)基本代码:
            1.动态加载类的两种方式:
            //(1)利用反射API,动态检查obj引用的对象类型,创建类
            Object o1=new Test2();
            Class<?> cls=o1.getClass();
            //(2)利用反射API,检查类名,动态创建类
            String className="test.Test2";
            cls=Class.forName(className);
            2.动态创建对象(前提:类中必须存在无参构造器)
            Object obj=cls.newInstance();
            3.动态调用对象的方法
            //加载对象的方法的四种方式:
            //(1)getDeclaredMethod(方法名,参数类型1,参数类型2...)
            Method method=cls.getDeclaredMethod("test2", int.class);
            //(2)getDeclaredMethods(),获取类中所有的方法,与修饰符无关
            Method[] methods=cls.getDeclaredMethods();
            //(3)getMethod(方法名,参数类型1,参数类型2...),不常用
            method=cls.getMethod("test2", int.class);
            //(4)getMethods(),获取该类和父类中所有的public修饰的方法,不常用
            methods=cls.getMethods();
            //反射API可以打破封装特性(不受访问控制修饰符约束),实现访问不可见的方法和属性 
            //修改方法的访问权限为可访问
            method.setAccessible(true);
            //动态调用方法,准备参数
            method.invoke(obj, 1);
            4.动态访问和修改对象的属性
            //加载对象的属性的四种方法:
            //(1)getDeclaredField(属性名),根据属性名获取该类中的属性
            Field field=cls.getDeclaredField("param");
            //(2)getDeclaredFields(),获取该类中所有的属性,不受访问控制修饰符限制
            Field[] fields=cls.getDeclaredFields();
            //(3)getField(属性名),根据属性名获取该类及其父类中的某个public修饰的属性
            field=cls.getField("param");
            //(4)getFields(),获取该类及其父类中所有public修饰的属性
            fields=cls.getFields();
            //反射API可以打破封装特性(不受访问控制修饰符约束),实现访问不可见的方法和属性 
            //修改属性的访问权限为可访问
            field.setAccessible(true);
            //获取属性值
            Object param=field.get(obj);
            //修改属性值
            field.set(obj, 3);
10.如何进行css基本样式的设置。
(1)内联样式:将样式设定在HTML元素的属性style里面。
        例:<h1 style="color : blue; ">Hello</h1>
(2)内部样式:将样式定义在HTML文档头部的<style>标签内。
        例:<style type="text/css">
                    h2{ color:red; }
                </style>
(3)外部样式:将样式定义在单独的一个".css"文件里。
        a. 在HTML文档头部引用该css文。
        例:<link rel="stylesheet" type="test/css" href="../css/c1.css"/>
        b. 书写".css"文件。
        例:p{
                       background-color:silver;
                }
(4)注意:border和outline的区别:border 可应用于几乎所有有形的html元素,而 outline 是针对链接、表单控件和ImageMap等元素设计。从而另一个区别也可以推理出,那就是: outline 的效果将随元素的 focus 而自动出现,相应的由 blur 而自动消失。这些都是浏览器的默认行为,无需JavaScript配合CSS来控制。
11.ajax如何进行同步地操作。
(1)如果是js原生代码进行ajax交互的话,获得XMLHttpRequest对象或ActiveXObject对象(ie)后,只需要在" 对象.open() "方法中设置第三个参数为false即可,例:xhr.open ( 'get', 'test.do', false); //ajax 同步访问
(2)如果是通过$.ajax({})方式进行,需要在ajax的参数列表中,添加参数async : "false" 即可。
(3)如果是通过$.post()方式进行,需要
                  --在$.post()前把ajax设置为同步:$.ajaxSettings.async = false;
                  --在$.post()后把ajax改回为异步:$.ajaxSettings.async = true;
(4)如果是通过$.get()方式进行,同(3)类似
(5)如果是通过$.getJSON()方法进行,同(3)类似
12.ajax能否直接进行页面的访问。
可以。
13.ajax能否进行跨域访问。
ajax本身不能进行跨域的访问,如果需要跨域访问需要其他工具的支持,比如HTML5的XHR2,或jsonp。
14.两个表,一个表里面有部门编号,部门名称,另一个表里面有人员信息和部门编号,想要查找出部门编号,部门名称,部门人员数,请写出一条sql语句解决。
select d.deptno,d.deptname,count(*)
from dept d left join emp e on d.deptno=e.deptno
group by d.deptno;
15.什么是盒子模型。
盒子模型:外边距+边框+内边距+内容区域
16.jsp的默认隐含变量有哪些。
request、response、session、application、pageContext、page、exception、out、config
17.oracle的四个scn是什么。(判断你是否熟悉oracle的标准)
(1)系统检查点scn
当一个检查点动作完成后,Oracle就把系统检查点的SCN存储到控制文件中。
select checkpoint_change# from v$database;
(2)数据文件检查点scn
当一个检查点动作完成后,Oracle就把每个数据文件的scn单独存放在控制文件中。
select name,checkpoint_change# from v$datafile;
(3)启动scn
Oracle把这个检查点的scn存储在每个数据文件的文件头中,这个值称为启动scn,因为它用于在数据库实例启动时,
检查是否需要执行数据库恢复。
select name,checkpoint_change# from v$datafile_header
(4)终止scn
每个数据文件的终止scn都存储在控制文件中。
select name,last_change# from v$datafile
终止SCN:
       如果你上次关闭数据库是abort 方式关闭的:当你启动到mount 的时候,会发现 终止SCN 为 空。这是因为因为abort 后,系统非正常关闭。redo里还有赃块没有写入磁盘。只有干净地关闭数据库后,所有的脏块写入磁盘后,结束scn才有一个值。这时候在Oracle在启动地过程中会进行实例恢复:1.定位到最早的 active状态的redo日志文件(scn号和系统scn相等的那个)进行前滚恢复。这时候数据库open后,终止scn会被置为空。
        如果你是正常关闭的,那么进入mount 后 ,会看到 上次终止scn的状态,同时open后 终止scn会清空。
18.什么是aop。
        AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需 要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。
        它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为 “Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低 模块间的耦合度,并有利于未来的可操作性和可维护性。
        使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横 切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”
        实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的 方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。然而殊途同归,实现AOP的技术特性却是相同的,
参考文章:https://www.cnblogs.com/jingzhishen/p/4980551.html
19.什么是动态代理。
        代理类在程序运行时创建的代理方式被成为 动态代理。 也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数。
参考文章:https://blog.csdn.net/andyzhaojianhui/article/details/72833114
20.springMVC原理。
springMVC五大组件:
        --DispatcherServlet 前端控制器(在web.xml文件中配置)、
        --HandlerMapper 映射处理器(在web.xml文件中配置)、
        --Controller 处理器(自己创建类)、
        --ModelAndView 处理结果和视图名(写在spring配置文件中)、
        --ViewResolver 视图解析器(写在spring配置文件中)

(1)浏览器将请求发送给DispatcherServlet(前端控制器)来处理,
(2)DispatcherServlet会依据HandlerMapping的配置
(3)调用对应的Controller来处理请求。
(4)Controller将处理结果封装成ModelAndView对象,然后返回给DispatcherServlet。
(5)DispatcherServlet会依据ViewResolver的解析
(6)调用对应的视图对象(比如jsp)来生成相应的页面。
        (注:视图部分可以使用jsp,也可以使用其它的视图技术,比如freemarker,velocity等等。

21.spring框架原理。
(1)spring核心组件有三个:Spring Core、Spring Context、Spring Beans。
(2)我们知道 Bean 包装的是 Object,而 Object 必然有数据,如何给这些数据提供生存环境就是 Context 要解决的问题,对 Context 来说他就是要发现每个 Bean 之间的关系,为它们建立这种关系并且要维护好这种关系。所以 Context 就是一个 Bean 关系的集合,这个关系集合又叫 Ioc 容器,一旦建立起这个 Ioc 容器后 Spring 就可以为你工作了。那 Core 组件又有什么用武之地呢?其实 Core 就是发现、建立和维护每个 Bean 之间的关系所需要的一些列的工具,从这个角度看来,Core 这个组件叫 Util 更能让你理解。
(3)IOC(控制反转)--目标,DI(依赖注入)--手段
参考文章1:https://blog.csdn.net/kleguan/article/details/73440777
参考文章2:https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/
22.jdk1.8相对1.7来说有什么新特性。
(1)接口的默认方法,允许给接口添加一个非抽象的方法,只需要使用default关键字即可,这个特征又叫扩展方法。
(2)Lambda 表达式,用于简写匿名内部类
(3)函数式接口
(4)方法与构造函数引用
(5)Lambda 作用域
(6)访问局部变量
(7)访问对象字段与静态变量
(8)访问接口的默认方法,
(9)Date API,Java 8 在包java.time下包含了一组全新的时间日期API。新的日期API和开源的Joda-Time库差不多,但又不完全一样。
(10)Annotation 注解,允许同一类型的注解使用多次,只需要给该注解标注一下@Repeatable即可。
23.为什么要进行拆箱装箱。
为了方便基本类型和引用类型进行交互。
24.集合当中哪些是线程安全的。
(1)vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
(2)statck:堆栈类,先进后出
(3)hashtable:就比hashmap多了个线程安全
(4)enumeration:枚举,相当于迭代器
除了这些之外,其他的都是非线程安全的类和接口。
线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低。
其他:
        a. hashtable跟hashmap的区别
        hashtable是线程安全的,即hashtable的方法都提供了同步机制;hashmap不是线程安全的,即不提供同步机制 ;hashtable不允许插入空值,hashmap允许!
        b. 多线程并发修改一 个集合怎么办
        用老的Vector/Hashtable类
25.为什么要对基本类型进行自动拆装箱。
(1)在Java 5中,可以直接将整型赋给Integer对象,由编译器来完成从int型到Integer类型的转换,这就叫自动装箱。
(2)自动装箱与自动拆箱为程序员提供了很大的方便,而在实际的应用中,自动装箱与拆箱也是使用最广泛的特性之一。自动装箱和自动拆箱其实是Java编译器提供的一颗语法糖(语法糖是指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通过可提高开发效率,增加代码可读性,增加代码的安全性)。
26."hello"=="hello"的结果为true还是false,为什么?
(1)结果为true。
(2)"=="是判断两边引用类型的存储地址是否相同,当通过直接加双引号的方式创建String对象时,字符串都会存放在String常量池中,如果常量池中没有,就在常量池中创建一个对象”hello”,第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。
27.==和equals()的区别是什么。
(1)"=="判断基本类型的时候是值判断,判断引用类型的时候是判断两边的引用地址是否相同。
(2)"equals()"是Object类中声明的方法,默认底层是封装的"=="进行判断,用于在对象中进行重写来通过判断两个对象的内容是否相同进而判断两对象是否相同;在String类中,底层默认重写了equals()方法来通过判断两个字符串内容是否相同进而判断两字符串是否相同。
28.同一客户的两次会话的sessionId是否相同?
(1)如果是同一浏览器的多个页面间的访问,sessionId不会变,因为是同一次session会话,session并没有失效,不会重新创建session。
(2)如果是关闭浏览器后再次访问页面,即session失效后再次创建一个session,sessionId会改变,因为是两次会话,sessionId是唯一的,每次创建session的时候都会重新给定一个新的、唯一的sessionId。
29.mybatis底层是如何返回执行结果的。
因为mybatis底层是封装的jdbc,所以直接将PreparedStatement的执行结果返回即可。
30.eclipse上想要查找一个类名的快捷键是什么。
Ctrl+Shift+R,直接根据文件名查询所有的文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值