Java面试题精选

jdk
┌──────────────┬───────────────────────────────────────────────────────┐
│ │ │
├──────────────┼───────────────────────────────────────────────────────┤
│ │ │
├──────────────┼──────────┤
│ │
├──────────────┴──────────┘
┏━━┳━━━┓
┃ ┃ ┃
┣━━╋━━━┫
┗━━┻━━━┛

1. JDK 和 JRE 的区别
JDK: Java Development Kit 的简称, 提供了 Java 的开发环境和运行环境.
JRE: Java Runtime Environment 的简称, Java 运行环境, 为 Java 的运行提供所需环境.
具体来说: JDK 包含了 JRE, 同时包含了编译 Java 源码的编译器 Javac, 还包含了很多 Java 程序调试和分析的工具.
简单来说: 如果只要运行 Java 程序, 只需要安装 JRE 就可以了. 如果还需要编写 Java 程序, 就需要安装 JDK.

2. == 和 equals 的比较
== 对于基本类型是比较值, 对于引用类型是比较引用.
equals 默认情况是比较引用, 但是很多类重写了 equals 方法, 如 String、Integer 重写成了值比较.

7. String、StringBuffer 和 StringBuilder 的区别
┌──────────────┬──────────────────────────────────────────┐
│String │ 不可变的对象. 每次操作都会生成新的 │
├──────────────┼──────────────────────────────────────────┤
│StringBuffer │ 非线程安全的, 单线程使用. │
├──────────────┼──────────────────────────────────────────┤
│StringBuilder │ 线程安全, 多线程使用. │
└──────────────┴──────────────────────────────────────────┘

10. String 类的常用方法
┌──────────────┬────────────────────────┐
│ indexOf() │ 返回字符索引
├──────────────┼────────────────────────┤
│ charAt() │ 返回索引处字符
├──────────────┼────────────────────────┤
│ replace() │ 字符串替换
├──────────────┼────────────────────────┤
│ trim() │ 去除字符串两段空白
├──────────────┼────────────────────────┤
│ split() │ 分隔字符串成数组
├──────────────┼────────────────────────┤
│ getBytes() │ 返回字符串的byte数组
├──────────────┼────────────────────────┤
│ length() │
├──────────────┼────────────────────────┤
│ toLowerCase()│ 转小写字母
├──────────────┼────────────────────────┤
│ toUpperCase()│ 转大写
├──────────────┼────────────────────────┤
│ subString() │ 截取字符串
├──────────────┼────────────────────────┤
│ equals() │ 值比较(已重写)
└──────────────┴────────────────────────┘

31. 迭代器
迭代器接口提供遍历任何 Collection 的接口. 迭代器允许调用者在迭代过程中移除元素.

35. 并行(Parallel) 和 并发(Concurrent)
┌──────────────┬─────────────────────────────────────────────────┐
│Parallel │ 多个处理器或多核同时处理多个任务
├──────────────┼─────────────────────────────────────────────────┤
│Concurrent │ 多个人物在同一个 Cpu 核上, 按细分的时间片轮流交替执行.
└──────────────┴─────────────────────────────────────────────────┘

114. ORM
ORM(Object Relation Mapping) 对象关系映射, 把数据库中的关系数据映射称为程序中的对象.

167. ACID
┌───────────────────────────────────────────────────────────────────────────────────────┐
│ Atomicity 原子性; 一个事务 如果过程中发生错误, 会 整个回滚(Rollback), 就像没有执行过一样.
├───────────────────────────────────────────────────────────────────────────────────────┤
│ Consittency 一致性; 在事务结束后, 数据库的完整性没有被破坏. 写入的数据完全符合所有的约束、触发器、级联回滚等
├───────────────────────────────────────────────────────────────────────────────────────┤
│Isolation 隔离性; 数据库允许多个并发事务同时对其数据进行读写和修改的能力, 隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致. 事务隔离可以分为不同级别: 读未提交、读提交、可重复读和串行化
├───────────────────────────────────────────────────────────────────────────────────────┤
│Durability 持久性
└───────────────────────────────────────────────────────────────────────────────────────┘

173. 事务隔离级别
配置在 mysql.ini中
┌──────────────────────────────────────────┐
│transaciton-isolation = REPEATABLE-READ │
└──────────────────────────────────────────┘
可配置的值:
a) READ-UNCOMMITTED 未提交读; 最低隔离级别,事务未提交前,就可以被其他事务读取(会出现幻读、脏读、不可重复读)
b) READ-COMMITTED 提交读; 一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)
c) REPEATEABLE-READ 可重复读; [默认级别]保证多次读同一个数据时, 其值和事务开始时的内容是一致的,禁止读取别的事务未提交的数据(会造成幻读)
d) SERIALIZABLE 序列化; 代价最高的最安全的隔离级别,可以防止脏读、不可重复读、幻读

