Java 面试集锦
1. html 与 jsp 区别?
答:HTML 是文本标记语言,它是静态页面;JSP 页面是有 JSP 容器执行该页面的 Java 代码部分然后实时生成动态页面,可动态更新页面上的内容。
在 jsp 中用<%%>就可以写 Java 代码了,而 html 没有<%%>,html 需要将对象转换为 Json 进行交互,不建议在 jsp 中写 java 代码,导致代码混乱。
2. 什么是 Jsp 自定义标签?
答:在 jsp 开发时,当 jsp 内置标签以及 JSTL 标签库都满足不了需求时,可以根据自己的需求来自定义标签。其实在 jsp 页面使用标签就等同于调用某个对象的某个方法。继承 TagSupport,编写 TLD。
3. GET 和 POST 两种基本请求方法的区别
答:
1.GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。
2.GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
3.GET 参数通过 URL 传递,POST 放在 Requestbody 中。
4.GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
5.GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
6.GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
7.GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以。
8.GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
GET 和 POST 本质上没有区别,HTTP 协议中的两种发送请求的方法,GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。因为 POST 需要两步,时间上消耗的要多一点,看起来 GET 比 POST 更有效。因此 Yahoo 团队有推荐用 GET 替换 POST 来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
1. GET 与 POST 都有自己的语义,不能随便混用。
2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的 TCP 在验证数据包完整性上,有非常大的优点。
3. 并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。
4. jquery 选择器有哪几种?
答:
1.元素选择器:$("p")
2. id 选择器:$("#test")
3. .class 选择器:$(".test")
5. jQuery 库中的 $() 是什么?
答:$() 函数是 jQuery() 函数的别称,$() 函数用于将任何对象包裹成 jQuery 对象,接着你就被允许调用定义在 jQuery 对象上的多个不同方法。
6. $(document).ready() 是个什么函数?为什么要用它?
答:当 DOM 完全加载(例如 HTML 被完全解析 DOM 树构建完成时),jQuery 允许你执行代码
7. 哪种方式更高效:document.getElementbyId("myId"),还是 $("#myId")?常用的是哪种?
答:第一种,因为它直接调用了 JavaScript 引擎;$("#myId")。
8. EasyUI DataGrid 是什么?
答: DataGrid 以表格形式展示数据,并提供了丰富的选择、排序、分组和编辑数据的功能支持。是否支持单元格合并、多列标题、冻结列功能?
9. EasyUI Combobox 是什么?
组合框(combobox)显示一个可编辑的文本框和下拉列表,用户可以从下拉列表中选择一个或多个值。用户可以直接输入文本到列表的顶部,或者从列表中选择一个或多个现成的值。
后端(java 基础)
1. 八种基本数据类型的大小,以及他们的封装类
八种基本数据类型:int、short、float、double、long、boolean、byte、char。
封装类分别是:Integer、Short、Float、Double、Long、Boolean、Byte、Character。
2. 什么是自动装箱拆箱?
装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
3. Object 是所有类的父类,任何类都默认继承 Object。
4. String、StringBuffer 与 StringBuilder 的区别
String:适用于少量的字符串操作的情况。
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况。
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。
StringBuilder:是线程不安全的,而 StringBuffer 是线程安全的。
运行速度快慢为:StringBuilder > StringBuffer > String。
String 最慢的原因::String 为字符串常量,而 StringBuilder 和 StringBuffer 均为字符串变量,即 String 对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
5. Map、Set、List
Map 是键值对,键 Key 是唯一不能重复的,一个键对应一个值,值可以重复。
HashMap 不保证顺序,即为无序的。
TreeMap 可以保证顺序。
Set 不包含重复元素的集合,有序的。
List 有序的可重复集合。
6. try?catch?finally,try 里有 return,finally 还执行么
肯定会执行 finally{}块的代码。只有在 try{}块中包含遇到 System.exit(0)之类的导致 Java 虚拟机直接退出的语句才会不执行。
当程序执行 try{}遇到 return 时,程序会先执行 return 语句,但并不会立即返回,也就是把 return 语句要做的一切事情都准备好,在将要返回、但并未返回的时候,程序把执行流程转去执行 finally 块,当 finally 块执行完成后就直接返回刚才 return 语句已经准备好的结果。
7. IO 与 NIO
NIO 是为了弥补 IO 操作的不足而诞生的,NIO 的一些新特性有:非阻塞 I/O,选择器,缓冲以及管道。管道(Channel),缓冲(Buffer),选择器( Selector)是其主要特征。
IO 是面向流的,NIO 是面向块(缓冲区)的。
IO 是阻塞的,NIO 是非阻塞的。
那么 NIO 和 IO 各适用的场景是什么呢?
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,这时候用 NIO 处理数据可能是个很好的选择。
而如果只有少量的连接,而这些连接每次要发送大量的数据,这时候传统的 IO 更合适。使用哪种处理数据,需要在数据的响应等待时间和检查缓冲区数据的时间上作比较来权衡选择。
8. 什么是 Java 的反射?
Java 反射是可以让我们在运行时,通过一个类的 Class 对象来获取它获取类的方法、属性、父类、接口等类的内部信息的机制。
这种动态获取信息以及动态调用对象的方法的功能称为 JAVA 的反射。
应用场景:
反射技术常用在各类通用框架开发中。因为为了保证框架的通用性,需要根据配置文件加载不同的对象或类,并调用不同的方法,这个时候就会用到反射——运行时动态加载需要加载的对象。
特点:
由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
9. 悲观锁与乐观锁
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
两种锁的使用场景:
乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行 retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。
10. 什么是设计模式
设计模式是一种解决方案,用于解决在软件设计中普遍存在的问题,是前辈们对之前软件设计中反复出现的问题的一个总结。常用模式有单例模式,工厂模式,代理模式,模板模式,观察者模式。
单例设计模式懒汉式和恶汉式:
懒汉式在类加载时不初始化,延迟加载。(配置文件)
饿汉式在类加载时初始化,加载慢,获取对象快。
饿汉式是线程安全的,懒汉式需要加 synchronized,否则不安全。
11.Spring AOP 是什么
AOP(Aspect Oriented Programming) 面向切面编程,利用 AOP 可以对业务逻辑的各个部分隔离,从而使的业务逻辑各部分的耦合性降低,提高程序的可重用性,提高开发效率,主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等。
AOP 实现原理是 java 动态代理,但是 jdk 的动态代理必须实现接口,所以 spring 的 aop 是用 cglib 这个库实现的。
12.AOP 与 OOP 的区别
OOP 面向对象编程,针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。而 AOP 则是针对业务处理过程中的切面进行提取,它所面对的是处理过程的某个步骤或阶段,以获得逻辑过程的中各部分之间低耦合的隔离效果。这两种设计思想在目标上有着本质的差异。
13.Spring IOC 是什么
Java 特性:多态,继承,封装;为什么类的属性要定义为私有的?
控制反转,由 spring 自动生产,使用 java 的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法;依赖注入,有三种注入方式:构造器注入、setter 方法注入、根据注解注入。
14.Spring 事务的实现方式和实现原理:
Spring 事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring 是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过 binlog 或者 redo log 实现的。
15.脏读,不可重复读,幻读
常用传播行为:PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务。
MySQL 的事务隔离级别一共有四个:
MySQL 的默认事务隔离级别是:RepeatableRead(可重复读),会导致出现幻读。
脏读:通俗的讲,一个事务在处理过程中读取了另外一个事务未提交的数据。
你都还没提交,我就读到了你刚操作的数据,万一你回滚了怎么办,你说这脏不脏。
不可重复读(Non-repeatable Read):通俗的讲,一个事务范围内,多次查询某个数据,却得到不同的结果。
幻读: 事务 A 按照一定条件进行数据读取,期间事务 B 插入了相同搜索条件的新数据,事务 A 再次按照原先条件进行读取时,发现了事务 B 新插入的数据称为幻读。
16.什么是 Spring MVC ?简单介绍下你对 springMVC 的理解?
Spring MVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架,通过把 Model,View,Controller 分离,将 web 层进行职责解耦,把复杂的 web 应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
17.SpringMVC 的流程?
(1)用户发送请求至前端控制器 DispatcherServlet;
(2) DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取 Handle;
(3)处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter 处理器适配器;
(5)HandlerAdapter 经过适配调用
具体处理器(Handler,也叫后端控制器);
(6)Handler 执行完成返回 ModelAndView;
(7)HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给 DispatcherServlet;
(8)DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;
(9)ViewResolver 解析后返回具体 View;
(10)DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet 响应用户。
18. SpringMVC 怎么样设定重定向和转发的?
(1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=sourcebyte"
(2)重定向:在返回值前面加"redirect:",譬如"redirect:https://www.sourcebyte.vip"
19.Spring MVC 的异常处理 ?
答:可以将异常抛给 Spring 框架,由 Spring 框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
20.如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
答:直接在方法中声明这个对象,SpringMvc 就自动会把属性赋值到这个对象里面。
21.SpringMvc 中函数的返回值是什么?
答:返回值可以有很多类型,有 String, ModelAndView。ModelAndView 类把视图和数据都合并的一起的,但一般用 String 比较好。
22.hibernate get 和 load 区别
(1)get 如果没有找到会返回 null, load 如果没有找到会抛出异常。
(2)get 会先查一级缓存,再查二级缓存,然后查数据库;load 会先查一级缓存,如果没有找到,就创建代理对象,等需要的时候去查询二级缓存和数据库。
23. Hibernate 中的三种数据状态
临时态(瞬时态/Transient),持久态(Persistent),游离态(脱管态/Detached)
24.Hibernate 有哪几种查询数据的方式
3 种:hql、条件查询 QBC(QueryByCriteria)、原生 sql (通过 createSQLQuery 建立)
25. Hibernate 是如何延迟加载
配置 LAZY 属性 FetchType.LAZY。
26.Hibernate 中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的 many-to-one、one-to-many、many-to-many。
27.delete、drop、truncate 区别
truncate 和 delete 只删除数据,不删除表结构,drop 删除表结构,并且释放所占的空间。删除数据的速度,drop> truncate > delete。
delete 属于 DML 语言,需要事务管理,commit 之后才能生效。drop 和 truncate 属于 DDL 语言,操作立刻生效,不可回滚。
使用场合:
当你不再需要该表时,用 drop;当你仍要保留该表,但要删除所有记录时,用 truncate;当你要删除部分记录时(always with a where clause), 用 delete。
28. 导致 SQL 执行慢的原因:
1.硬件问题。如网络速度慢,内存不足,I/O 吞吐量小,磁盘空间满了等。
2.没有索引或者索引失效。(一般在互联网公司,DBA 会在半夜把表锁了,重新建立一遍索引,因为当你删除某个数据的时候,索引的树结构就不完整了。所以互联网公司的数据做的是假删除.一是为了做数据分析,二是为了不破坏索引)。
3.数据过多(分库分表)。
4.服务器调优及各个参数设置(调整 my.cnf)。
5.分析原因,找切入点
1).先观察,开启慢查询日志,设置相应的阈值(比如超过 3 秒就是慢 SQL),在生产环境跑上个一天过后,看看哪些 SQL 比较慢。
2).Explain 和慢 SQL 分析。比如 SQL 语句写的烂,索引没有或失效,关联查询太多(有时候是设计缺陷或者不得以的需求)等等。
3).Show Profile 是比 Explain 更近一步的执行细节,可以查询到执行每一个 SQL 都干了什么事,这些事分别花了多少秒。
29.什么是索引?
索引(Index)是帮助 MySQL 高效获取数据的数据结构。我们可以简单理解为:快速查找排好序的一种数据结构。
如若转载,请注明出处:开源字节 https://sourcebyte.vip/article/318.html
评论