因内容过多,题目答案并未展开,如想深刻理解请在参考资料中自行寻找文章。本文大部分答案为网络搬运,个人整理,答案如有错误,欢迎评论留言,我加以改正、学习。
1. JDK 和 JRE 有什么区别?
- JDK(Java Development Kit)是 Java 开发环境,是 Java 开发工具包,是程序员使用 Java 语言编写 Java 程序所需的开发工具包,是提供给程序员使用的[1]。
- JRE(Java Runtime Environment)是 Java 运行时环境,包含了java虚拟机,Java 基础类库。是使用 Java 语言编写的程序运行所需要的软件环境,是提供给想运行 Java 程序的用户使用的[1]。
- JDK 包含了 JRE,同时还包含了编译 Java 源码的编译器 javac,还包含了很多 Java 程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序[1]。
- 如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK[1]。
2. final 在 Java 中有什么作用?
- 修饰类:被 final 修饰的类不能被继承[2]。
- 修饰方法:被 final 修饰的类不能被其子类修改,即不可被重写[2]。
- 修饰变量:被 final 修饰的成员变量表示常量,必须要显示初始化,只能被赋值一次,赋值后值不再改变[2]。
- 修饰参数:被 final 修饰的参数是只读型的,即只可以被读取,不可以被修改[2]。
3. Java 容器有哪些?请举例说明。
-
ArrayList :是一个特殊的数组–动态数组,来自于System.Collections命名空间,通过添加和删除元素,就可以动态改变数组的长度[3]。
ArrayList<dataType> arrName = new ArrayList(); //不初始化数组容量 ArrayList<dataType> arrName = new ArrayList(3); //初始容量为3 ArrayList<dataType> arrName = new ArrayList(a); //a为集合或数组
-
LinkedList :就是数据结构中的链表。
LinkedList<dataType> linName = new LinkedList<dataType>();
-
Hashset :就是数据结构中的散列表。
HashSet<dataType> hashName = new HashSet<dataType>();
-
HashMap :是一个key-value键值对的数据结构,可以称其为链式散列表。
HashMap<dataType,dataType> mapName=new HashMap<>();
4. 并行和并发有什么区别?
- 并发是指多个线程任务在同一个CPU上快速地轮换执行,由于切换的速度非常快,给人的感觉就是这些线程任务是在同时进行的,但其实并发只是一种逻辑上的同时进行[4]。
- 并行是指多个线程任务在不同CPU上同时进行,是真正意义上的同时执行[4]。
5. Java 中 sleep 方法和 wait 方法的区别?
- wait 是等待,需要唤醒的,不唤醒会一直等待下去。
- sleep 是睡眠,指定时间后线程会继续运行,不需要唤醒。
6. cookie 和 session 有什么区别?
- Cookie 实际上是一小段的文本信息,是辨认用户状态的凭借,采用的是在客户端保持状态的方案,考虑到减轻服务器性能方面应当使用 Cookie[5]。
- Session 是为解决 Cookie 过多造成的客户端与服务端的数据传输量过大而诞生的,采用的是在服务器端保持状态的方案,考虑到安全应当使用 Session[5]。
7. 32 和 64 位的 JVM,int 类型变量的长度是多少?
- 32 位和 64 位的 JVM(Java Virtual Machine) 中,int 类型变量的长度是相同的,都是 32 位或者 4个字节。
8. Java 中堆和栈有什么区别?
- 栈[6]
- 栈内存用来存储局部变量和方法调用。
- 栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。
- 如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。
- 栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。
- 堆[6]
- 堆内存用来存储Java中的对象。
- 堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。
- 如果堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
9. Java 中,怎么在格式化的日期中显示时区?
-
SimpleDateFormat ft2 = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss Z");
//示例 Date date = new Date(); //获取时间 System.out.println(date.toString()); //输出 SimpleDateFormat ft1 = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); //格式化 System.out.println("Current Time: " + ft1.format(date)); //输出 SimpleDateFormat ft2 = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss Z"); //加时区 System.out.println("Current Time: " + ft2.format(date)); //输出 //输出结果 Tue Mar 16 07:41:05 CST 2021 Current Time: 2021-03-16 07:41:05 Current Time: 2021-03-16 07:41:05 +0800
10. Java中,抽象类与接口之间有什么不同?
-
抽象类与接口对比[7]
参数 抽象类 接口 默认的方法实现 可以有默认的方法实现。 完全抽象,不存在方法的实现。 实现 子类使用 extends 关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字 implements 来实现接口。它需要提供接口中所有声明的方法的实现 构造器 抽象类可以有构造器。 接口不能有构造器。 与正常Java类的区别 除了不能实例化抽象类之外,和普通Java类没有区别。 接口是完全不同的类型。 访问修饰符 抽象方法可以有public、protected和default这些修饰符。 接口方法默认修饰符是public,不可以使用其它修饰符。 main方法 抽象方法可以有main方法并且可以运行它。 接口没有main方法,因此不能运行它。 多继承 抽象方法可以继承一个类和实现多个接口。 接口只可以继承一个或多个其它接口。 速度 比接口速度要快。 稍微慢些,因为它需要时间去寻找在类中实现的方法。 添加新方法 往抽象类中添加新的方法,可以给它提供默认的实现,因此不需要改变你现在的代码。 往接口中添加方法,必须改变实现该接口的类。
11. 依赖注入和工厂模式有什么不同?
-
依赖注入和工厂模式对比[8]
参数 工厂模式 依赖注入 创建对象 有单独的 Factory 类,既创建对象和逻辑。 创建和注入对象。 对象的状态 创建有状态对象。 创建无状态对象。 运行/编译时间 编译时创建对象。 运行时配置对象。 代码变更 如果业务需求发生变化,则可能会更改对象创建逻辑。 无需更改代码。 机制 类依赖于工厂方法,而工厂方法又依赖于具体类。 父对象和所有从属对象可以在单个位置创建。
12. 描述 Java 中的重载和重写。
- 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写[9]
- 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同[9]。
13. equals 和 == 有什么区别?
-
equals 和 == 对比
参数 equals == 定义 Java 中的方法 Java 中的运算符 功能 判断两个变量或实例所指向的内存空间的值是不是相同。 判断两个变量或实例是不是指向同一个内存空间。
14. 什么是 springcloud?
- Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量[10]。
15. MyBatis 有几种分页方式?请具体说明。
- 数组分页:进行数据库查询操作时,获取到数据库中所有满足条件的记录,保存在应用的临时数组中,再通过List的subList方法,获取到满足条件的所有记录[11]。
- Sql 分页:在 sql 语句后面添加
limit
分页语句[11]。 - 拦截器分页:使用
StatementHandler
的包装类获取的参数组装分页查询的 sql 语句limitSql
,将原始的 sql 语句替换成我们新的分页语句[11]。 - RowBounds 分页:通过
RowBounds
实现分页和通过数组方式分页原理差不多,都是一次获取所有符合条件的数据,然后在内存中对大数据进行操作,实现分页效果。只是数组分页需要我们自己去实现分页逻辑,这里更加简化而已[11]。
16. 什么是并行?什么是并发?
- 并行:一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的[12]。
- 并发:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)[12]。
17. SpringMVC 常用的注解有哪些?
- @Controller: 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象[13]。
- @RequestMapping:用来处理请求地址映射的注解,可用于类或方法上[13]。
- @Resource和@Autowired:做bean的注入时使用[13]。
- @PathVariable:用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数[13]。
- @CookieValue:用来获取Cookie中的值[13]。
- @RequestParam:用于将请求参数区数据映射到功能处理方法的参数上[13]。
- @SessionAttributes:将值放到session作用域中,写在class上面[13]。
- @ModelAttribute:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中[13]。
- @ResponseBody:用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区[13]。
18. tomcat 如何调优?涉及哪些参数?
-
tomcat 可通过本身优化,也可通过 JVM 优化[14]。
- 本身优化:工作方式选择 ----> Connector 连接器的配置 ----> 配置文件优化( server.xml)
- JVM 优化: Tomcat 启动命令行中的优化参数。
-
涉及参数如下[14]:
export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
19. SpringMVC 与 Struts2 区别?
-
SpringMVC 和 Struts2 的比较[15]。
参数 SpringMVC Structs2 拦截 方法级别 类级别 共享 方法之间独立 方法之间独立,共享Action变量 内存 消耗较小 消耗较大 拦截器实现 interceptor机制 独立的AOP方式 入口 servlet filter 集成Ajax 使用方便,只需一个注解@ResponseBody就可以实现 使用不方便,在Action中处理时一般必须安装插件或者自己写代码集成进去 验证 支持 JSR303,处理相对灵活方便 比较繁琐 设计思想 在servlet上扩展 OOP的编程思想 开发效率 较高 较低
20. maven 中怎么排除包冲突?
-
xml 文件中加入下面的语句[16]:
<exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions>
21. 参考资料
[1] Ik小强. jdk和jre有什么区别?[EO/BL]. https://blog.csdn.net/weixin_40807247/article/details/83054382, 2018-10-15/2021-03-15.
[2] 佚名. final在java中的作用是什么[EO/BL]. https://jingyan.baidu.com/article/acf728fd97c555f8e510a3ed.html, 2019-03-08/2021-03-15.
[3] CircleYua. Java中ArrayList的使用[EO/BL]. https://blog.csdn.net/kingyuan666/article/details/81452524, 2018-08-06/2021-03-15.
[4] 杭州小哥哥. 并行和并发有什么区别?[EO/BL]. https://blog.csdn.net/W_317/article/details/104844878, 2020-03-13/2021-03-15.
[5] 技能树IT修真院. 什么是session?什么是cookie?session和cookie有什么区别?[EO/BL]. https://www.cnblogs.com/jnshu/p/10130029.html, 2018-12-17/2021-03-15.
[6] 过山车. Java中的堆和栈的区别[EB/OL]. https://www.cnblogs.com/seattle-xyt/p/10365859.html, 2019-02-12/2021-03-15.
[7] aspirant. Java抽象类与接口的区别[EB/OL]. https://www.cnblogs.com/aspirant/p/7079670.html, 2017-06-26/2021-03-16.
[8] 佚名. 依赖注入和工厂模式之间的区别。[EB/OL]. https://www.nhooo.com/note/qa0isc.html, ???-??-??/2021-03-16.
[9] 佚名. Java 重写(Override)与重载(Overload)[EB/OL]. https://www.runoob.com/java/java-override-overload.html, ???-??-??/2021-03-16.
[10] 蔚1. Spring Cloud 从入门到精通[EB/OL]. https://blog.csdn.net/valada/article/details/80892573, 2018-07-03/2021-03-16.
[11] 有小同志的老同志. mybatis的4种分页方式[EB/OL]. https://blog.csdn.net/u010667011/article/details/83819277, 2018-11-07/2021-03-16.
[12] 佚名. 并行[EO/BL]. https://baike.baidu.com/item/%E5%B9%B6%E8%A1%8C/5806759?fr=aladdin, ???-??-??/2021-03-16.
[13] 随★风. springMVC的常用注解有哪些?[EB/OL]. https://www.cnblogs.com/nongzihong/p/10042136.html, 2018-11-30/2021-03-16.
[14] Idongxu. Tomcat 调优及 JVM 参数优化[EB/OL]. https://blog.csdn.net/ldx891113/article/details/51735171, 2016-06-22/2021-03-16.
[15] 空谷幽澜. SpringMVC和Struts2区别比较[EB/OL]. https://www.cnblogs.com/huajiezh/p/6415444.html, 2017-02-19/2021-03-16.
[16] 小阳仔游戏解说. maven如何解决包冲突[EB/OL]. https://jingyan.baidu.com/article/90bc8fc8399421b652640c4d.html, 2019-08-18/2021-03-16.