Java开发工程师面试总结

  • 1. Java基础
    • 1.1 接口与抽象类的区别
    • 1.2 重写与重载的区别
    • 1.3 集合
    • 1.4 多线程
    • 1.6 反射
  • 2. Spring框架
    • 2.1 IOC
    • 2.2 AOP
    • 2.3 事务
  • 3. Spring Cloud微服务
  • 4.MySQL数据库
    • 4.1 SQL调优
    • 4.2 数据库性能优化方案
    • 4.3 NoSQL的特性和使用场景
  • 5.分布式
    • 5.1 分布式缓存
    • 5.2 消息
    • 5.3 分布式锁
  • 6.大数据生态体系
    • 6.1 Flink

1. Java基础

1.1 接口与抽象类的区别

  1. 接口里必须是抽象方法,抽象类可以没有抽象方法;
  2. 接口可以继承多个父接口,抽象类只能被单继承;
  3. 接口里的变量必须被static,final修饰并初始化,抽象类里可以普通的成员变量;

1.2 重写与重载的区别

  1. 重载是表示一个类中可以有多个方法名相同,参数不同(参数个数,参数类型,参数顺序不同);
  2. 重写是子类对父类方法的一种重写, 访问权限不能是private的;

1.3 集合

Map和collection是所有集合的父接口;

  • Collection-set/List
  1. List-Vector,ArrayList,LinkedList 有序的,可以重复
  2. set-HashSet,TreeSet,LinkedHashSet 无序的,不可以重复
  • Map
  1. HashMap线程不同步,线程不安全,允许null作为key;
  2. HashTable使用了syschonized,线程安全,每次需要锁住整个结构,不允许null作为key;
  3. ConcurrentHashMap锁的粒度很细,分为16个桶,只锁当前用到的桶;

HashMap的底层原理:
Java8之前是数组+链表,Java8之后是数组+链表+红黑树;
数组中都是key-value的实例,java8之前叫entry,Java8之后叫node;
put的时候是通过key的hash值去计算index位置;
数组的长度是有限的,当hash值一样时,就有了链表;
扩容机制:负载因子是0.75f,创建新数组,长度为原来的2倍,重新计算hash值然后插入,长度扩大后,hash规则随之变化;
插入链表的方式Java8之前是头插法,Java8后是尾插法;头插会改变链表的顺序,尾插则不会,就不会出现链表成环的问题,死循环;
HashMap不能用在多线程中,底层代码get/put并没有加同步锁,线程不安全;
初始化长度为16,源代码中1<<4 为16;
Q:为啥我们重写equals方法的时候需要重写hashCode方法呢?用HashMap说明一下?
为重写equals方法时,我们用的object类的equals方法,比较的是两个对象的内存地址,计算key的hashCode值来定位index,当值相同时,利用equals方法判断是否相同,重写hashCode方法,保证相同的对象返回相同的hash值;
hash冲突,利用链表来解决,当碰撞发生时,对象会被存储在链表的下一节点;
原理是 首先当调用put方法时,用hashCode方法计算index(bucket桶)的位置来存储对象,获取对象时用equals方法找到正确的对象;

ConcurrentHashMap的实现原理:hashEntry用来封装表的键值对和segment可重入锁,每个segment保护一个HashEntry数组的元素;java7实行分段锁;java8采用table数组作为锁,对每一行进行加锁,数组,链表加红黑树(超过长度后就到红黑树)结构,采用Synchronize进行同步锁粒度降低和CAS

1.4 多线程

创建线程的方式

  • 继承Thread类
  • 实现Runnable接口,无返回结果
  • 实现Callable接口,有返回值

调用Thread.start()启动线程,run()执行线程的运行代码;

线程和进程的区别
进程是一个系统进行资源分配的独立单位
线程是进程的一个实体。一个进程可以有多个线程;

线程是怎样造成死锁的?

  • 一个资源每次只能被一个线程使用;
  • 线程已经获得的资源。在未使用完前,不能进行剥夺;
  • 线程在请求资源阻塞时,对已有的资源保持不放;
  • 若干线程循环等待资源关系;

如何避免死锁?
指定获取锁的顺序;只有获取A锁的线程才能获取B锁;

sleep()和wait()的区别?
sleep()是Thread类的方法,睡眠多少毫秒,线程阻塞,到时间会接触阻塞,阻塞时不会释放锁;
wait()是Object类的方法,必须与synchronized一起使用,线程阻塞时会释放互斥锁,notify()唤醒线程;

