面试过程中遇到的各种问题

Hibernate

  1. Hibernate中的get和load的区别

1.从返回结果上对比:

load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常;

get方法检索不到的话会返回null;

2.从检索执行机制上对比

Load:1.查询session缓存:先查一下session缓存,看看该id对应的对象是否存在

缓存中没有这个对象 就创建个代理因为延迟加载需要代理来执行 所以就创建了个代理,ok 到此为止 这句话就执行完了,这个 并没有去数据库交互查询总之真正操作使用数据的时候,对象才存在到内存,节省了服务器内存的开销,从而提高了服务器的性能。

Get:hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

  1. MyBatis和Hibernate的优缺点对比。

Hibernate的优点:

  1. 对jdbc进行了封装,去掉了一些重复性的代码
  2. 与数据库的无关性好,映射关系强,自动生成sql语句,开发速度快。
  3. Hibernate的移植性好(体现在换数据库的情况下)

缺点:

  1. 学习成本高,在配置表与表之间的映射关系复杂,在性能优化设计上需要经验
  2. Hql语句查询有局限,没有sql语句灵活(例如投影查询)

Mybatis的优点:

  1. 易于上手和掌握,sql语句灵活
  2. Sql语句都在xml文件内,实现了sql与代码的解耦合
  3. 在性能上相对于hibernate来说,速度比它快

缺点:

1、关联表多时,字段多的时候,sql工作量很大。

2、sql依赖于数据库,导致数据库移植性差。

Struts2

Spring

Spring的优点

  1. 使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑
  2. AOP的很好支持,方便面向切面编程。
  3. 可以容纳各种优秀的框架,最主要原因
  4. 对于代码基本是零污染

谈谈你对spring的理解

Spring是一个优秀的简化企业级应用的开源框架,然后说出spring的优点

然后分别介绍IOC,DI,AOP

SpringMVC的流程

  1. 用户请求发送到前端控制器(dispatchServlet)
  2. 前端控制器没有处理业务逻辑能力,分配到handler的映射器(判断是否注解)
  3. 然后会走到handleradopt的适配器,返回执行链携带了两部分内容:handler对象,拦截器处理包装后的handler对象
  4. 然后经过处理器处理业务逻辑,返回ModelAndView对象
  5. 将ModelAndView返回前端控制器
  6. 然后经过视频解析器,进行视图渲染,返回视图
  7. 经过tomcat将其换边为html返回
  8. 用户产生响应

编程式事务与声明式事务的区别?

编程式事务是自己写事务处理的类,然后调用

声明式事务是在配置文件中配置,一般在框架里面使用,做到代码不污染,零浸入

其他知识点:

Jsp的九大内置对象

1、page对象

2、pageContext对象

3、request对象

4、session对象

5、application对象那个

6、response对象

7、config对象

8、out对象

9、exception对象

Jsp参数传递的方式:

  1. form表单
  2. Request.setAttribute()和Request.getAttribute()
  3. <jsp:param>
  4. 超链接

JS实现点击事件

<button id =”btn”>click</button>

Var btn = document.getElementById(“btn”)

Btn.onclick=function(){

Alert(“hello word”)

}

Jsp页面表单重复提交问题

  1. js禁掉提交按钮
  2. 尽量使用get/post/redirect方式提交
  3. 在form表单上使用cache-control,去掉表单上的缓存

Cookie和session的区别

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

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

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

4、session能够存储任意java对象,cookie只能存储String对象

5、所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中

Servlet和Jsp的区别

Jsp的本质就是一个servlet,jsp在运行时,就会被编译成servlet文件。

Jsp更擅长网页制作,显示,修改后可以直接在页面上看到

Servlet更擅长业务逻辑处理编程。

Servlet的生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

Servlet 通过调用 init () 方法进行初始化。

Servlet 调用 service() 方法来处理客户端的请求。

Servlet 通过调用 destroy() 方法终止(结束)。

最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

forward与redirect的区别是什么?

Forward是请求转发,特点为:一次请求,只能访问内部资源,在传输过程中数据不会丢失,地址栏不会改变

应用:一般用户用户登录时,根据角色转发到响应的模块

效率:高

Redirect是重定向,特点为:两次请求,可以访问任意资源,地址栏会发生变化,在传输过程中数据会丢失

应用:一般用于用户注销登录时返回主页或跳转到其他网站

效率:低

sleep和wait的区别

  1. 这两个方法来自不同的类分别是Thread和Object
  2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
  3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在

    任何地方使用

   synchronized(x){

      x.notify()

     //或者wait()

   }

  1. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

你所接触的开源框架有哪些?

shiro安全框架,activemq消息中间件,dubbo分布式框架,redis,quartz等等。

长连接和短连接

通常的短连接操作步骤是:  连接→数据传输→关闭连接;  

长连接通常就是:   连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;

