Java开发工程师面试基础

知识点

  • 1.java基础
  • 2.数据结构和八大算法
  • 3.多线程基础
  • 4.spring,spring MVC,mybatis基础。
  • 5.jvm基础。
  • 6.gc基础。

Java基础

  • 【面向对象优点】
  • 1.开发模块化,更易维护和修改。
  • 2.代码复用。
  • 3.增加代码可靠性,灵活性和可理解性。

【多态】
- 同一个事件发生在不同的对象上会产生不同的结果。
- 多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力

【继承】
- 1.提供代码的重用性。

【抽象】【封装】
- 1.【抽象】和【封装】是互补。
- 2.【抽象】关注对象的行为。
- 3.【封装】关注对象的行为的细节。
- 4.【封装】提供抽象的一种策略。

【接口】【抽象类】
- 1.【接口】方法隐含的都是抽象,抽象类可以包含非抽象
- 2.可以实现多个接口,但只能继承一个抽象类。
- 3.【接口】final,【抽象】非final

- 4.【接口】public,【抽象】非public

【Java虚拟机】
- 一个可以执行Java字节码的虚拟机进程,java可以在任意一个有JVM的平台都可以运行。

  • 【static】【override】
  • 【static】编译时静态绑定的。
  • 【override】运行时动态绑定的。

-【overriding覆盖】【overloading重载】
-【overrding】是子类重新定义父类的方法。

-【overloading】多个相同方法名参数不一致

【java数据类】

- byte,int,short,long,float,double,char,boolean

【值传递】
- 对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量
- 【引用传递】
- 对象型变量,变量地址的副本,会影响变量值。

【创建线程的三种方式】
- 1.继承Thread类。
- 2.实现runnable接口。

- 3.使用Executor框架来创建线程池

【Java集合类框架的基本接口】
- 1.Collection:代表一组对象,每一个对象都是它的子元素。
- 2.Set:不包含重复元素的Collection
- 3.List:有顺序的collection,并且可以包含重复元素。
- 4.Map:可以把键(key)映射到值(value)的对象,键不能重复。

  • 【数组(Array)】和【列表(ArrayList)】
  • 【Array】包含基本类型,对象类型。【ArrayList】包含对象类型
  • 【Array】大小固定 【ArrayList】动态变化

  • 【ArrayList】

  • 基于索引,o(1)
  • 【LinkedList】
  • 元素列表,o(n)

gc面试题

-GC是在什么时候,对什么东西,做了什么事情?
- GC什么时候开始回收
- eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio控制新生代老年代比例,通过MaxTenuringThreshold控制进入老年前生存次数等
- 对什么东西:
- 1.超出作用域或者是引用基数为0的对象
- 2.从gc root开始搜索,搜索不到的对象
- 3.从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象
- 做什么事情:
- 删除不使用的对象,腾出内存空间
- 新生代做的是复制清理,老年代做的标记处理,

JVM

  • JVM内存分哪几个区,每个区的作用是什么?
  • 【方法区】
  • 线程共享,存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据,
  • 【虚拟机栈】
  • 栈内存,为Java方法服务,线程私有。
  • 【本地方法栈】
  • 与虚拟机栈类型类型,为native服务
  • 【堆】
  • 线程共享的内存,经常发生GC
  • 【程序计数器】
  • 内存空间小,字节码解释器工作时通过改变这个计数值可以选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个java虚拟机规范没有规定任何OOM情况的区域。

  • 判断对象是否存在?

  • 1.引用计数法
  • 会存在循环引用的问题,主流虚拟机都不采用这种算法。
  • 2.可达性算法
  • 从GC ROOTS对象向下搜索,如果一个对象到GCRoots没有任何引用链相连。则说明此对象不可用。
  • 可用GCRoots对象有:虚拟机栈中引用的对象,方法区类静态属性引用的对象,方法区常量池引用的对象,本地方法栈JNI引用的对象。
  • 不一定会被回收,不一定会马上回收,而是处于一个死缓的阶段,需要经过两次标记。

  • 简诉下java垃圾回收机制

  • 虚拟机自动运行,低优先级的垃圾回收线程,在空闲或者内存不足时执行,扫描无引用对象,添加到回收集合,进行回收。

  • java中垃圾收集方法
    【标记-清除】

  • 标记回收对象,统一回收。
  • 效率低,产生不连续内存碎片,容易导致以后没有足够大的内存而提前触发GC
    【复制算法】
  • ,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清楚完第一块内存,再将第二块上的对象复制到第一块。但是这种方式,内存的代价太高,每次基本上都要浪费一半的内存。
  • 优化:分为8:1:1,eden和survivor,survivor(分别叫from和to)
  • 参考链接
    【标记-整理】
  • 每次将可回收对象移动到一端,清除边界以外的对象、不会产生内存碎片。
    【分代收集】
  • 分为年轻代和老年代。
  • 年轻代由于生存期短,更新换代快,采用复制算法。
  • 老年代使用标记清除或者标记整理

【java内存模型】
-java内存模型(JMM)是线程间通信的控制机制.JMM定义了主内存和线程之间抽象关系。线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示意图如下:

【java类加载过程?】
- 加载-》验证-》准备-》解析-》初始化
- 【java类加载机制】
- 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型

【类加载器双亲委派模型机制】
- 当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。