线程池
四种线程池

  • newFixedThreadPool 固定线程数目的
  • newCachedThreadPool 可缓存的
  • newSingleThreadPool 一个单线程的
  • newScheduledThreadPool 支持定时及周期性的任务执行的

创建线程池的方式
用Excutors类的四个方法,ExecutorService;
自己定义newThreadPoolExecutor;构造方法参数说明

  • corePoolSize 核心线程数
  • maximumPoolSize 线程池最大容纳线程数
  • keepAliveTime 非核心线程的闲置超时时间
  • unit 指定keepAliveTime 单位
  • workQueue 线程队列 linkedBlockingQueue Array…

ThreadFactoryBuilder;

保证多线程安全
使用安全类 java.util.concurrent下的原子类AtomicInteger
concurrentHashMap

1.6 反射

运行时可以获取类的信息(属性,构造器,方法,注解);运行时动态创建对象;

Class clazz = Class.forName(className)
Constuctor constructor = clazz.getConstuctor();
constructor.newInstance();
Class<> xxx = XX.class; 已经声明过类型;
Class<> xx = xx.getClass(); 获取该实例的对象
Class.forName() 通过全限定名来获取对象

场景
spring读取配置文件到容器
jdbc连接数据库驱动类时

2. Spring框架

2.1 IOC

2.2 AOP

2.3 事务

3. Spring Cloud微服务

4.MySQL数据库

4.1 SQL调优

创建索引,避免全表扫描,经常检索的字段创建索引;
避免在索引上使用计算;
使用表的别名
考虑创建中间表

4.2 数据库性能优化方案

  1. 代码层面的优化 ;
  2. 定位慢sql ,慢查询日志定位到出问题的sql,使用explain工具进行比对和调优;
  3. 合理使用索引,可以使用的操作符 between, in, >,like不以%开头,不能用的操作符 not in, like以%开头;
  4. 容易导致索引失效 ,避免使用or来连接,不做列运算
  5. 数据超百万可能需要分库分表;
  6. 缓存查询,先到缓存查询,再到数据库查询;

4.3 NoSQL的特性和使用场景

对exception做的监控系统,如果在应用系统发生严重故障的时候,可能会短时间产生大量exception数据,这个时候如果选用MySQL,会造成MySQL的瞬间写压力飙升,容易导致MySQL服务器的性能急剧恶化以及主从同步延迟之类的问题,这种场景就比较适合用Hbase类似的NoSQL来存储。

5.分布式

5.1 分布式缓存

静态RAM加速,通过内存或其他高速存储来加速;
缓存更新模式

  • Cache aside 缓存读取失败,查询db,写入缓存;更新:直接更新到DB;
  • read/write through 读取写入都是用了缓存存储;
  • write behind caching 这种模式下所有的操作都走缓存,缓存里的数据再通过异步的方式同步到数据库里面。所以系统的写性能能够大大提升了。

缓存失效策略

  • 主动失效 系统自带主动检查是否失效的机制
  • 被动失效 通过访问缓存对象才去检查是否失效

缓存淘汰策略

  • FIFO 先进先出
  • LRU 最近最久没有使用
  • LFU 最近最少使用

分布式缓存常见问题

  • 缓存穿透 db中不存在数据,穿过缓存查db,网络攻击;
    解决:包装对象;
  • 缓存击穿 在缓存失效的时候,大量的请求,造成db压力瞬间过大;
    解决:在查询db前,使用分布式锁锁住服务;
  • 缓存雪崩 大部分缓存同时失效,造成服务器性能急剧下降;
    解决:失效时间为基本时间+随机时间;

5.2 消息

5.3 分布式锁

6.大数据生态体系

6.1 Flink

