技术面试(一)

序号 问题

1 自我介绍


2 知道的集合类有哪些

List set map

3 String、StringBuffer、StringBuilder区别

String:引用常量,final修饰,不能被继承

StringBuff 和 StringBuilder:引用变量,便于处理拼接字符串,前者线程安全,后者不是;

使用时,如果只是创建一个字符串,不改变时,使用String;

常进行拼接操作时:单线程使用StringBuilder,多线程使用StringBuffer

效率:StringBuilder>StringBuffer>String

4 hibernate和mybatis的区别

hibernate全自动,mybatis半自动的: hibernate通过其强大的对象关系模型对数据库进行操作,可以自动生成sql;mybatis则只是简单的字段映射,通过自己手写sql来操作

hibernate数据库可移植性大于mybatis:  hibernate使用的系统映射关系自动生成的sql和hql,降低对数据库的耦合性,mybatis则取决于我们手写的sql,

sql优化上mybatis要优于hibernate:手写的容易优化,机器生成的无法直接优化

hibernate拥有完整的日志系统,mybatis则欠缺一些。

5 什么是事务

6 spring的事务介绍

事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性,

事务的四个关键属性:原子性,一致性,隔离性,持久性。

Spring既支持编程式事务管理,也支持声明式的事务管理。编程式事务管理:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式管理事务时,必须在每个事务操作中包含额外的事务管理代码。声明式事务管理:大多数情况下比编程式事务管理更好用。它将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理.事务管理作为一种横切关注点, 可以通过 AOP 方法模块化. Spring 通过 Spring AOP 框架支持声明式事务管理.

7 session和cookie的区别

cookie存于客户端,不安全,有大小限制,通常一个cookie大小为4K,对多保存20个cookie,

session存于服务端,没有大小限制,过多时会占用服务器性能

1.cookie数据存放在客户的浏览器上,session数据存放在服务器上。

2.cookie不是很安全,别人可以通过分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3.session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4.Session中保存的是对象,Cookie中保存的是字符串。

5.单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

6.个人认为,将登陆信息等重要信息存放在session,其他信息如果需要保留,可以放在cookie中

8 group by 和having的区别用法

group by 分组,having用于分组后的条件

Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。group by 是先排序后分组;

HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。

9 tomcat如何增加内存

第一种方法:

Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置:

JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'

需要把这个两个参数值调大。例如:

JAVA_OPTS='-Xms256m -Xmx512m'

表示初始化内存为256MB,可以使用的最大内存为512MB。

第二种方法: 

环境变量中设     变量名:JAVA_OPTS     变量值:-Xms512m   -Xmx512m

第三种方法:

前两种方法针对的是bin目录下有catalina.bat的情况(比如直接解压的Tomcat等),但是有些安装版的Tomcat下没有catalina.bat,这个时候可以采用如下方法,当然这个方法也是最通用的方法:打开tomcatHome//bin//tomcat5w.exe,点击Java选项卡,然后将会发现其中有这么两项:Initial memory pool和Maximum memory pool.Initial memory pool这个就是初始化设置的内存的大小。Maximum memory pool这个是最大内存的大小 设置完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了

10 查一张表如果查的慢,如何解决

数据库优化,sql优化

创建索引语句:create index 索引名 on 表名(字段名)

explain你的select语句,分析一下

只有一行数据时 limit1

为搜索字段添加索引

避免使用select*

拆分大的delete或者insert语句

11 数据库索引如何使用,哪些字段需要加索引

索引是一种特殊的查询表,可以是数据库引擎增加检索速度

因为正确的索引可能使效率提高,而无效的索引可能是浪费了数据库空间,甚至大大降低查询性能;表的主键、外键必须有索引;经常与其他表进行连接的表,在连接字段上应该建立索引;经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

12 图表工具用过哪些,怎么用的

13 springmvc的工作原理

1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。

2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.

3.DispatcherServlet请请求提交到目标Controller

4.Controller进行业务逻辑处理后,会返回一个ModelAndView

5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象

6.视图对象负责渲染返回给客户端。

14 aop的介绍

Aop即面向切面编程,可以说是面向对象编程的补充和完善。Aop技术是一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,即切面,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性,比如权限认证、日志、事物。Aop的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

15 jquery的选择器

(1)基本

(2)层次选择器:

