Spring专项练习和Java基础、数据库

  1. 在SpringMVC中Model,ModelMap,ModelAndView都可以作为数据模型对象。ModelAttribute是注解,用于定义控制器方法执行之前,对数据模型的操作。
  2. Model对象可以被自动实例化。
  3. propagation_supports支持当前事务,如果当前没有事务,则以非事务方式执行;propagation_mandatory传播行为使用当前的事务,如果当前没有事务,则抛出异常;propagation_requires_new新建事务,如果当前存在事务,则把当前事务挂起。propagation_required如果当前没有事务,则新建一个事务;如果已存在一个事务,则加入到这个事务中。
    propagation_nested若当前存在事务,则采用嵌套事务执行此方法,否则就创建新事务来执行此方法。
  4. required是@RequestParam注解的属性,是指该参数是否为必传项,默认为true,表示请求中一定要传入对应的参数。
  5. Spring创建Bean的方式:构造器,实例工厂,静态工厂。
  6. @Autowired注解是Spring提供的注解,只能根据类型注入Bean。
  7. 可以管理Spring Bean的生命周期的注释有:@PostContruct,@PreDestroy。
  8. 用于从URL中提取参数的注解是@PathVariable。
  9. SpringMVC拦截器需实现HandlerInterceptor接口,而WebMVCConfiguration接口是MVC配置类要实现的接口。
  10. SpringBoot核心功能是自动配置,起步依赖,端点监控。
  11. SpringBean的作用域是singleton、prototype,request,session,globalSession。
  12. SpringAOP支持的通知类型前置通知,后置通知,环绕通知,返回通知,异常通知。
  13. MVC的处理过程,首先控制器接受用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
  14. IOC是控制反转的意思,是一种面向对象的编程思想。Spring采用依赖注入的方式,实现了IOC思想。
  15. 说一说你对声明式事务的理解?Spring事务管理的亮点在于声明式事务管理,允许我们通过声明的方式,在IOC配置中指定事务的边界和事务属性,Spring会自动在指定的事务边界上应用事务属性。
  16. 抽象类不能实例化对象,成员变量、成员方法和构造方法的访问方式和普通类一样。抽象类不能实例化对象,所以抽象类必须被继承。抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。抽象类中不一定包含抽象方法,如果一个类包含抽象方法,那么该类必须是抽象类。任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
  17. 接口可以有多个方法,不能实例化对象,没有构造方法,接口中的所有方法必须是抽象方法,Java8之后借口可以用default关键字修饰的非抽象方法。接口不能包含成员变量,除了static和final变量。接口不是被类继承,而是被类实现。接口支持多继承。一个接口可以有多个方法。
  18. 接口与类的区别:a.接口不能用于实例化对象。b.接口没有构造方法。c.接口中所有的方法必须是抽象方法,Java8之后接口中可以使用default关键字修饰非抽象方法。d.接口中不能包含成员变量,除了static和final变量。接口不是被类继承,而是被类实现。接口支持多继承。
  19. 抽象类和接口的区别:a.抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。b.抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。c.接口中不能含有静态代码块以及静态方法,而抽象类是可以有静态代码块和静态方法。d.一个类只能继承一个抽象类,而一个类可以实现多个接口。
  20. Java中的所有类都继承了Object类。
  21. 创建线程的方法:实现Runnable接口,继承Thread类,通过Callable和Future创建线程。就绪状态-start()方法,运行状态-run()方法,阻塞状态-sleep()和suspend()等方法,等待阻塞-wait()方法,同步阻塞-获取synchronized同步锁失败,其他阻塞-调佣线程的sleep()或join()发出了I/O请求。
  22. 创建线程的三种方式的对比:采用实现Runnable、Callable接口的方式创建多线程时,线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。使用继承Thread类的方式创建线程时,编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
  23. run()和start的区别:run()方式是线程执行体,start()方法是启动线程。
  24. 线程是否可以重复启动,会有什么后果?不能,只有对于新建状态下的线程调用start()方法,否则会引发IllegalThreadStateException异常。
  25. 线程的生命周期:新建、就绪、运行、阻塞和死亡。
  26. 如何实现线程同步:同步方法、同步代码块、ReentrantLock、volatile和原子变量。
  27. Java的多线程通信方式:wait()、notify()和notifyAll();await()、signal和signalAll();BlockingQueue。
  28. sleep()和wait()的区别:sleep()是Thread类中的静态方法,而wait()是object类中的成员方法;sleep()可以在任何地方使用,而wait()只能在同步方法或同步代码块中使用;sleep()不会释放锁,wait()会释放锁,并通过notify()或notifyAll()重新获取锁。
  29. notify()和notifyAll()的区别:notify()用于唤醒一个正在等待相应对象锁的线程;notifyAll()用于唤醒所有正在等待相应对象锁的线程。
  30. 如何实现子线程先执行,主线程再执行:启动子线程后,立即调用该线程的join()方法,主线程必须等待子线程执行完成后再执行。
  31. synchronized可以修饰静态方法和静态代码块吗?可以修饰静态方法,不能修饰静态代码块。
  32. Java锁的四种状态:无锁,偏向锁,轻量级锁和重量级锁。
  33. volatile关键字的作用:保证可见性和禁止指令重排。实现原理:“内存屏障”,即:确保指令重排时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面,在执行内存屏障这条指令时,前面的操作已经完成;强制将对缓存的修改操作立即写入主存;如果是写操作,会导致其他CPU中对应的缓存行无效。
  34. 说说你对JUC的了解:(java.util.concurrent)是JSR166标准规范的一个实现。在这个包下的类:原子更新,锁和条件变量,线程池,阻塞队列,并发容器和同步器。
  35. 说说AQS的理解:抽象队列同步器(AbstractQueuedSynchronizer),用来构建锁或者其他同步组件的骨架类。基于AQS实现的组件有:ReentrantLock(重入锁),Semaphore(计数信号量),ReentrantReadWriteLock(读写锁)。
  36. LongAdder解决了什么问题,它是如何实现的?解决了高并发环境下的计数问题,根据锁分段来实现的。
  37. 介绍一下线程池:系统启动一个新线程时的成本是很高的,因为涉及与操作系统进行交互,在这种情况下,使用线程池可以很好的提高性能,尤其是当程序中需要创建大量周期比较短的线程时,线程池是首要选择。
  38. 线程池的五种状态:running,shutdown,stop,tidying,terminated。
  39. 线程池的拒绝策略:AbortPolicy(丢弃任务抛出异常),DiscardPolicy(丢弃任务不抛出异常),DiscardOldestPolicy(丢弃队列最前面的任务)和CallerRunsPolicy(调用线程处理该任务)。
  40. JVM包含哪几个部分?四大部分,ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine(执行引擎)和Native Interface(本地库接口)。
  41. JVM是如何运行的?状如环境和配置,装载JVM,初始化JVM,获得本地调用接口和运行Java程序。
  42. Java程序是怎么运行的?经过编译器编译成字节码文件后通过类加载器加载到内存中,才能被实例化,然后到Java虚拟机中解释执行,最后通过操作系统操作CPU执行获取结果。
  43. 本地方法栈有什么用?虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则视为虚拟机使用到的本地方法服务。
  44. 没有程序计数器会怎么样?Java程序中的流程控制无法得到正确的控制,多线程也无法正确的轮换。
  45. 元空间在栈内还是在栈外?在栈外,元空间占用的是本地内存。
  46. 怎么定义垃圾?引用计数算法,可达性分析算法,回收方法区;怎么回收垃圾?分代收集理论,标记清除算法,标记复制算法,标记整理算法。
  47. 如何减少Full GC(Generation Collections)的次数:增加方法区的空间,增加老年代的空间,减少新生代的空间,禁止使用System.gc()方法,使用标记整理算法,尽量保持较大的连续内存空间,排查代码中无用的大对象。
  48. 为什么设置两个survivor区域?设置两个Survivor区最大的好处就是解决内存碎片化。
  49. CMS垃圾收集器运作过程四个步骤:初始标记,并发标记,重新标记和并发清除。
  50. 内存泄漏和内存溢出有什么区别?内存泄漏指的是程序运行过程中分配内存给临时变量,用完之后却没有被GC回收,导致内存不能被使用也不能分配给其他程序,这就造成了内存泄漏。内存溢出指的是程序运行过程中申请的内存大于系统能够提供的内存,导致无法申请到足够的内存,这就造成了内存溢出。
  51. 内存泄漏怎么解决?尽早释放无用对象的引用,避免在循环中创建对象,使用字符串处理时避免使用String,应使用StringBuffer,尽量少用静态变量,因为静态变量存放在永久代,基本不参与垃圾回收。
  52. 内存溢出怎么解决?修改JVM启动参数,直接增加内存,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误,对代码进行走查和分析,找出可能发生内存溢出的位置,使用内存查看工具动态查看内存使用情况。
  53. 哪些区域会OOM(内存溢出),怎么触发OOM?除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OOM异常的可能。Java堆溢出,虚拟占和本地方法栈溢出,方法区和运行时常量池溢出,本地直接内存溢出。
  54. 数据库如何实现行转列?使用case...when...then和使用IF()函数。实例:
    SELECT userid, SUM(CASE `subject` WHEN '语文' THEN score ELSE 0 END) as '语文', SUM(CASE `subject` WHEN '数学' THEN score ELSE 0 END) as '数学', SUM(CASE `subject` WHEN '英语' THEN score ELSE 0 END) as '英语', SUM(CASE `subject` WHEN '政治' THEN score ELSE 0 END) as '政治'  FROM tb_score  GROUP BY userid
    
    SELECT userid, SUM(IF(`subject`='语文',score,0)) as '语文', SUM(IF(`subject`='数学',score,0)) as '数学', SUM(IF(`subject`='英语',score,0)) as '英语', SUM(IF(`subject`='政治',score,0)) as '政治'  FROM tb_score  GROUP BY userid
  55. 如何解决SQL注入?将绑定的参数传入到MySQL服务器,MySQL服务器对参数进行编译,即填充到相应的占位符的过程中,进行转义操作。常用的JDBC就有预编译功能,不仅提升性能,而且防止SQL注入。
  56. 并发情况下,读操作可能存在的三类问题:脏读(读到的是其他事务未提交的数据),不可重复读(其他事务已提交的数据,数据变了),幻读(数据的行数变了)。
  57. 怎么插入数据更高效?对于MyISAM引擎的表:禁用索引,禁用唯一性检查,使用批量插入,使用load data infile批量导入。对于InnoDB引擎的表:禁用唯一性检查,禁用外键检查,禁用自动提交。
  58. JDK11api文档查询访问:https://www.runoob.com/manual/jdk11api
  59.  所有基础课程请访问:https://www.runoob.com/。

你可能感兴趣的:(Java,Web开发,spring,java)