脏读: 一个事务能够读取到另一个事务中还未提交的数据. 比如,某个事务尝试插入数据A, 此时该事务还未提交,然后另一个事务读取到了这个记录A.
不可重复读: 同一个事务内,多次读取同一条数据,而每次读取到的值可能不同.
幻读: 一个事务内同样的读取条件,读取到的数据个数不一样,原因是被另一个事务删除或新增了符合条件的数据.
更多 https://www.cnblogs.com/balfish/p/8298296.html

174. MySql中的引擎
a) InnoDB: 提供了对 ACID 事务的支持, 还提供了行级锁和外键约束.
由于锁的粒度小, 写操作不会锁定全表,所以在并发高的场景下会提升效率.
b) MyIASM: mysql的默认引擎,不提供事务的支持也不支持行级锁和外键.
插入和更新操作时会锁定整个表,所以会导致效率降低.
如果表的读操作远远多于写操作时,并且不需要事务支持时可以优先选择 MyIASM.

175. MySQL 的表级锁和行级锁
MyIASM 只支持表锁, InnoDB 支持表锁和行锁,默认为行锁.
a) 表级锁: 开销小,加锁快,不会出现死锁.锁的粒度大,发生锁冲突的概率最高,并发量最低.
b) 行级锁: 开销大,加锁慢,会出现死锁.锁的粒度笑,发生锁冲突的概率小,并发读最高.

176. 乐观锁和悲观锁
a)乐观锁:
每次拿数据的时候都认为别人不会修改,所以不会上锁,但提交更新的时候会判断一下期间有没有人更新这个数据.
数据库的乐观锁需要自己实现一下,在表字段中加一个version字段,每次修改成功增加1,每次修改的时候对比一下之前的version和现在的version是否一致,如果不一致就不修改了,这就是乐观锁.
b)悲观锁:
每次拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会被阻止,直到这个锁被释放.

177. MySql 问题排查
a) 使用 show processlist 命令查看当前所有的连接信息
b) 使用 explain 命令查看 sql语句的执行计划
c) 开启慢查询日志

178. MySql 性能优化
a)为搜索字段创建索引
b)避免使用 select *,列出要查询的字段
c)垂直分割分表
d)选择正确的存储引擎

179. Redis 使用场景
a)记录帖子点赞数、点击数、评论数
b)缓存近期热帖
c)缓存文章详情信息
d)记录用户会话信息

180. Redis 常用功能
a)数据缓存
b)分布式锁
c)支持数据持久化
d)支持事务
e)支持消息队列

181. Redis和 MemCache的区别
a)存储方式不同:
MemCache把数据全部存在内存中,断电后会挂掉;
MemCache数据不能超过内存大小;
Redis 有部分存储在硬盘中,能保证数据的持久性.
b)数据支持类型:
MemCache对数据类型的支持相对简单;
Rdies支持的数据类型要多得多.
c)底层模型不同
d)value值大小:Redis最大可以达到1Gb; MemCache只有1Mb;

183. Redis 中的缓存穿透
a)缓存穿透:
指查询一个一定不存在的数据,由于缓存中找不到时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中查询,造成数据库的鸭梨.
比如:查询 id 为-1的,id不会有为-1的记录.
b)解决方案:如果查询结果为空,也放入缓存中,只不过设定的缓存过期时间较短,比如设置为60秒.

183-2. Redis 中的缓存雪崩
指在某一个时间段时,缓存集中过期失效.
栗子一:
双十一零点,发生了一波抢购,在短时间内集中的把商品数据放入了缓存,并设置缓存过期时间为1小时.
凌晨一点的时候,这批商品数据就过期了,访问查询就落到了数据库上.
解决方案: 不同类商品设置不同的缓存周期.同类商品加上随机因子.这样可以尽可能的分散缓存过期时间.
栗子二:
比较致命的缓存雪崩是缓存服务器某个节点宕机或断网.对数据库造成的压力是不可预知的,很可能瞬间把数据库拖垮.

183-3. Redis 中的缓存击穿
指某一个 key 非常热点,不停的有人访问这条数据,在这个 key 过期的瞬间会击破缓存,直接请求数据库.
解决方案:
让这条缓存永不过期??