(3)基本过滤器选择器

(4)内容过滤器选择器

(5)可见性过滤器选择器

(6)属性过滤器选择器

(7)子元素过滤器选择器

(8)表单选择器

(9)表单过滤器选择器

$("#myELement")    选择id值等于myElement的元素

$("div")           选择所有的div标签元素,返回div元素数组

$(".myClass")      选择使用myClass类的css的所有元素

$("form input")         选择所有的form元素中的input元素

$("div[id]")              选择所有含有id属性的div元素

16 mybatis中$和#的区别,一对多怎么查询

# 会给添加的属性默认增加一个引号,可以防止sql注入

$ 则是直接添加到sql中,会发生sql注入

一对多:在配置时在"一"的resultMap里边添加collection标签添加"多"的一项

17 线程的实现方式

继承Thread

实现Runable接口

18 线程同步怎么实现

同步代码块

同步方法

使用特殊域变量(volatile)实现线程同步

使用重入锁实现线程同步

使用局部变量实现线程同步

http://blog.csdn.net/small_lee/article/details/51453019

19 静态代码块和构造器的执行顺序

20 hashMap和HashTable的区别

1、HashTable线程同步,HashMap非线程同步。

2、HashTable不允许<键,值>有空值,HashMap允许<键,值>有空值。

3、HashTable使用Enumeration,HashMap使用Iterator。

4、HashTable中hash数组的默认大小是11,增加方式的old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。

5、TreeMap能够把它保存的记录根据键排序,默认是按升序排序

21 ArrayList和LinkedList的区别

1.ArrayList是基于数组的数据结构,LinkedList基于链表的数据结构。

2.ArrayList查询数据比LinedList快,因为LinkedList要移动指针。

3.LinedList添加、删除数据比ArrayList快,因为ArrayList要移动数据。

22 主键外键的区别

1.主键是一个表的唯一标识,是这个表的约束,不能有重复,不能为空。关键字primary key

2.外键用于与另一张表的关联,是能确定另一张表记录的字段,用于保持数据的一致性。一个表可以有多个外键,关键字是foreign key

23 是否了解前端框架,用过哪些,简单介绍

Bootstrap layer  Swiper  amazeui

Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。Bootstrap中包含了丰富的Web组件,根据这些组件,可以快速的搭建一个漂亮、功能完备的网站。另外一个重点是,Bootstrap是自适应的,可以支持PC和移动端页面,自动调整其样式宽度高度,做PC端和移动端的网页都可以使用它。当然,完全做到自适应是不可能的,但是Bootstrap基本适用大部分场景了。

layer是一款口碑极佳的web弹层组件,与同类弹出层组件相比,layer的优势明显,她尽可能地在以更少的代码展现出更强健的功能

Swiper是纯javascript打造的滑动特效插件,面向手机、平板电脑等移动终端

简单来说,Swiper就是实现了一个滑动切换图片或面板的效果。显然是针对移动端的。

Amaze UI 是一个轻量级(所有 CSS 和 JS gzip 后 100 kB 左右),移动优先的前端框架。

24 抽象类和接口的关系

抽象类:

抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

接口:

接口是引用类型的,类似于类,和抽象类的相似之处有三点:

1、不能实例化;

2、包含未实现的方法声明;

3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

25 什么是gc,如何使用

垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

GC:指java的垃圾回收机制,java的垃圾回收机制是自动调用的,并不受程序员控制

程序员不能具体控制时间,系统在不可预测的时间调用System.gc()函数的时候;当然可以通过调优,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制进入oldObject的次数,使得oldObject 存储空间延迟达到full gc,从而使得计时器引发gc时间延迟OOM的时间延迟,以延长对象生存期。

gc回收的是那些超出了作用域或引用计数为空的对象;从gc root开始搜索找不到的对象,而且经过一次标记、清理,仍然没有复活的对象。

删除不使用的对象,回收内存空间;运行默认的finalize,当然程序员想立刻调用就用dipose调用以释放资源如文件句柄,JVM用from survivor、to survivor对它进行标记清理,对象序列化后也可以使它复活。

26 版本管理工具svn是干嘛的,怎么用的,代码冲突怎么办

SVN全名Subversion,即版本控制系统。Svn是一种集中式文件版本管理系统运行方式

常见操作:

