java面试问题总结
- ArrayList和LinkedList的区别;
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- .对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
ArrayList实现了随机访问的接口,LinkedList实现了Quene的接口。
ArrayList是基于数据实现的list,而LinkedList是基于链表实现的list。所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性。
优缺点 ArrayList
优点:适合随机读取的时候,读取速度快,可以一步get(index)。
缺点:添加值很慢——一方面,添加数据在array中间的时候,需要移动后面的数;另一方面,当长度大于初始长度的时候,每添加一个数,都会需要扩容。
LinkedList:双向链表
优点:添加值很快——添加在list中间也只需要更改指针;长度不固定。
实现栈和队列方面,LinkedList要优于ArrayList。
其它
LinkedList的remove(int)和remove(Object)的方法的时间复杂度都是O(n),不是O(1).因为会有一个查找的过程。LinkedList的remove(int)要优于remove(Object),因为remove(int)在查找的时候,会从链表的中间查找,如果int比中间小,找前半部分,否则找后半部分(类似二分查找)。
ArrayList的增删比LinkedList的开销更大,因为除了有查找的时间复杂度外,还有增删的移动过程。
2.sql语句中exist和in的区别
in()适合B表比A表数据小的情况 exists()适合B表比A表数据大的情况exists()适合B表比A表数据大的情况
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.
3.sql 常用函数
1:聚合函数:
MAX: 返回指定数据的最大值。MIN:返回指定数据的最小值。
COUNT: 返回指定组中项目的数量。
AVG:返回指定组中的平均值,空值被忽略。SUM: 返回指定数据的和,只能用于数字列,空值被忽略。
2:数学函数:
ceiling: 取上限
floor: 取下限qound: 四舍五入
abs : 取绝对值
pi: 圆周率SQRT: 开根号
SQUARE: 平方根3:字符串函数:
UPPER:将字符串中的小写字母转换为大写字母
LOWER:将字符串中的大写字母转换为小写字母LTRIM: 去除字符串左边的空格
RTRIM: 去除字符串右边的空格REPLACE: 制定原始字符串a,原是字符串中的局部字符串b,新字符串c,用c替换掉包括在a中的b
select replace ('abcdefg','cd','xxx')--abxxxefg
SUBSTRING:截取字符串- 索引从1开始,并包含起始索引所在在字符
LEFT: 返回表达式最左侧指定数目的字符
RIGHT :返回表达式右侧指定数目的字符
LEN: 获取字符串长度4:转换函数:
CONVERT(a,b) CAST(a as b)两个表达式的数据类型完全相同。 两个表达式可以隐式转换。 需要隐式转换数据类型。
5:时间日期函数:
GETDATE: 获取当前日期
YEAR: 年份
MONTH: 月份
DAY: 天ISDATE:判断时间日期
DATEADD(a,b,c)L: 添加日期
DATENAME(a,b): 判断星期几
4.抽象类和接口
相同点
1 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
不同点
1 接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。2 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。
3 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
4 接口里不能包含初始化块,但抽象类里完全可以包含初始化块。
5 一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。
5.拦截器、过滤器、监听器的配置与说明,顺序。
1)过滤器:
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。
2)拦截器:
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
3)监听器:
web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,实现了javax.servlet.ServletContextListener
接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:感知到包括request(请求域),session(会话域)和applicaiton(应用程序)的初始化和属性的变化;配置位置: 监听器、过滤器一般配置在web.xml中,拦截器一般配置在springmvc.xml配置文件中
顺序:监听器 > 过滤器 > 拦截器
6.java activiti的理解
7.spring的事务机制,配置,和实现流程。
事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。
开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管 理,可以通过Spring的注入来完成此功能。spring提供了几个关于事务处理的类:
TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类
AbstractPlatformTransactionManager,我们使用的事务管理类例如
DataSourceTransactionManager等都是这个类的子类。一般事务定义步骤:
TransactionDefinition td =newTransactionDefinition();
> TransactionStatus ts = transactionManager.getTransaction(td); try{
> //do sth
> transactionManager.commit(ts); }catch(Exception e){
> transactionManager.rollback(ts); }
spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。
编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.
void add(){
> transactionTemplate.execute(newTransactionCallback(){
> pulic Object doInTransaction(TransactionStatus ts){
> //do sth
> }
> } }
声明式:
使用TransactionProxyFactoryBean:PROPAGATION_REQUIRED
PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly围绕Poxy的动态代理 能够自动的提交和回滚事务
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与
PROPAGATION_REQUIRED类似的操作。
8.string常用的工具类。
isEmpty(String str) :是否为空,空格字符为false
isNotEmpty(String str):是否为非空,空格字符为true
isBlank(String str) 是否为空,空格字符为true
isNotBlank(String str) 是否为非空,空格字符为false
trim(String str)去除字符串两端的控制符,空字符串、null 返回 null
trimToEmpty(String str) 去除字符串两端的控制符,空字符串、null 返回""
stripToNull(String str) 去除字符串两端的空白符,空字符串、null 返回null >stripToEmpty(String str) 去除字符串两端的空白符,空字符串、null 返回""
strip(String str, String stripChars) 去掉str两端的在stripChars中的字符
StringUtils.strip(“000000134_76539000”,“0”)=“134_76539”
stripStart (String str,String stripChars) 去除str 前端在stripChars中的字
stripEnd(String str,String stripChars) 去除str 后端在stripChars中的字符
equals(String str1,String str2) 比较两个字符串是否相等,如果两个均为空则认为相等 >indexOf(String str,char searchChar) 返回searchChar 在字符串中第一次出现的位置,如果没找到则返回 -1,如果str 为null 或者 “”,也返回-1
indexOf(String str,char searchChar,int startPos) 返回字符searchChar从startPos开始在字符串str中第一次出现的位置。
contains(String str,char searchChar) str中是否包含字符searchChar,str为null 或者 searchChar为null,返回false 。 StringUtils.contains("", “”) = true StringUtils.contains(“dfg”,
“”) = true
containsIgnoreCase(String str,String searchStr) str中是否包含字符searchChar,不区分大小写
int indexOfAny(String str, char[] searchChars) 找出字符数组searchChars中的字符第一次出现在字符串str中的位置。 如果字符数组中的字符都不在字符串中,则返回-1 ,如果字符串为null或"",则返回-1
subString(String str,int start) 从start 开始,包含start 那个字符,得到字符串str 的子串,如果start为负数,则从后面开始数起。如果str 为null 或者 “” 则返回其本身
subStringBefore(String str,String separator) 得到字符串separator第一次出现前的子串。不包含那个字符,如果str 为null 或者 “” 则返回其本身。
subStringAfter(String str,String separator) 得到字符串separator第一次出现后的子串,不包含那个字符,如果 str 为null,或者"",则返回其本身
subString(String str,int start,int end) 同上 l
eft(String str,int len) 得到字符串str从左边数len长度的子串,如果str 为null 或者 “”,则返回其本身,如果len小于0,则返回""
right(String str,int len)得到字符串str从右边数len长度的子串
mid(String str,int pos,int len) 得到字符串str从pos开始len长度的子串,pos小于0,则设为0。
split(String str) 把字符串拆分成一个字符串数组,用空白符 作为分隔符,字符串为null 返回null,字符串为"",返回空数组{}
split(String str,char c) 按照 char c 拆分字符串
join(Object[] arrey)把数组中的元素连接成一个字符串返回
join(Object[] arrey,char c) 把数组中的元素拼接成一个字符串返回,把分隔符 c 也带上
deleteWhitespace(String str) 删除字符串中的所有空白符,包括转义字符 removeStart(String str,String remove) 如果字符串str是以remove开始,则去掉这个开始,然后返回,否则返回原来的串
removeEnd(String str,String remove)
如果字符串str是以字符串remove结尾,则去掉这个结尾,然后返回,否则返回原来的串。 remove(String str,char remove) 去掉字符串str中所有包含remove的部分,然后返回 replace(String str,String reql,String with) 在字符串text中用with代替repl,替换所有 replaceChars(String str,char old,char new) 在字符串中 new 字符代替 old 字符 replaceChars(String str, String searchChars, String replaceChars) 这个有点特别,先看下面三个例子
StringUtils.replaceChars(“asssdf”,“s”,“yyy”)) = “ayyydf”
StringUtils.replaceChars(“asdf”,“sd”,“y”)) = “ayf”
StringUtils.replaceChars(“assssddddf”,“sd”,“y”))= “ayyyyf” 解释:为什么会出现上面这样的结果呢?原来这个置换规则是这样的,他是拿searchChars的index,去replaceChars找相应的index然后替换掉,怎么说呢?比如说第一个例子 s 的index 是0,找到yyy相对应的index为0的字符是y。第二个例子 ‘s’ 的index是0,‘d’的index是1, 字符’s’ 可以找到对应index为0的 ‘y’,d就找不到index为’1’的的字符了,所以就直接过滤掉了,听明白了吗?
overlay(String str,String new,int start,int end) 用字符串new 覆盖字符串str从start 到 end 之间的串
chop(String str) 去掉字符串的最后一个字符,比如/r/n
repeat(String str,int repart) 重复字符串repeat次
rightPad(String str,int size,String padStr) size长度的字符串,如果不够用padStr补齐 leftPad(String str,int size,String padStr)同上
center(String str,int size)产生一个字符串,长度等于size,str位于新串的中心 swapCase(String str) 字符串中的大写转小写,小写转换为大写
9.字符串的操作类型
Java 字符串类主要有String、StringBuffer、StringBuilder 可以进行字符串的拼接和拆分。
10.post,get的区别
- get 是从服务器上获取数据,post 是向服务器传送数据。 get 请求返回 request - URI 所指出的任意信息。 Post 请求用来发送电子邮件、新闻或发送能由交互用户填写的表格。这是唯一需要在请求中发送body的请求。使用Post请求时需要在报文首部
Content - Length 字段中指出body的长度。- get 是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post 机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址,用户看不到这个过程。
- 对于 get 方式,服务器端用Request.QueryString获取变量的值,对于 post 方式,服务器端用Request.Form获取提交的数据。
- get 传送的数据量较小,不能大于2KB。post 传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
用IIS过滤器的只接受get参数,所以一般大型搜索引擎都是用get方式。- get 安全性非常低,post 安全性相对较高。如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post 为好。
- GET限制From表单数据集必须是ASCII字符,而POST支持整个ISO10646字符集。 GET是From的默认方法。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET参数通过URL传递,POST放在Request body中。
- GET产生一个TCP数据包;POST产生两个TCP数据包。
点击查看详细介绍两者的区别
11.java中session,cookie的解释。
1.Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。
2.Cookies是属于Session对象的一种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者一个Cookie的文本文件中;而Session则会占用服务器资源。所以,尽量不要使用Session,而使用Cookies。但是我们一般认为Cookie是不可靠的,Cookies是保存在本机上的,但是其信息的完全可见性且易于本地编辑性,往往可以引起很多的安全问题Session是可靠地。但是目前很多著名的站点也都用Cookie。
有时候为了解决禁用Cookie后的页面处理,通常采用url重写技术,调用Session中大量有用的方法从Session中获取数据后置入页面。
12.SpringMVC与Struts2的主要区别?
①springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
②springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
③Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,
springmvc通过参数解析器是将request对象内容进行解析成方法形参,将响应数据和页面封装成ModelAndView对象,最后又将模型数据通过request对象传输到页面。
Jsp视图解析器默认使用jstl。
13.sql索引注意事项
推荐阅读
-
java面试问题总结
-
JFreeChart部署问题 博客分类: java jfreechart应用服务器WebsphereLinuxTomcat
-
JAVA基础总结(二)之基础语法
-
Base64、MD5、RSA和ASE加密算法总结及JAVA实现-RSA
-
二分查找、二分边界查找算法的模板代码总结-Java实现
-
Base64、MD5、RSA和ASE加密算法总结及JAVA实现-Base64
-
二分查找、二分边界查找算法的模板代码总结 - Java实现
-
gd总结20170104 博客分类: java
-
Java常见集合的归纳总结 博客分类: java java
-
java集合总结20161203 博客分类: java java