【简述java内存分配与回收策率以及Minor GC和Major GC】
- 1.对象优先在堆的Eden区分配。
- 2.大对象直接进入老年代.
- 3.长期存活的对象将直接进入老年代.
当Eden区没有足够的空间进行分配时,虚拟机会执行一次Minor GC.Minor Gc通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生Gc的频率较高,回收速度比较快;Full Gc/Major GC发生在老年代,一般情况下,触发老年代GC的时候不会触发Minor GC,但是通过配置,可以在Full GC之前进行一次Minor GC这样可以加快老年代的回收速度。
参考链接

spring

【控制反转IOC】
- Spring 把相互协作的关系称为依赖关系。假如 A 组件调用了 B 组件的方法,我们可称A 组件依赖于 B 组件。
- 在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转
- 好处:依赖注入让 Spring 的 Bean以被指文件组织在一起,而不是以硬编码的方式耦合在一起。程序完成无须理会被调用者的实现,也不无须主动定位工厂,这是最好的解耦方式。实例之间的依赖关系由 IoC 容器负责管理

【依赖注入】
- IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的

【Java注入三种方式】
- 1.构造注入
- 2.Setter注入
- 3.接口注入

【spring中的bean】
- Java的实例,Java组件,包括任何应用
- 参考链接

【Spring的三种配置方式】
- 1.基于xml的配置
- 2.基于注解的配置
- 3.基于Java的配置

【spring bean的作用域】
- singleton 默认范围 只有唯一一个实例
- prototype 为每一个bean提供一个实例
- request 在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
- session 确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
- global-session global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

【Spring框架中的单例Beans是线程安全的么?】
- Spring框架并没有对单例bean进行任何多线程的封装处理,如果这个bean有多种变化的话,就需要自行保证线程安全【PS:最浅显的解决方案:改变作用域为prototype】

【Spring框架中有哪些不同类型的事件】
- 1.上下文更新事件(ContextRefreshedEvent)
- 2.上下文开始事件(ContextStartedEvent)
- 3.上下文停止事件(ContextStoppedEvent)
- 4.上下文关闭事件(ContextClosedEvent)
- 5.请求处理事件(RequestHandledEvent)

【Spring 框架中都用到了哪些设计模式?】
- 【代理模式】
- AOP remoting
- 【单例模式】
- spring配置文件中定义的bean默认为单例模式
- 【模板方法】
- 用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate
- 【前端控制器】
- Spring提供了DispatcherServlet来对请求进行分发
- 【视图帮助】
- Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
- 【依赖注入】
- 贯穿于BeanFactory / ApplicationContext接口的核心理念
- 【工厂模式】
- BeanFactory用来创建对象的实例

spring MVC

  • 【特点】
  • 1.基于组件技术【控制器,视图和业务对象】
  • 2.不依赖于servlet API
  • 3.可以使用各种视图技术
  • 4.支持各种请求资源的策略
  • 5.易于扩展

  • 【SpringMVC的工作流程】

    1. 用户发送请求至前端控制器DispatcherServlet
    1. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
    1. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
    1. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
    1. 执行处理器(Controller,也叫后端控制器)。
    1. Controller执行完成返回ModelAndView
    1. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
    1. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
    1. ViewReslover解析后返回具体View
    1. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
    1. DispatcherServlet响应用户
  • 【strust2和springMVC的区别】

  • 1.【springMVC】入口是servlet,【strust2】入口是filter
    1. 【springMVC】是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例。【strust2】基于类开发,传递参数是通过类的属性,只能设计为多例。
  • 3.Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

  • 【SSM优缺点】

    1. Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
    1. Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
    1. Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
  • 【Mybatis】

    1. mybatis配置
    1. SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
    1. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
    1. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
    1. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
    1. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
    1. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
    1. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
    1. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

    多线程基础

    【进程】

  • 独立的运行环境,一个程序或应用。Java运行环境是一个包含了不同的类和程序的单一进程。
    【线程】
  • 进程的一个任务或轻量级的线程,少资源,共享进程的资源。
    【多线程的优点】
  • 1.提交程序的运行效率。
  • 2.不会因为某个线程而等待资源。
  • 3.servlets比CGI好,CGI不支持多线程。

【用户线程】
- Java程序中创建一个线程,它就被称为用户线程
- 没有用户线程,JVM关闭程序且退出。
【守护线程】
- 一个守护线程是在后台执行并且不会阻止JVM终止的线程
- 子线程仍是守护线程

【线程生命周期】
- Runnable,Waiting,Blocked,Dead

【线程的优先级】
- 线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级

【线程的join方法】
- 释放所有线程资源来执行当前调用这个方法的线程直到结束。

【线程之间的通信】
- Object类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态

【确保线程安全】
- 1.使用原子类(atomic concurrent classes)
- 2.实现并发锁
- 3.使用volatile关键字
- 4.使用不变类和线程安全类

【死锁】
- 两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源。

  • 参考链接

【数据结构和八大算法】
- 内部排序
- - 插入排序
- - - 直接插入排序
- - - 希尔排序
- - 选择排序
- - - 简单选择排序
- - - 堆排序
- - 交换排序
- - - 冒泡排序
- - - 快速排序
- - 归并排序
- - 基数排序
- 外部排序
- 八大排序算法参考链接

你可能感兴趣的:(java,面试基础)