⭐⭐⭐面试题必看⭐⭐⭐,读完让你面试不在发愁!

目录

简介

面试题

java基础题

        1.基本数据类型有哪些?

        2.HashMap的数据结构是什么?

        3.ArrayList的数据结构是什么?

        4.简述HashMap存储数据过程。

        5.如何通过反射调用一个类中的方法?

        6.创建一个对象时,构造器的调用顺序是什么?

        7.什么是原子类?

        8.常见的原子类有哪些?

        9.IO与NIO的区别有哪些?

        10.ConcurrentHashMap与HashTable的区别。

        11.代理模式有哪些?

JVM相关

        1.JVM主要组成部分。

         2.运行时数据区包括什么?

        3.类加载器有哪些?

        4.为什么使用双亲委派模型?

        5.创建对象的方式有哪些?

        6.为对象分配内存的两种方式是什么?

        7.创建对象时的并发安全问题。

        8.对象的访问定位。

        9.JVM垃圾回收策略有几种?

     10.JVM垃圾收集器有哪些?

      11.有几种GC?

       12.说一下堆栈的区别?

        13.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

        14.常用的 JVM 调优的参数都有哪些?

Spring相关题

        1.Spring的AOP与IOC。

        2.Spring中bean的作用域。

        3.bean的生命周期。

        4.spring 有哪些主要模块?

        5.spring 常用的注入(DI)方式有哪些?

        6.spring 中的 bean 是线程安全的吗?

        7.spring 自动装配 bean 有哪些方式?

        8.spring 事务实现方式有哪些?

        9.说一下 spring mvc 运行流程?

        10.spring mvc 有哪些组件?

        11.@RequestMapping 的作用是什么?

        12.@Autowired 的作用是什么?

SpringBoot相关

        1.springboot的启动过程。

        2.什么是 spring boot?

        3.为什么要用 spring boot?

        4.spring boot 核心配置文件是什么?

        5.springboot的核心注解 @SpringBootApplication     主配置类.

        6.spring boot 配置文件有哪几种类型?它们有什么区别?

        7.spring boot 有哪些方式可以实现热部署?

         8.jpa 和 hibernate 有什么区别?

SpringCloud相关

        1.SpringCloud五大组件

        2.Spring Cloud 和 dubbo 区别是什么?

        3.springcloud的自我保护机制。

        4.什么是 spring cloud?

        5.spring cloud 断路器的作用是什么?

Hibernate相关

        1.为什么要使用 hibernate?

        2.什么是 ORM 框架?

        3.hibernate 有几种查询方式?

        4.hibernate 实体类可以被定义为 final 吗?

        5.在 hibernate 中使用 Integer 和 int 做映射有什么区别?

        6.hibernate 是如何工作的?

        7.get()和 load()的区别?

        8.说一下 hibernate 的缓存机制?

        9.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

        10.hibernate 实体类必须要有无参构造函数吗?为什么?


简介

        通过文章分享一下,自己记录的一些面试题,希望能够帮助正在找工作,或者准备找工作的猿友们!

面试题

