简答题汇总
1、 String、StringBuffer、StringBuilder三者有什么区别?
String
字符串常量
StringBuilder
字符串变量(非线程安全)
StringBuffer
字符串变量(线程安全)
(1).在这方面运行速度快慢为:StringBuilder > StringBuffer > String String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
(2).在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
2.
int 和 Integer 有什么区别?
(1)Integer是int的包装类;int是基本数据类型;
(2)Integer变量必须实例化后才能使用;int变量不需要;
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
(4)Integer的默认值是null;int的默认值是0。
对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
3.URL和URI有什么区别,可举例说明?
(URL)统一资源定位符用于标示网络资源的位置 URI,统一资源标识符用于标示一个抽象或者物理资源 URI是以一种抽象的,高层次概念定义统一资源标识,而URL则是具体的资源标识的方式。URL是一种URI。一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的,schema(protocol)必须被指定。
举例:
统一资源定位器(URL)指的是Internet文件在网上的地址。
4.判断字符串值是否相同时是用==还是equals()?他们有何差别?
String既可以作为一个对象来使用,又可以作为一个基本类型来使用。
一种是用"=="来比较,这种比较是针对两个String类型的变量的引用,也就是说如果两个String类型的变量,它们所引用同一个String对象(即指向同一块内存堆),则"=="比较的结果是true。
另一种是用Object对象的equals()方法来比较,String对象继承自Object,并且对equals()方法进行了重写。两个String对象通过equals()方法来进行比较时,其实就是对String对象所封装的字符串内容进行比较,也就是说如果两个String对象所封装的字符串内容相同(包括大小写相同),则equals()方法将返回true。
5.Java面向对象的三大特性是什么 ? 简述其特点 ?
封装思想
使用 private
修饰符把成员变量设置为私有,防止外部程序直接随意调用或修改成员变量,然后对外提供 public
的 set
和 get
方法按照开发者的意愿(可以编写一些业务逻辑代码,虽然很少这样做)设置和获取成员变量的值。
也可以把只在本类内部使用的方法使用 private
,这就是封装的思想,是面向对象最基本的开发规范之一。
public 修饰符,具有最大的访问权限,可以访问任何一个在 CLASSPATH 下的类、接口、异常等。
protected 修饰符,主要作用就是用来保护子类,子类可以访问这些成员变量和方法,其余类不可以。
default 修饰符,主要是本包的类可以访问。
private 修饰符,访问权限仅限于本类内部,在实际开发过程中,大多数的成员变量和方法都是使用 private 修饰的。
继承
多态
多态指允许不同类的对象对同一“消息”做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。可以用于消除类型之间的耦合关系,Spring 的核心就是多态和面向接口编程。
6.访问springmvc框架环境下的javaweb页面显示405错误信息, 该如何解决?
首先添加一个自定义类,继承Spring的分发器类DispatcherServlet,然后重写processHandlerException方法,在web.xml中配置上述分发器:
7.Springmvc中如何定义转发和重定向?
(1)不需要传递参数
返回String
return "redirect:/ toList ";
使用ModelAndView
return new ModelAndView("redirect:/toList");
(2)带参数
attr.addAttribute("param", value);
return "redirect:/namespace/toController";
转发:
返回ModelAndView :
@RequestMapping(value="/test",method=RequestMethod.GET)
public ModelAndView testForward(ModelAndView model){
model.setViewName("forward:index.jsp");
return model;
}
返回String:
@RequestMapping(value="/forward",method=RequestMethod.GET)
public String testForward(){
return "forward:/index.action";
}
8.mybatis和hibernate
但是对于一个大型项目,复杂语句较多,这样再去选择hibernate就不是一个太好的选择,选择mybatis就会加快许多,而且语句的管理也比较方便。
针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
9.简述静态变量和实例变量有什么区别 ?
静态变量也叫类变量,这种变量前加了static修饰符。可以直接用类名调用,也可以用对象调用,而且所有对象的同一个类变量 都是共享同一块内存空间。 静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再去获取它的值,得到的是改变后的值;
实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象取值的结果,其他对象仍会得到实例变量一开始就被赋予的值。
10.接口可以有方法的实现吗 ? 怎么使用 ?
Java8新增了default关键字,可以使接口有自己的默认的实现类,而且还不影响接口的实现类。
11.事务的ACID指的是什么 ?
ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。
12.Servlet的生命周期是:
生命周期:分为三个阶段:
1,初始化阶段 调用init()方法
2,响应客户请求阶段 调用service()方法
3,终止阶段 调用destroy()方法
13.面向对象的五大原则:
1、 单一职责原则,指一个类的功能要单一,不能包罗万象;
2、 替换原则。指子类可以替换父类并出现在父类能出现的任何地方。
3、 开放封闭原则,一个模块在更改性方面应该是封闭的,在扩展性方面应该是开放的。
4、 依赖倒置原则:就是要依赖于抽象,不要依赖于具体。
5、 接口隔离原则:不同的模块要通过抽象接口隔离开,而不是通过具体的类强耦合。
14.如果Mybatis进行查询的时候实体类的属性名和数据库字段不一致怎么办?
添加关联映射,或者是修改sql语句
15.什么是向上转型? 什么是向下转型?
1、 向上转型:父类引用指向子类对象。
2、 通俗的说就是子类实例对象赋值给父类引用,然后父类引用又要赋值给子类引用,这个过程就是向下转型。
16.简述响应码200, 404, 500的含义?
200 OK 服务器成功处理了请求,404未找到资源
500内部服务器错误,服务器遇到一个错误,使其无法为请求提供服务
17.如何控制servlet在什么时候加载?
Servlet的加载和实例化是发生在容器启动的时候发生的。什么时候加载和实例化Servlet是由“1”配置来决定的。同意初始化发生在实例化Servlet之后。
18.让Session失效有几种方法, 请列举一下
在主页面或者公共页面中加入:session.setMaxInactiveInterval(900);,就是在项目的web.xml中设置
- <!-- 设置session失效,单位分 -->
- <session-config>
- <session-timeout>1</session-timeout>
- </session-config>
直接在应用服务器中设置,如果是tomcat,可以在tomcat目录下conf/web.xml中找到<session-config>元素,tomcat默认设置是30分钟,只要修改这个值就可以了。
19.简述jsp全称以及底层实现原理?
1. jsp运行在服务器
2.jsp的基础是Servlet(相当于对Servlet进行了一个包装而已)
2、 原理:Jsp页面也正是先翻译成Servlet,然后再编译加载进内存的。
20.javaweb开发中Model1模式和Model2模式的定义是什么?
1、 在Web早期的开发中,通常采用的都是Model1。Model1设计模式中,主要分为两层,视图层和模型层。
2、 Model2,也就是MVC模式,Model2设计模式,把一个Web软件项目分成三层,包括视图层、控制层、模型层。
21.WebLogic和Tomcat有什么区别?
Tomcat开源,免费,节省成本;再就是tomcat是轻量级程序,一般来说小企业只有基本的服务,用不到EJB等服务,选择tomcat就可以满足。
大企业,要求安全性较高,运用EJB等的企业,选择weblogic比较合适。
22.如何定义一个监听器和过滤器, 各自的作用是什么?
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可以进行逻辑判断,如用户是否已经登录、有没有权限访问该页面等等工作,它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关的请求,只有当你的web应用停止或重新部署的时候才能销毁。
void init(FilterConfig filterConfig) 用于完成过滤器的初始化
void destroy() 用于过滤器销毁前,完成某些资源的回收
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 实现过滤功能,该方法对每个请求增加额外的处理
Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
项目启动时,先启动监听器,再启动过滤器。
23. 什么是MVC, 这三个字母分别代表什么?
M:model (模型):javaBean、srping、hibernate、mybatis
V:view(视图) :jsp、html、freemaker
C:controller(控制器):servlet 、struts、springmvc
24. Hibernate中什么是临时态, 持久态, 游离态?
---瞬时态。他们在数据库中没有对应的记录存在
持久态。
缓存中的对象与数据库是同步的
游离态
数据库中有数据,缓存中没有数据
25.访问springmvc框架环境下的javaweb页面显示405错误信息, 该如何解决?
首先添加一个自定义类,继承Spring的分发器类DispatcherServlet,然后重写processHandlerException方法,然后在web.xml中配置上述分发器:
26.说一下什么是sql注入, 以及需要注意的地方有什么?
通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
27. Hibernate中get方法和load方法有什么区别 ?
load方法支持延迟加载, 当查询结果被使用的时候才会去数据库进行查询, get方法不支持延迟加载
load方法查询时如果数据库中没有查询到该结果, 则会抛出异常, get方法则会返回null
28.
PLSQL编程中循环有几种方式? 分别列举一下
三种方式
1,
LOOP
EXIT...WHEN...
END LOOP
2,
WHILE
LOOP
END LOOP
3,
FOR ... IN ...
LOOP
END LOOP
21, 以下代码的输出结果是 ? 为什么 ?
public class Test {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 150;
Integer i4 = 150;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
String s1 = “aaa”;
String s2 = “aaa”;
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
答:
true
false
true
true
i1和i2两个变量被定义成Integer引用类型, 当被赋值时根据赋值的大小(是否在byte类型的范围内)先判断是否在Integer类型的缓存中, 如果有, 则直接引用, 如果没有则返回new Integer(...), 所以第二个结果为false
==对比的是在内存中引用地址是否相同, equals对比的是值是否相同
String类在内存中有一个常量池, 当第一个变量被定义时会储存到常量池中, 第二个String类型定义时会去常量池里面查找是否已经定义此值, 如果有, 直接引用
22, 抽象类和接口有什么相同点和不同点 ? 以及分别用什么关键字定义 ?
答:
分别用abstract和interface关键字定义
抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
抽象类要被子类继承,接口要被类实现。
接口只能做方法声明,抽象类中可以做方法声明,也可以做方法实现
接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
抽象方法只能声明,不能实现,接口是设计的结果 ,抽象类是重构的结果
抽象类里可以没有抽象方法
如果一个类里有抽象方法,那么这个类只能是抽象类
抽象方法要被实现,所以不能是静态的,也不能是私有的。
接口可继承接口,并可多继承接口,但类只能单个继承。
23, 什么是DAO层 ?
答:
dao全称是data access object,数据库访问对象
DAO模式通过将数据访问计划分为抽象层(或者interface)和实现层,从而分离了数据使用和数据访问的地称实现细节。这意味着业务层与数据访问的底层细节无关,也就是说,可以在保持上层机构不变得情况下,通过切换底层实现来修改数据访问的具体机制,常见的一个例子就是,我们可以通过仅仅替换数据访问层实现,将我们的系统部署在不同的数据库平台之上。
24, 如何通过反射获得一个类的实例化对象, 以及获取这个对象中的属性和属性值 ?
答:
获取一个类的实例化对象
Class<?> cla = Class.forName("com.hanqi.maya.model.User");
Object obj = cla.newInstance(); // 此对象为获取的User对象
获取属性值
Field field = cla.getField("属性名");
fieldValue=field.get(obj);
25, 在oracle数据库scott用户下的员工表中, 查询出员工姓名中字母”R”出现两次或者两次以上的员工
SELECT * FROM EMP E WHERE LENGTH(REPLACE(E.ENAME, 'R', '')) - LENGTH(E.ENAME) >= 2
或者使用translate函数
Java中运算符>>, <<, >>>分别是什么意思?
位运算符
>>表示以二进制的形式向右移动, <<表示向左移动, >>>表示无符号向右移动, 即无论正负都在前面补0
29, java环境下的命令行中java命令和javac命令分别是做什么用的 ?
因为java是一门解释型语言, javac用来编译java文件以生成字节码形式的class文件, java命令用来向虚拟机进行解释来执行编译好的class文件
30, 当调用equals方法来判断字符串是否相同时, 经常会写成"aaa".equals(str), 为什么 ?
防止str变量接收到的参数为null
如果写成str.equals("...")在编译过程不会报错, 但是如果str这个变量接收到的参数为null的话则会报出空指针异常, 但是将字符串常量写在外面就可以避免这个情况, 因为null在java中也被看作是一个对象的形式, 这时候会返回false
31, 什么是内部类 ? 为什么要有内部类 ?
在一个类的内部再定义一个class, 内部类是为了解决java不能进行多重继承的问题
32, 什么是二分查找法?以及使用二分查找法的前提是?
二分折半查找法, 每次取一个顺序序列的中间值与要查找的值进行比对, 然后判断是在前半段查找还是后半段查找, 确定好之后再取中间值进行比对继续查找, 所以前提条件是要查找的序列必须进行排序
33, 线程中start(), sleep(), stop(), setPriority()分别是什么方法 ? 如果让你设计一个终止线程的方法, 你会怎么做 ?
start: 启动线程
sleep: 使线程休眠
stop: 终止线程, 已废弃
setPriority: 设置线程的优先级
定义一个代表状态的变量, 通过判断此变量的值来判断是否该终止线程, 尽量避免调用interrupt()和stop(), 因为这两个方法可能引起系统资源不会被正常处理
34, 描述一下在线程中, 什么是死锁 ?
当两个线程启动时, 第一个线程需要获取第二个线程的一个属性, 第二个线程需要获取第一个线程的一个属性的时候, 互相等待对方线程释放此对象时会造成死锁, 造成死锁的情况的条件还有要使用synchronized关键字
35, Oracle中一个表最多可以有几个主键, 使用两个字段作为主键的情况称为什么情况, 怎么使用?
一个表只能有一个主键, 主键可以使用两个字段, 叫做联合主键, 当同时确定这两个字段就能确定一条数据的唯一性的时候生效
37, Javaweb中要实现10天内登录保存密码的功能怎么实现 ?
在登录处理页面使用Cookie, 将登录信息存储到Cookie中, 然后调用Cookie中方法setMaxAge(...)来设置cookie的过期时间, 值为毫秒数, 下次登录的时候先判断Cookie中有没有值, 如果返回不为null可以取出直接调用
38, 在jsp中如何使用EL表达式读取request对象中的一个Map对象的值 ?
${key值 }
39, Hibernate中get方法和load方法有什么区别 ?
load方法支持延迟加载, 当查询结果被使用的时候才会去数据库进行查询, get方法不支持延迟加载
load方法查询时如果数据库中没有查询到该结果, 则会抛出异常, get方法则会返回null
40, jsp中<%...%><%!...%><%=...%><%--...--%>分别是什么含义?
<%...%>: 定义java代码的语言脚本
<%!...%>: 声明变量等
<%=...%>: 将方法的返回值或某个变量直接显示
<%--...--%>: 脚本中的注释, 该注释不会在html页面中"查看页面源代码"中显示