长连接多用于操作频繁,点对点的通讯,且连接数不能太多的情况;

数据库一般使用长连接,http请求多用于短连接。

粗粒度与细粒度权限的区别?

粗粒度权限管理,对资源类型的权限管理。资源类型比如:菜单、url连接、用户添加页面、用户信息、类方法、页面中按钮。。

粗粒度权限管理比如:超级管理员可以访问户添加页面、用户信息等全部页面。

部门管理员可以访问用户信息页面包括 页面中所有按钮。

细粒度权限管理,对资源实例的权限管理。资源实例就资源类型的具体化,比如:用户id为001的修改连接,1110班的用户信息、行政部的员工。

细粒度权限管理就是数据级别的权限管理。

细粒度权限管理比如:部门经理只可以访问本部门的员工信息,用户只可以看到自己的菜单,大区经理只能查看本辖区的销售订单。。

粗粒度和细粒度例子:

 系统有一个用户列表查询页面,对用户列表查询分权限,如果粗颗粒管理,张三和李四都有用户列表查询的权限,张三和李四都可以访问用户列表查询。

进一步进行细颗粒管理,张三(行政部)和李四(开发部)只可以查询自己本部门的用户信息。张三只能查看行政部 的用户信息,李四只能查看开发部门的用户信息。细粒度权限管理就是数据级别的权限管理。

单例模式的手写/冒泡排序

常见的异常有哪些

Indexoutofbounce 索引越界异常

java.lang.NullPointerException(空指针异常)

Classnotfoundexception 找不到类

 java.lang.NumberFormatException 字符串转换数字异常

Classcastexception 数据类型转换异常

Filenotfoundexception 文件未找到

java.lang.NoSuchMethodException 方法不存在

内存泄漏

内存泄漏就是我们用完一块内存后给弄丢了,导致垃圾回收器不能对其回收,所以导致内存泄漏,内存泄漏堆积过多,就会导致内存溢出

Ajax的原理及实现步骤:

Ajax相当于一个中间件,调用xmlHttpRequest对象,优化了浏览器与服务器之间的传输,减少了不必要的数据往返,相当于减轻了服务器的压力

原理: HTTP协议的异步通信
get 请求
1) 创建一个XMLHttpRequest对象
2) 调用该对象的open方法
3) 如果是get请求,设置回调函数onreadystatechange = callback
4) Send

如果是post 请求

创建一个XMLHttpRequest对象
6) 调用该对象的open方法
7) 调用setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
8) 设置回调函数onreadystatechange = callback
9) Send

MVC设计模式及各个功能

Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。

    通常模型对象负责在数据库中存取数据。

View(视图):是应用程序中处理数据显示的部分。
    通常视图是依据模型数据创建的。

Controller(控制器):是应用程序中处理用户交互的部分。
    通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

属于线程私有的内存空间是?

程序计数器,虚拟机栈,本地方法栈

Redis

redis的五种数据结构

1、String类型。Value只能是String类型。

2、Hash类型。可以对key进行分类。

3、List类型。所有元素是有序的

4、Set类型。元素是无序的,元素是不能重复。集合操作,并集,交集,差集

5、SortedSet(zset)有序的set,元素不能重复且有序。

String—字符串
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。string类型是Redis最基本的数据类型,一个键最大能存储512MB。


使用场景:原子计数器,页面缓存

Hash——字典(哈希)
Hash是一个健值对集合,是一个String类型的key与value的映射表,特别适合用于存储对象。
使用场景:存储、读取、修改用户属性

List——列表
使用场景:微博 TimeLine、消息队列

Set——集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
使用场景:1.共同好友、二度好友 2.利用唯一性,可以统计访问网站的所有独立 IP 3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐

Sorted Set——有序集合
使用场景:1.带有权重的元素,比如一个游戏的用户得分排行榜 2.比较复杂的数据结构,一般用到的场景不算太多

redis常用的操作命令

get/set

keys *

expir/ttl   设置保存多长时间/查看还有多长时间

incr/decr    自增和自减

del    删除

redis的集群安装步骤:

  1、需要干净的6个redis实例

  2、修改6个实例的端口号 port

  3、修改6个实例的集群属性 cluster-entable yes 开启

  4、安装ruby的环境和rubygem系统,redis-3.0.2.gem接口包

  5、在redis安装包下redis-3.0.2/src/redis-trib.rb文件运行:

        ./redis-trib.rb create --replicas 1 192.168.37.161:7001 192.168.37.161:7002 192.168.37.161:7003 192.168.37.161:7004 192.168.37.161:7005 192.168.37.161:7006

redis是单线程,但是Redis的读写速度太快了。

Redis特点:

读写速度快,安全性差,不能存储海量数据

