我的 Java 面试题

因内容过多,题目答案并未展开,如想深刻理解请在参考资料中自行寻找文章。本文大部分答案为网络搬运,个人整理,答案如有错误,欢迎评论留言,我加以改正、学习。

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]

    参数SpringMVCStructs2
    拦截方法级别类级别
    共享方法之间独立方法之间独立,共享Action变量
    内存消耗较小消耗较大
    拦截器实现interceptor机制独立的AOP方式
    入口servletfilter
    集成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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值