Java开发工程师面试总结相关推荐

  1. Java开发工程师面试经验总集

    置顶个交流群 文章觉得海星的话,可以来群里找桃子交流技术或者普通乱聊= = 挂群:820080257 文档链接:[腾讯文档]Java开发工程师 https://docs.qq.com/doc/DQlZ ...

  2. Java开发工程师面试三分钟自我介绍

    大家好,我是一名Java开发工程师,拥有三年的工作经验.在这三年里,我主要负责后端开发工作,熟练使用Java.Spring框架等技术.此外,我也积极学习新技术,并在实际项目中运用.我认为自己具有良好的 ...

  3. Java程序员春招三面蚂蚁金服,1-3年Java开发工程师面试经验分享

    前言 为什么互联网资讯这么发达,但是没有出现技术人才井喷? 为什么会出现应届生薪资倒挂多年老员工的现象? 这个世界有太多的现象都可以用**"二八定律"**来解释. 20%拿着高工资 ...

  4. java开发工程师面试经历

    实习生面试公司 小肚皮App(失败) 面试步骤 : 笔试和技术面试 面试经历 : 首先是上机测试, 总共有三个编程题, 都是和二维数组相关的, 随机取出二维数组总的数, 不可以重复. 我没有写出来,由 ...

  5. 华为mysql面试题_华为JAVA开发工程师面试经验

    面试过程: 一面:1 自我介绍 2 对软件测试的了解 3 写代码判断一个数是否是回文 4 如果开发人员不认为你说的是bug怎么办 5 你在项目中扮演的什么角色 ,用什么语言 6 测鼠标 7 了解网络通 ...

  6. java开发工程师面试问题,java面试题大汇总小山博客

    开头 学习如逆水行舟,尤其是IT行业有着日新月异的节奏. 而且现在这个浮躁而又拜金的社会,我相信很多人做技术并非出于热爱,只是被互联网的高薪吸引,毕竟技术岗位非常枯燥,不仅要面对奇奇怪怪的需求,还要不 ...

  7. 润科通用 Java开发工程师 面试

    2022.07.30 网申 2022.08.19 测评,邮件通知第二天面试 2022.08.20 技术面,一对一,腾讯会议20min 自我介绍 介绍项目(设计,开发,技术栈) 项目数据库表设计? 前端 ...

  8. 蘑菇街java面试题_【蘑菇街Java开发工程师面试的问题会有哪些?】-看准网

    面试官是个女生,hr打电话来两天后就开始电话面试了.自我介绍 :大三学生,学习了一年iOS,自己做了两个项目,天气和微博,swift和OC都写. 蘑菇街面经一面: 1,如何用实现微信两人之间发送消息? ...

  9. Java开发工程师面试-基础

    文章目录 JDK.JRE.JVM有什么区别? 常用数字类型的区别 写出程序执行结果,并说明原因 编程题:随机生成30~100之间的整 面向对象的三大特征 接口和抽象类的异同 静态和实例变量(方法)的区 ...

最新文章

  1. 负载均衡算法-最少连接数均衡
  2. java 位掩码_Java位掩码控制权限与()或(|)非(~)、的介绍
  3. 服务器错误重启mysql错误信息,mysql开启和使用事件、与服务器重启mysql错误
  4. 线程同步synchronized理解
  5. 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
  6. SQL Sever中SQL语句语法,适合初学者使用
  7. MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)
  8. Java基础学习总结(93)——Java编码规范之代码性能及惯例
  9. Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(流程图或活动图)...
  10. 深度学习花书-3.8 期望、方差与协方差
  11. div+css强制(不)换行 .
  12. 算法:特殊二维数组查询key值是否存在
  13. HandlerSocket + MySQL
  14. cmd net use 命令
  15. 欧路词典如何导入html,[转载]如何用欧路词典背单词?
  16. 服务器获取请求ip地址
  17. day02-2学习过程笔记
  18. linux nfs 测试 读写,部署NFS与测试NFS
  19. 194.Vue.js智能扫码点餐系统(二十八)【支付宝支付流程、Nodejs支付源码解析、 实现支付功能(支付宝支付)】2019.04.01
  20. 7z001怎么解压在安卓手机上面_安卓手机怎么可以远程阿里云服务器桌面

热门文章

  1. UVA1149 装箱 Bin Packing 题解
  2. python内置库求复数的辐角_根据下列选项,回答 30~34 题: A.杜仲B.黄柏C.厚朴D.肉桂E.牡丹皮 第 30 题 断面较平坦,粉...
  3. $size 和$bits 的区别
  4. 金融业运维体系指南-嘉为蓝鲸
  5. 《Python编程:从入门到实践》读书笔记——第6章:字典
  6. 为什么腾讯微云上传文件会显示服务器繁忙呢,API - 微云
  7. mysql 半同步 原理_MySQL半同步复制原理与配置详解
  8. 未来5年光通信系统十大技术趋势发布
  9. C语言猜数字游戏(详解)
  10. 数学建模笔记-第十四讲-主成分分析