svn checkout:将服务器代码完整的下载到本地

svn commit:将本地修改的内容提交到服务器

svn update:将服务器最新代码下载到本地

SVN是非常实用也好用的版本管理工具,但不是万能的,有时候还需要你手动解决。

一般在你准备提交一个新版本时,首先update一遍,有时候update完之后发现跟本地版本有冲突,这时候,在有冲突文件的地方存在4个文件:

1)petgeniusupdatelayer.ccb,这是冲突的文件,也就是你update下来的文件跟本地的文件合并之后存在冲突的文件,这个文件需要你去处理;

2)petgeniusupdatelayer.ccb.mine,这是在update之前本地修改的文件;

3)petgeniusupdatelayer.ccb.r19732,这是该文件的初始版本;

4)petgeniusupdatelayer.ccb.r20390,这是SVN服务器上你update下来的文件(服务器最新版本的文件);

一般冲突出现的原因是你和另外一个比你先commit的家伙修改到了这个文件的同一个地方,这个时候你有3种解决方法:

1)手动合并代码,这就要求你在不改动另外一个家伙代码目的的情况下,把自己的代码加进去,或者你们协商修改,一般问题不大,不要犯迷糊就可以;然后再svn里,remark as resolved;重新检查一遍即可commit;

2)无视新版本,使用你自己的版本,这时,只需要把后缀名为.mine的文件去掉这个后缀名,替代源文件petgeniusupdatelayer.ccb即可;

这种情况也有,比如某个模块只有你自己负责,别人不会动这个地方的代码等,但是由于不小心改动了一些(经常是别人要测试,自己改代码,改完之后忘记改回来就提交了)。

3)放弃本地版本,petgeniusupdatelayer.ccb.r20390去掉后缀名就是最新版本,或者直接全部删除,重新update一份,这代表完全放弃自己的修改,完全做无用功啊;

为了尽量避免冲突,减少麻烦:

1)提交的时候要注意检查自己本地修改,每个修改的地方做到心中有数,不需要提交的代码,比如打印Log,测试代码注意及时删除;

2)每次开始修改一份代码时,尽量保证初始代码为最新,这样可以尽可能减少冲突的发生

27 系统权限是如何管理的,怎么实现的

一个系统包含众多模块,要求能够通过权限管理,控制不同用户对模块的访问权限,而且需要控制到对某个模块的某个操作(增删改查)的级别。一般情况下,通过角色对用户进行统一授权,在某些特殊情况下,能够单独对用户进行授权。

28 项目是怎么部署上线的

1、打包成war格式,2.购买云服务器3.登录你的阿里云服务器4.远程连接5.配置java web环境6.发布项目

29 hibernate的延迟加载是怎么回事

延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。Hibernate使用了虚拟代理机制实现延迟加载。返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用getter方法时就会去数据库加载数据。

30 sql语句怎么优化的

①选取最适用的字段属性,数据库中的表越小,执行查询越快,因此将表中字段的宽度设置尽可能小,如varchar(255)不合适,另外应尽量把字段设置为not null。查询时不用去比较null值。

②使用连接join代替子查询,子查询即适用查询语句查询一个结果,把结果作为过滤条件用在另一个查询中,适用join时SQL不需要创建临时表来完成这个逻辑上的步骤。

③使用联合union来代替手动创建的临时表,使用union来创建查询时,只需要用union作为关键字把多个select语句连接起来就可以,要注意的是所有select语句中的字段数目要想同。

④要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。

⑤使用外键,能保证数据的关联性。

⑦使用索引,索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,

性能提高更为明显。

⑧优化的查询语句,如in和not in操作符性能低,like操作符中'_xx%'会引用范围索引。

31 如何保证redis和数据库中的数据是同步的

1)查询时先查询缓存(redis),如果查询不到,查询数据库,并将会员唯一标识(会员编号),放到redis队列中(list)

2)启动一个job从redis队列中读取会员唯一标识,并判断会员编号作为key是否存在于redis中,如果存在,计数器减一,否则直接查询会员信息,放到redis中。

3)更新时,先更新数据库,再清空对应redis信息,并将会员编号做为key的计数器加一

32 mysql的存储过程、触发器

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

mysql触发器

触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。

33 讲一下servlet