183-4. GoLang 中使用 Redis

184. Redis 支持的数据类型
string、list、hash(字典)、set(集合)、zset(sorted set -- 有续集合)
这些数据类型都支持push/pop、add/remove及取交集并集差集等操作,而且这些操作都是原子性的.

185. 保持 Redis 缓存和数据库数据一致
a)合理设置缓存的过期时间
b)新增、更改、删除数据库操作时同步更新 Redis,可使用事务机制来保持数据的一致性

186. Redis 持久化
Redis 的持久化有两种策略:
a)RDB(Redis Database) 指定的时间间隔对数据进行快照存储.
b)AOF(Append Only File) 每收到一个写命令都通过 write 函数追加到文件中.

189. Redis 实现分布式锁

原文地址:https://www.cnblogs.com/sweetXiaoma/p/10656691.html

时间: 2024-08-30 16:41:36

Java面试题精选的相关文章

阿里、华为、腾讯Java技术面试题精选

JVM的类加载机制是什么?有哪些实现方式?类加载机制: 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法去内,然后在堆区创建一个java.lang.Class对象,用来封装在方法区内的数据结构.类的加载最终是在堆区内的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 如果你也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪.我

从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)

本篇的面试题是接之前读者的要求,发出来的. 首先,声明下,以下知识点并非全部来自BAT的面试题. 如果觉得在本文中笔者总结的内容能对你有所帮助,可以点赞关注一下. 本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进行详细的剖析与解答. 基础篇 基本功 1.面向对象的特征 2.final, finally, finalize 的区别 3.int 和 Integer 有什么区别 4.重载和重写的区别 5.抽象类和接口有什么区别 6.说说反射的用途及实现 7.说说自定义注解的场景及实现

Java面试题精选,大型网站系统架构你不得不懂的10个问题

作者:JavaGuide(公众号) 下面这些问题都是一线大厂的真实面试问题,不论是对你面试还是说拓宽知识面都很有帮助.之前发过一篇8 张图读懂大型网站技术架构 可以作为不太了解大型网站系统技术架构朋友的入门文章. 文章目录1. 你使用过哪些组件或者方法来提升网站性能,可用性以及并发量2. 设计高可用系统的常用手段3. 现代互联网应用系统通常具有哪些特点?4. 谈谈你对微服务领域的了解和认识5. 谈谈你对 Dubbo 和 Spring Cloud 的认识(两者关系)6. 性能测试了解吗?说说你知道

精选30道Java笔试题解答

个人觉得整理的超级好的Java笔试题,原文请见 http://blog.csdn.net/lanxuezaipiao/article/details/16753743 1. 下面哪些是Thread类的方法() A start()       B run()       C exit()       D getPriority() 答案:ABD 解析:看Java API docs吧:http://docs.oracle.com/javase/7/docs/api/,exit()是System类的方

java面试题大合集(开发者必看)

前言 本文来自百度网络的一篇文章,由于没有答案,现在整理了一些比较好的回答和好的博客,可以自己扩展思路,如果大家有一下面试题的更好的答案,欢迎在评论区留言.以上全部来自网络!此外,我的微信公众号将每日分享下面面试题相关的知识点总结干货,欢迎关注微信公众号:好好学java! 文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 基本概念 1.操作系统中 heap 和 stack 的区别 堆:堆空间一般由程序员来分配,可以由垃圾回收机制来回收.一般

金三银四,磨砺锋芒;剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)下

金三银四,磨砺锋芒:剑指大厂,扬帆起航(2020年最全大厂WEB前端面试题精选)下 引言 元旦匆匆而过,2020年的春节又接踵而来,大家除了忙的提着裤子加班.年底冲冲冲外,还有着对于明年的迷茫和期待!2019年有多少苦涩心酸,2020年就有更多幸福美好,加油,奥利给!怀着一颗积极向上的心,来面对未来每一天的挑战! 所谓"兵马未动,粮草先行",我们打响明天的战役也需要精神食粮来做后勤保障才是.在此我整理了多位从业者和我在2019年底至2020年初的一厂面试精选题,希望对磨砺锋芒.奋发向上

Java面试题全集(中)

这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet. 补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程

Java面试题下

这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题,如果需要了解相关内容,可以参考我的另一篇文章<Java面试题集(86-115)>.此外,这篇文章还对企业应用架构.大型网站架构和应用服务器优化等内容进行了简单的探讨,这些内容相信对面试会很有帮助. 126.什么是ORM?答:对象关系映射(Object-Relational Mapping,简称OR

java面试题及答案

JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派