面试题

一.get和post的区别

1. get是从服务器上获取数据,post是向服务器传送数据。

2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:

1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;

2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

二.session和cookie的区别

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

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗

考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能

考虑到减轻服务器性能方面,应当使用COOKIE。

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

cookie 和session 的联系:

session是通过cookie来工作的

session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。

在购物网站中通常将用户加入购物车的商品联通session_id记录到数据库中,当用户再次访问是,通过sessionid就可以查找到用户上次加入购物车的商品。因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。

三.tomcat的工作原理

1、客户端直接请求80/8080端口(或者由8009端口接收由apache等其他WebServer转发来的请求),Connector接收客户端请求。

2、Connector将http请求交给Engine。

3、Engine收到请求后,匹配到对应的Host,将该请求交给该Host处理。

4、Host处理请求,并将结果原路返回。

5、Connector接收到处理的结果后,返回给客户端或其他WebServer。

四.单例模式

1.懒汉式

public class Singleton {

    private static Singleton instance;

    private Singleton(){}

    public static Singleton getInstance(){

        if(instance==null){

            instance=new Singleton();

        }

        return instance;

    }

}

2.饿汉式

public class Singleton {

    private static Singleton instance = new SingletonDemo();

    private Singleton(){}

    public static Singleton getInstance(){

        return instance;

    }

}

五.mybatis与hibernate区别

   (1)hibernate的优势:·  MyBatis可以进行更为细致的SQL优化,可以减少查询字段。·  MyBatis容易掌握,而Hibernate门槛较高。

   (2)mybaitis 的优势:·  Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射;·  Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便;·  Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。·  Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

   (3)区别:Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。·  iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

六. LinkedList和ArrayList的区别

(1)ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢

LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

七.spring mvc工作机制?

工作机制:客户端请求提交到DispatcherServlet

由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller

DispatcherServlet将请求提交到Controller

Controller调用业务逻辑处理后,返回ModelAndView

DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图

视图负责将结果显示到客户端

八.sql优化

1.可以使用exist 和not exist代替 in和not in。where代替Having。

2.(1)避免对索引字段进行计算操作

(2)避免在索引字段上使用not,<>,!=

(3)避免在索引列上使用IS NULL和IS NOT NULL

(4)避免在索引列上出现数据类型转换

(5)避免在索引字段上使用函数

3.尽量避免在一个复杂查询里面使用LIKE '%parm1%'。

4.除非却有需要,否则应尽量避免使用临时表,相反,可以使用表变量代替;

5.尽量避免带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY

6.什么情况下设置了索引但无法使用,索引无效

1) 以”%”开头的LIKE语句,模糊匹配:红色标识位置的百分号会导致相关列的索引无法使用

2) Or语句前后没有同时使用索引

3) 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型,会使索引无效,产生全表扫描。)

4) 在索引列上使用IS NULL或IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可

5) 在索引字段上使用not,<>,!=,eg<>操作符(不等于):不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。

用其它相同功能的操作运算代替,如 a<>0 改为 a>0 or a<0

6) 对索引字段进行计算操作

7) 在索引字段上使用函数

7.如何设计一个高并发的系统

1) 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引优化

2) 使用缓存、尽量减少数据库IO

3) 分布式数据库、分布式缓存

4) 服务器的负载均衡。

九.斐波那契数列(前20个)

斐波那契数列:即1,1,2,3,5...........

public static void main(String[] args) {  

int arr[] = new int[20];  

arr[0] = arr[1] = 1;  

for (int i = 2; i < arr.length; i++) {  

arr[i] = arr[i -1] + arr[i - 2];  

 }  

System.out.println("斐波那契数列的前20项如下所示:");  

for (int i = 0; i < arr.length; i++) {  

System.out.print(arr[i]);  

        }  

 } 

十.hashmap的实现原理

HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

数组:存储区间连续,占用内存严重,寻址容易,插入删除困难; 

链表:存储区间离散,占用内存比较宽松,寻址困难,插入删除容易; 

Hashmap综合应用了这两种数据结构,实现了寻址容易,插入删除也容易。

你可能感兴趣的:(面试题)