java基础题

        1.基本数据类型有哪些?

        byte、short、int、long、float、double、char、boolean

        2.HashMap的数据结构是什么?

                使用哈希表(数组+链表)来存储,当链表长度超过阈值8时会将链表转成红黑树,增加查找性能;

                 默认长度是16,当长度不够时,左移一位也就是扩容为原来的2倍。

        3.ArrayList的数据结构是什么?

                使用动态数组存储,初始化容量为10,扩容为原来的1.5倍,当remove其中一个元素时,需要移动size-index-1个元素,所以插入和删除慢,但是随机访问效率快,因为事先分配长度,所有有浪费。

        4.简述HashMap存储数据过程。

                获得key对象的hashcode;

                根据hashcode计算出hash值;

                生成Entry对象;

                将Entry对象放到table数组中。

        5.如何通过反射调用一个类中的方法?

                首先使用forName加载;

                使用newInstance实例化对象;

                使用getMethod获得方法;

                调用invoke方法调用。

        6.创建一个对象时,构造器的调用顺序是什么?

                首先调用父类的构造器;

                按照声明的顺序调用成员初始化;

                调用当前对象类本身的构造器。

        7.什么是原子类?

                原子类是非锁的线程安全的类,实现数据操作的原子性。

        8.常见的原子类有哪些?

                基本类型:使用原子的方式更新基本类型
                  a. AtomicInteger :整型原子类
                  b. AtomicLong :长整型原子类
                  c. AtomicBoolean :布尔原子类

                数组类型:使用原子的方式更新数组中某个元素
                  a. AtomicIntegerArray:整型数组原子类
                  b. AtomicLongArray:长整型数组原子类
                  c. AtomicReferenceArray:引用类型数组原子类(即对应数组中存放的元素为对象形式)

                引用类型:使用原子的方式更新某个对象
                  a. AtomicReference:引用类型原子类
                  b. AtomicStampedReference:AtomicReference的扩展版,增加了一个参数stamp标记,这里是为了解决了AtomicInteger和AtomicLong的操作会出现ABA问题。
                  c. AtomicMarkableReference :与AtomicStampedReference差不多,只不过第二个参数不是用的int作为标志,而用boolean类型做标记,具体用法看后面讲解。

                对象的属性修改类型:使用原子的方式更新某个类中某个字段
                  a. AtomicIntegerFieldUpdater:原子更新整型字段的更新器
                  b. AtomicLongFieldUpdater:原子更新长整型字段的更新器
                  c. AtomicReferenceFieldUpdater:原子更新引用类型字段的更新器

        9.IO与NIO的区别有哪些?

                IO是面向流的阻塞的IO;

                NIO是面向缓冲的非阻塞IO。

        10.ConcurrentHashMap与HashTable的区别。

                ConcurrentHashMap使用分段锁的思想来保证线程安全,对于不同的数据段使用不同的锁,可以支持多个线程同时访问不同的数据段,所以就不存在锁竞争,从而提高了并发效率。

                HashTable是使用在方法中加锁的方式来保证线程安全,所以在线程竞争激烈的情况下效率低下。

        11.代理模式有哪些?

                静态代理:被代理对象与代理对象实现相同的接口或者集成相同的类。

                动态代理:不需要实现接口,但是目标对象要实现接口,使用InvocationHandler接口实现动态代理。

                 CGLIB代理:当没有实现接口时使用,将MethodInterceptor传入Enhancer实现在MethodInterceptor中具体实现。

JVM相关

        1.JVM主要组成部分。

                JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。

         2.运行时数据区包括什么?

                运行时数据区包括5部分:方法区、虚拟机栈、本地方法栈、堆、程序计数器。

        3.类加载器有哪些?

                启动类加载器、扩展类加载器、系统类加载器、用户自定义类加载器。

        4.为什么使用双亲委派模型?

                防止内存中出现多份同样的字节码,保证一个类是由同一个加载器加载的。保证安全。

        5.创建对象的方式有哪些?

                使用new关键词;

                使用Class的newInstance方法;

                使用Construtor的newInstance方法;

                使用clone方法;

                反序列化。

        6.为对象分配内存的两种方式是什么?

                指针碰撞(堆内存规整时,把用过的内存放在一边,指针向另一边移动与对象大小相当的距离)。

                空闲列表(堆内存不规整时,虚拟机维护一个列表记录哪些内存可用,找到一个可以容纳对象的内存分配给对象)。

        7.创建对象时的并发安全问题。

                对分配内存空间的动作做同步处理(使用CAS(比较再交换)+ 失败重试来保障更新操作的原子性)

                将内存分配的动作以线程为单位划分在不同的空间进行,每个线程在Java堆中预先分配一块内存,这块区域叫做本地线程分配缓冲(TLAB),线程分配内存时在各自的TLAB上分配,当TLAB用完时,才需要同步锁,可以使用UserTLAB参数设定是否使用TLAB。

        8.对象的访问定位。

                指针:直接指向对象,代表一个对象在内存中的起始地址。

                句柄:相当于指向指针的指针,维护着对象的指针,不直接指向对象。

        9.JVM垃圾回收策略有几种?

                标记清除:效率低,回收后的内存过于碎片化。

                复制算法:可用内存只有一半。

                标记整理:将存活的对象移向一边,把剩下的内存清除掉。

                分代回收算法:分为新生代和老年代,使用不同的回收算法进行回收,新生代使用复制算法,老年代使用标记清除或者标记整理算法。

     10.JVM垃圾收集器有哪些?

                新生代收集器:Serial、ParNew、Parallel Scavenge;

                老年代收集器:Serial Old、Parallel Old、CMS;

                整堆收集器:G1;

      11.有几种GC?

                  Minor GC:新生代GC,比较频繁,回收速度快。

                  Full GC:又称Major GC发生在老年的GC。

       12.说一下堆栈的区别?

                功能方面:堆是用来存放对象的,栈是用来执行程序的。

                共享性:堆是线程共享的,栈是线程私有的。

                空间大小:堆大小远远大于栈。

        13.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

                新生代回收器:Serial、ParNew、Parallel Scavenge

                老年代回收器:Serial Old、Parallel Old、CMS

                整堆回收器:G1新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;

                老年代回收器一般采用的是标记-整理的算法进行垃圾回收。

        14.常用的 JVM 调优的参数都有哪些?

                -Xms2g:初始化推大小为 2g;

                -Xmx2g:堆最大内存为 2g;

                -XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;

                -XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;

                –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;

                -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;

                -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;

                -XX:+PrintGC:开启打印 gc 信息;      

                -XX:+PrintGCDetails:打印 gc 详细信息。

