Java面试精华

来源:互联网 发布:淘宝卖家几单一颗心 编辑:程序博客网 时间:2024/04/26 11:21
  1. 单点登陆的原理
    单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁。
  2. Cookie防止篡改
    我们可以使用md5对cookie和用户密钥进行加密,将所得数据添加到cookie末尾 ;然后当客户端访问的时候从中取出cookie值再次和密钥加密,验证是否所得加密结果和cookie 末尾携带的加密结果是否相等。 如果不等,那么就表示cookie 内容被篡改了。
  3. Cookie和Session的区别
      a. session 在服务器端,cookie 在客户端(浏览器)
      b. session 默认被存在在服务器的一个文件里(不是内存)
      c. session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
  4. Session共享及其好处
    对于session共享我采用的手段是利用Redis来实现。
    memcache或则redis本身就是一个分布式缓存,便于扩展。网络开销较小,几乎没有IO。性能也更好。
  5. Mysql主从数据同步的方式
    Mysql提供的解决方案:使用binlog进行数据库同步。需要配置mysql。
    代码中实现读写分类:
      a. 可以使用aop实现一个切面。动态切换数据源。需要编程实现。
      b. 使用数据库中间件实现读写分类,分库分表。
  6. Spring 实例是单例还是多例?会不会有线程问题
    单例
      因此,只要controller中不定义属性,那么单例完全是安全的
    http://blog.csdn.net/q1512451239/article/details/53122687
    最佳实践:
      1、不要在controller中定义成员变量。
      2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope(“prototype”),将其设置为多例模式
  7. 数据库索引有什么好处?
      第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
      第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
      第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
      第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
      第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
  8. 使用什么数据库连接池?连接池的工作 原理?常用连接池C3PO,proxool与JNDI的区别?
      数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量
    9. IO和NIO的区别和原理?
      a. IO是面向流的,NIO是面向缓冲区的
      Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。
      b. 阻塞与非阻塞IO
      Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
      使用单线程Selector来管理多个通道,减少系统开销