servlet从客户端(通过Web服务器)接收请求,执行某种作业,然后返回结果。

使用servlet的基本流程如下:

·客户端通过HTTP提出请求.

·Web服务器接收该请求并将其发给servlet。如果这个servlet尚未被加载,Web服务器将把它加载到Java虚拟机并且执行它。

·servlet将接收该HTTP请求并执行某种处理。

·servlet将向Web服务器返回应答。

·Web服务器将从servlet收到的应答发送给客户端。

34 java字符串类里常用的方法

length()方法 :字符串的长度

charAt()截取字符

getChars() 截取多个字符

getBytes() 将字符存储在字节数组中

toCharArrray()

35 request的常用方法

一、获取客户机环境信息常见方法:

1.getRequestURL方法返回客户端发出请求时的完整URL。

2.getRequestURI方法返回请求行中的资源名部分。

3.getQueryString方法返回请求行的参数部分。

4.getRemoteAddr方法返回发出请求的客户机的IP地址。

5.getRemoteHost方法返回发出请求的客户机的完整主机名。

6.getRemotePort方法返回客户机所使用的网络端口号。

7.getLocalAddr方法返回WEB服务器的IP地址。

8.getLocalName方法返回WEB服务器的主机名。

9.getMethod得到客户机请求方式。

二、获得客户机请求头:

1.getHeader(String name)方法

2.getHeaders(String name)方法

3.getHeaderNames()方法

三、获得客户机请求参数(客户端提交的数据)

1.getParameter(name)方法

2.getParameterValues(String name)方法

3.getParameterNames方法

4.getParameterMap方法,做框架时大量使用

四,其他

Request对象的主要方法:

setAttribute(String name,Object):设置名字为name的request 的参数值

getAttribute(String name):返回由name指定的属性值

getAttributeNames():返回request 对象所有属性的名字集合,结果是一个枚举的实例

getCookies():返回客户端的所有 Cookie 对象,结果是一个Cookie 数组

getCharacterEncoding() :返回请求中的字符编码方式

getContentLength() :返回请求的 Body的长度

getHeader(String name) :获得HTTP协议定义的文件头信息

getHeaders(String name) :返回指定名字的request Header 的所有值,结果是一个枚举的实例

getHeaderNames() :返回所以request Header 的名字,结果是一个枚举的实例

getInputStream() :返回请求的输入流,用于获得请求中的数据

getMethod() :获得客户端向服务器端传送数据的方法

getParameter(String name) :获得客户端传送给服务器端的有 name指定的参数值

getParameterNames() :获得客户端传送给服务器端所有参数的名字,结果是一个枚举的实例

getParameterValues(String name):获得有name指定的参数的所有值

getProtocol():获取客户端向服务器端传送数据所依据的协议名称

getQueryString() :获得查询字符串

getRequestURI() :获取发出请求字符串的客户端地址

getRemoteAddr():获取客户端的 IP 地址

getRemoteHost() :获取客户端的名字

getSession([Boolean create]) :返回和请求相关 Session

getServerName() :获取服务器的名字

getServletPath():获取客户端所请求的脚本文件的路径

getServerPort():获取服务器的端口号

removeAttribute(String name):删除请求中的一个属性

36 forward和redirect

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

forward:高.

redirect:低.

37 maven是做什么的,怎么用的

maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。

maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性。利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。

38 java中如果不用正则表达式,如何验证一个邮箱格式是否正确

使用java代码验证

import java.util.Scanner;

public class Test

{

public static void main(String args[])

{

Scanner sc=new Scanner(System.in);

String name=sc.next();

if(chose(name))

{

System.out.println("邮箱合法");

}

else

{

System.out.println("邮箱非法");

}

}

public  static boolean chose(String a)

{

String c;

String d;

char b=a.charAt(0);

if(a.equals(""))

{

return false;

}

if(b==' ' && b=='@' && b=='.')

{

return false;

}

c=a.substring(a.length()-4,a.length());

if(!(c.equals(".com")))

{

return false;

}

//用判定"@."是否存在好一些

if(!a.contains("@."))

{

return false;

}

}

39 hibernate和JPA有什么区别

JPA是一种ORM规范,提供的只是一些接口

Hibernate除了作为ORM框架之外,它也是一种JPA实现。

你可能感兴趣的:(技术面试(一))