Spring相关题

        1.Spring的AOP与IOC。

                IOC,依赖注入,控制反转;

                AOP,面向切面编程。

                IOC就是典型的工厂模式,使用反射生成所需要的bean,通过sessionfactory去注入实例。

                AOP就是典型的代理模式的体现。

        2.Spring中bean的作用域。

                singleton、prototype、request、session、global-session

        3.bean的生命周期。

                实例化 Instantiation、

                属性赋值 Populate、

                初始化 Initialization、

                销毁 Destruction。

        4.spring 有哪些主要模块?

                spring core:框架的最基础部分,提供 ioc 和依赖注入特性。

                spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。

                spring dao:Data Access Object 提供了JDBC的抽象层。

                spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。

                spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。

                spring Web mvc:spring 中的 mvc 封装包提供了 Web 应用的 Model-View-Controller(MVC)的实现。

        5.spring 常用的注入(DI)方式有哪些?

                setter 属性注入、 构造方法注入 、 注解方式注入。

        6.spring 中的 bean 是线程安全的吗?

                spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。有状态就是有数据存储功能。无状态就是不会保存数据。

        7.spring 自动装配 bean 有哪些方式?

                no:默认值,表示没有自动装配,应使用显式 bean 引用进行装配。

               byName:它根据 bean 的名称注入对象依赖项。

               byType:它根据类型注入对象依赖项。构造函数:通过构造函数来注入依赖项,需要设置大量的参数。

               autodetect:容器首先通过构造函数使用 autowire 装配,如果不能,则通过 byType 自动装配。

        8.spring 事务实现方式有哪些?

                声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。

               编码方式:提供编码的形式管理和维护事务。

        9.说一下 spring mvc 运行流程?

                spring mvc 先将请求发送给 DispatcherServlet。

                DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。

                DispatcherServlet 再把请求提交到对应的 Controller。

                Controller 进行业务逻辑处理后,会返回一个ModelAndView。

                Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。

                视图对象负责渲染返回给客户端。

        10.spring mvc 有哪些组件?

                前置控制器 DispatcherServlet。

                映射控制器 HandlerMapping。

                处理器 Controller。

                模型和视图 ModelAndView。

                视图解析器 ViewResolver。

        11.@RequestMapping 的作用是什么?

                将 http 请求映射到相应的类/方法上。

        12.@Autowired 的作用是什么?

                @Autowired 它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,通过@Autowired 的使用来消除 set/get 方法。