redis安全性高吗?

    面试题:

    redis的持久化:

        RDB :

            save 900 1       : 900 秒 更新一次 保存

            save 300 10      : 300秒  更新10次保存

            save 60 10000    : 60秒  更新10000次给你保存

            最好的情况:能保存60秒的数据!!!

            正好 : 59秒 断电了!

        AOF :

            保存磁盘并且保存的命令!

            # appendfsync always   : 实时保存

            appendfsync everysec   : 一秒钟保存: 900毫秒的时候断电了!

            # appendfsync no

            最好的请求能保留:1秒钟的数据!!!

数据库相关(Mysql和oracle)

Oracle:

oracle中,在查询语句中将null变成0,如何处理?

Select nvl(null,0) from dual;

oracel中是如何进行分页查询的?

select * from student where rownum>=1;

--如果想要用rownum不从1开始,

Select a1.* from (select student.*,rownum rn from student) a1 where rn > 5;

--在3-5之间的

select a1.* from (select student.*,rownum rn from student) a1 where rn between 3 and 5;

select a1.* from (select student.*,rownum rn from student where rownum <=5) a1 where rn >=3;

char和varchar的区别

char:(存储效率和索引效率极高)
使用指定长度的固定长度表示的字符串;比如char(8),则数据库会使用固定的8个字节存储数据,不管你够不够8个字节,都会给你开辟8个空间

Varchar:

存储变长数据,根据你所需要的字节数给你开辟空间,比如不够8个字节的话,他就会给你开辟符合你的字节数。

数据库索引的作用优点和缺点

优点:

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 
    第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 
    第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
    第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
    第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

  • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 
    第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 
    第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 

Mysql

Mysql的优化

表结构优化方面:

  1. 尽量把字段设置成not null,避免数据库做一些null判断
  2. 尽量使用英文代替中文
  3. 尽量使用数字代替一些非必要的字段,例如sex
  4. 在varchar()尽量设置空间,避免数据库对容量做一些判断
  5. 尽量使用varchar代替char
  6. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
  7. 避免频繁创建和删除临时表,以减少系统表资源的消耗。

Sql语句优化方面:

  1. 使用join代替子查询

b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL

2、使用联合(UNION)来代替手动创建的临时表或者代替or

创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`

3、建立索引

(普通索引)->
创建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)

(唯一索引)->
创建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))
(主键)->
它是唯一索引,一般在创建表是建立,格式为:
CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])

4、优化sql语句

  1. 在使用limit查询时,如果基数过于庞大,使用between...and...替换

应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)

  1. 使用not extit 代替not in
  1. 开启查询缓存,优化查询。
  2. 正确的选择引擎。
  3. 后台使用prepareStatement,安全防注入,性能高
  4. 垂直分表
  5. 使用 ENUM 而不是 VARCHAR,如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是VARCHAR。
  6. explain你的select查询,这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的

java方面:重点内容

 a.尽可能的少造对象。

        b.合理摆正系统设计的位置。大量数据操作,和少量数据操作一定是分开的。大量的数据操作,肯定不是ORM框架搞定的。,

        c.使用jDBC链接数据库操作数据

        d.控制好内存,让数据流起来,而不是全部读到内存再处理,而是边读取边处理;

        e.合理利用内存,有的数据要缓存

Mysql分表

水平分表:把一个表拆分按某个字段拆分称多个表 (用户表)

垂直分表:把表的大字段,并且不是经常查询,单独的放入到一张表去(文章表)

水平分库方式主要根据用户属性(如地市)拆分物理数据库。(一种常见的方式是将全省划分为几个大区)

垂直分库方式:根据业务维度和数据的访问量等,进行数据的分离,剥离为多个数据库。(收藏夹和博客的库分开)

Mysql 中 MyISAM 和 InnoDB 的区别有哪些?

区别:

1、InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

2、InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

3、InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4、InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

5、Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

Mysql的存储过程

Create procedure pr_add(a int,b int)

Begin

Decare c int;

If a is null then set a = 0;

End if;

If b is null then set b = 0;

End if;

Set c = a + b;

Select c as sum;

Volatile关键字:回答思路

  1. 先解释一下内存模型:并简单说明一个每个的作用
  2. 然后说volatile的两个特点:可见性,非原子性(有bug)
  3. 解释bug原因:由于是实时更新,在还没执行时就已经更新了

volatile static int start = 3;

volatile static int end = 6;

线程A执行如下代码:

while (start < end){

  //do something

}

线程B执行如下代码:

start+=3;

end+=3;

这种情况下,一旦在线程A的循环中执行了线程B,start有可能先更新成6,造成了一瞬间 start == end,从而跳出while循环的可能性。

  1. 使用场景

运行结果并不依赖变量的当前值

变量不需要与其他的状态变量共同参与不变约束。

猜你喜欢

转载自blog.csdn.net/zz18435842675/article/details/81841087
今日推荐