Java的几道面试题目以及简短回答做个记录保存

时间:2021-08-02 13:07:40

  最近没有继续用CSDN写博客了,转到博客园,什么时候自己搭建一个博客就好了。

一 谈谈你对Spring的工作原理的理解

引用一篇博客的讲解,https://www.cnblogs.com/xdp-gacl/p/4249939.html,讲得很完善,内容也很丰富。

二 cookie跟session的区别

      1 session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务端可以知道其中的信息

  2 session中保存的是对象,cookie中保存的是字符串

  3 session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到;而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不道德。

三 谈一下java内存模型

      暂时略

四 Java线程的几种状态

1. 新建(NEW):新创建了一个线程对象。

2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。

3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。

4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种: 

(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

5. 死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

 不要跟操作系统的线程状态混淆了。

五 乐观锁跟悲观锁

   在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。
悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。

【悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。】

在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,Optimistic Concurrency Control,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。乐观事务控制最早是由孔祥重(H.T.Kung)教授提出。

【 乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。】

六 链表如何判断是否有环,以及入口点在哪里?

    ① 使用追赶的方法,设定两个指针slow、fastslow、fast,均从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;

如不存在环,fastfast遇到NULLNULL退出。如果没有环,则快指针比慢指针先到达链表尾部,退出程序。

    ②  设问题1中的相遇点为m1,赋值p=m1,q=h,其中h为链表头结点,然后p,q每次1步向前运动,

p,qp,q再次相遇所在的位置就是环的入口节点(环的连接点)。

   面试的时候,没有回答出推理的过程。

   这里用图解释一下。还没有试过数学严谨的证明,过后再补上。

   如果有错误,读者可以帮忙指出来一下。

    Java的几道面试题目以及简短回答做个记录保存

原理方面的问题,如果有段时间没有复习,就很容易忘记,可能跟没有运用到实践中有关,

所以有时间还是应该多看这方面的内容。

还有一些其他的面试问题,感觉难度更大一点,并且之前并没有接触过这部分的内容,

感觉需要补充学习的东西太多了。