SpringBoot相关

        1.springboot的启动过程。

               每个SpringBoot程序都有一个主入口,也就是main方法,main里面调用SpringApplication.run()启动整个spring-boot程序

                 1.首先进入run方法

                2.run方法中去创建了一个SpringApplication实例,在该构造方法内,我们可以发现其调用了一个初始化的initialize方法,这里主要是为SpringApplication对象赋一些初值。构造函数执行完毕后,我们回到run方法。

                3.run方法中主要:

                        1.创建了应用的监听器SpringApplicationRunListeners并开始监听
                        2.加载SpringBoot配置环境(ConfigurableEnvironment),如果是通过web容器发布,会加载StandardEnvironment,其最终也是继承了ConfigurableEnvironment

                4.回到run方法内,prepareContext方法将listeners、environment、applicationArguments、banner等重要组件与上下文对象关联。

                5.接下来的refreshContext(context)方法(初始化方法如下)将是实现spring-boot-starter-*(mybatis、redis等)自动化配置的关键,包括spring.factories的加载,bean的实例化等核心工作。

        2.什么是 spring boot?

                spring boot 是为 spring 服务的,是用来简化新 spring 应用的初始搭建以及开发过程的。

        3.为什么要用 spring boot?

                配置简单,独立运行,自动装配,无代码生成和 xml 配置提供应用监控,易上手,提升开发效率

        4.spring boot 核心配置文件是什么?

                spring boot 核心的两个配置文件:bootstrap (. yml 或者 . properties):bootstrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,且 bootstrap 里面的属性不能被覆盖;application (. yml 或者 . properties):用于 spring boot 项目的自动化配置。

        5.springboot的核心注解 @SpringBootApplication     主配置类.

                继承@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan.

                @SpringBootConfiguration:继承@Configuration,Spring配置注解,将当前类声明的一个或多个@Bean注解标记的方法纳入Spring容器,实例名就是方法名.

                @EnableAutoConfiguration:继承@AutoConfigurationPackage,导入了AutoConfigurationImportSelector.class   AutoConfigurationPackages.Registrar.class根据添加的jar包来配置项目的默认配置。

                @ComponentScan:扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理

        6.spring boot 配置文件有哪几种类型?它们有什么区别?

                配置文件有 . properties 格式和 . yml 格式,它们主要的区别是书法风格不同。.                 properties 配置如下:spring. RabbitMQ. port=5672.

                yml 配置如下:spring:RabbitMQ:port: 5672. yml 格式不支持 @PropertySource 注解导入。

        7.spring boot 有哪些方式可以实现热部署?

                使用 devtools 启动热部署,添加 devtools 库,在配置文件中把 spring. devtools. restart. enabled 设置为 true;

                使用 Intellij Idea 编辑器,勾上自动编译或手动重新编译。

         8.jpa 和 hibernate 有什么区别?

                jpa 全称 Java Persistence API,是 Java 持久化接口规范,hibernate 属于 jpa 的具体实现。

SpringCloud相关

        1.SpringCloud五大组件

                服务发现-Netflix Eureka

                客户端负载均衡-Netflix Ribbon

                 断路器-Netflix Hystrix

                服务网关-Netflix Zuul

                分布式配置-Spring cloud Config

        2.Spring Cloud 和 dubbo 区别是什么?

                (1)服务调用方式 dubbo是RPC;Springc+Cloud Rest Api

                (2)注册中心,dubbo 是zookeeper;SpringCloud是Eureka,也可以是zookeeper

                (3)服务网关,dubbo本身没有实现,只能通过其他第三方技术整合;SpringCloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。

        3.springcloud的自我保护机制。

                自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:

                3.1Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。

                3.2Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上,保证当前节点依然可用。

                3.3当网络稳定时,当前Eureka Server新的注册信息会被同步到其他节点中。因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

        4.什么是 spring cloud?

                spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册[Eureka]、配置中心[Config]、消息总线[]、负载均衡[Ribbon]、断路器[Hystrix]、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。

        5.spring cloud 断路器的作用是什么?

                在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

Hibernate相关

        1.为什么要使用 hibernate?

                hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码。hibernate 是一个优秀的 ORM 实现,很多程度上简化了 DAO 层的编码功能。可以很方便的进行数据库的移植工作。提供了缓存机制,是程序执行更改的高效。

        2.什么是 ORM 框架?

                ORM(Object Relation Mapping)对象关系映射,是把数据库中的关系数据映射成为程序中的对象。

                使用 ORM 的优点:提高了开发效率降低了开发成本、开发更简单更对象化、可移植更强。

        3.hibernate 有几种查询方式?

                三种:hql、原生 SQL、条件查询 Criteria。

        4.hibernate 实体类可以被定义为 final 吗?

                实体类可以定义为 final 类,但这样的话就不能使用 hibernate 代理模式下的延迟关联提供性能了,所以不建议定义实体类为 final。

        5.在 hibernate 中使用 Integer 和 int 做映射有什么区别?

                Integer 类型为对象,它的值允许为 null,而 int 属于基础数据类型,值不能为 null。

        6.hibernate 是如何工作的?

                读取并解析配置文件。读取并解析映射文件,创建 SessionFactory。打开 Session。创建事务。进行持久化操作。提交事务。关闭 Session。关闭 SessionFactory。

        7.get()和 load()的区别?

                 数据查询时,没有 OID 指定的对象,get() 返回 null;load() 返回一个代理对象。

                load()支持延迟加载;get() 不支持延迟加载。

        8.说一下 hibernate 的缓存机制?

                hibernate 常用的缓存有一级缓存和二级缓存:一级缓存:也叫 Session 缓存,只在 Session 作用范围内有效,不需要用户干涉,由 hibernate 自身维护,可以通过:evict(object)清除 object 的缓存;clear()清除一级缓存中的所有缓存;flush()刷出缓存;二级缓存:应用级别的缓存,在所有 Session 中都有效,支持配置第三方的缓存,如:EhCache。

        9.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

                getCurrentSession 会绑定当前线程,而 openSession 则不会。

                getCurrentSession 事务是 Spring 控制的,并且不需要手动关闭,而 openSession 需要我们自己手动开启和提交事务。

        10.hibernate 实体类必须要有无参构造函数吗?为什么?

                hibernate 中每个实体类必须提供一个无参构造函数,因为 hibernate 框架要使用 reflection api,通过调用 ClassnewInstance() 来创建实体类的实例,如果没有无参的构造函数就会抛出异常。

不足之处,可以关注私信沟通,期待技术交流!

作者:筱白爱学习!!

欢迎关注转发评论点赞沟通,您的支持是筱白的动力!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
对于Java面试题太多背不完的问题,以下是一些建议和解决方法: 1. 理解核心概念:首先,要确保对Java的核心概念有深入的理解,包括面向对象编程、多线程、异常处理、集合框架等。这些概念是Java面试中经常涉及的重要知识点。 2. 重点关注常见问题:了解常见的Java面试题,特别是那些经常被问到的问题。这些问题通常涉及Java的基础知识、常用类和库、设计模式等。可以通过查阅面试题集合、参考书籍或在线资源来获取这些问题。 3. 制定学习计划:根据自己的时间和能力,制定一个合理的学习计划。可以将面试题分为不同的主题,每天或每周专注于一个主题进行学习。这样可以有针对性地提高自己的知识水平。 4. 实践和编码:通过实践和编码来加深对Java知识的理解和记忆。可以尝试解决一些编程问题,参与开源项目或者自己动手实现一些小项目。这样可以将理论知识应用到实际中,加深记忆。 5. 参加模拟面试:参加模拟面试可以帮助你熟悉面试的流程和问题类型,并提供反馈和建议。可以找一些朋友或者加入面试准备的群组,进行模拟面试的练习。 6. 多做笔记和总结:在学习过程中,多做笔记和总结是很重要的。可以将重要的知识点、面试题和解答记录下来,方便日后复习和回顾。 总之,Java面试题太多背不完是一个常见的问题,但通过合理的学习方法和实践,可以提高自己的面试准备水平。记住,重要的是理解核心概念和掌握常见问题,而不是仅仅死记硬背。祝你面试顺利!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱白爱学习

你的鼓励将是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值