三年java经验面试总结,整理了一些java面试题供参考

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 此内容偏中高级,适合有三年或以上经验者。java中wait和sleep有什么区别?多线程条件下如何保证数据安全?答:最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交,互,sleep通常被用于暂停执行。

QQ_20190725152055

此内容偏中高级,适合有三年或以上经验者。

  1. java中wait和sleep有什么区别?多线程条件下如何保证数据安全?

答:最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交,互,sleep通常被用于暂停执行。

  1. java中volatile和synchronized有什么区别?

1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
3.volatile仅能实现变量的修改可见性,并不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

  1. 有了解java的原子类?实现原理是什么?

答:采用硬件提供原子操作指令实现的,即CAS。每次调用都会先判断预期的值是否符合,才进行写操作,保证数据安全。

  1. spring主要使用了哪些?IOC实现原理是什么?AOP实现原理是什么?

答:spring主要功能有IOC,AOP,MVC等,IOC实现原理:先反射生成实例,然后调用时主动注入。AOP原理:主要使用java动态代理,

  1. mybatis有了解吗?它与hibernate有什么区别?项目中,你会选哪个?

答:两者都是轻量级ORM框架,hibernate实现功能比较多,通过HQL操作数据库,比较简单方便,但hibernate自动生成的sql相长,不利测试和查找原因。复杂sql时,编写比较困难,同时性能也会降低。mybatis是半自动化,手动编写SQL语句,同时提供丰富的参数判断功能。sql语句较清晰,可以直接进行测试,性能也较好,操作起来非常简单。同时hibernate容易产生n+1问题。hibernate学习成本较mybatis高。国内一些大公司基本上使用mybatis

  1. 缓存框架有使用过哪些?memcache和redis有什么区别?项目中,怎么去选择?

答:缓存有:ehcache,memcache和redis等

区别:

1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过 memcache还可用于缓存其他东西,例如图片、视频等等。
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的 存储。
3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通 过例如expire 设定,例如expire name 10
5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都 可以一主一从
6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)
7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复
8、Redis支持数据的备份,即master-slave模式的数据备份。
项目使用选择:

redis是单线程实现,若需要使用控制某些并发状态时,可以使用redis.项目中需要使用 复杂的list,set操作时,同时可以对数据进行持久化。

当存储数据较大时,如100k以上,那memcache性能较好,在多核上,memcache较 好

  1. 说说数据库性能优化有哪些方法?

答:使用explain进行优化,查看sql是否充分使用索引。避免使用in,用exist替代,字段值尽可能使用更小的值,任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。使用连接查询(join)代替子查询。

在表的多列字段上建立一个索引,但只有在查询这些字段的第一个字段时,索引才会被使用。

  1. HTTP请求方法get和post有什么区别?

1:Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。

2:Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度限制,只能 传递大约1024字节.

3:Post就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get 之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post 的信息作为http请求的内容,而Get是在Http头部传输的。

  1. linux命令熟悉?查看某个线程命令是什么?查看整个机器负载命令?文件内容快速查找命令是什么?

查看线程:ps -ef|greptomcat

查看负载:top

文件内容查找:vi /aa test.txt 或者先打开文件,再查找: vi test.txt /aa

  1. JVM内存模型是如何?垃圾回收机制有哪些?如何对JVM进行调优?

答:由栈和堆组成,栈是运行时单位,堆内存则分为年轻代、年老代、持久代等,年轻代中的对象经过几次的回收,仍然存在则被移到年老代;持久代主要是保存class,method,filed等对象。

sun回收机制:主要对年轻代和年老代中的存活对象进行回收,分为以下:

年轻代串行(Serial Copying)、年轻代并行(ParNew)、年老代串行(SerialMSC),年老代并行(Parallel Mark Sweep),年老代并发(Concurrent Mark-Sweep GC,即CMS)等等,目前CMS回收算法使用最广泛。

JVM调优主要是对堆内容和回收算法进行配置,需要对jdk产生的回收日志进行观察,同时通过工具(Jconsole,jProfile,VisualVM)对堆内存不断分析,这些优化是一个过程,需要不断地进行观察和维护。

  1. 如银行内部转账功能,如何保证数据一致性,即要么同时成功,要么同时失败?高并发时,又如何保证性能和数据正确?

答:如果是单机内完成这些操作,那使用数据库的事务,即可轻松实现。若是分布式呢?

  1. 有了解分布式事务如何实现?

答:分布式事务可以采用分布式锁进行实现,目前zookeeper就提供此锁;分布式锁需要牺牲一定性能去实现,若业务支付最终一致性,那此方法是最佳方案。如在京东下订单,过一会才会告诉你订单审核通过,而不是马上响应订单结果。

  1. java抽象类和接口有什么区别?项目中怎么去使用它们?

相同点:

A. 两者都是抽象类,都不能实例化。

B. interface实现类及abstractclass的子类都必须要实现已经声明的抽象方法。

不同点:

A. interface需要实现,要用implements,而abstractclass需要继承,要用extends。

B. 一个类可以实现多个interface,但一个类只能继承一个abstractclass。

C. interface强调特定功能的实现,而abstractclass强调所属关系。

D. 尽管interface实现类及abstrctclass的子类都必须要实现相应的抽象方法,但实现的 形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方 法体),实现类必须要实现。而abstractclass的子类可以有选择地实现。

使用:

abstract:在既需要统一的接口,又需要实例变量或缺省的方法的情况下,使用abstract;

interface:使用: 类与类之前需要特定的接口进行协调,而不在乎其如何实现。 作为能 够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。需要将一组类 视为单一的类,而调用者只通过接口来与这组类发生联系。需要实现特定的多项功能, 而这些功能之间可能完全没有任何联系。

  1. 对socket熟悉?TCP通讯有几次握手?有使用过哪些socket框架?

答:3次握手,客户端-->服务端,服务端-->客户端,客户端-->服务端,当这些过程完成之后,才真正建立起通信。java中比较有名的socket框架有:mina,netty,都是韩国小棒子写的。

  1. 了解java反射机制?反射生成类,能访问私有变量?

答:即动态生成java的实例,可以

  1. RPC是什么?有使用过哪些RPC框架?

答:即远程进程调用,本地机器调用远程的服务,在项目规模大到一定程度,需要使用RPC相关框架进行服务化部署。如:hessian 、webservice等

  1. 熟悉js或css?jquery如何绑定页面某元素的点击事件?

答:$("#btn").click(function(){

})

马上秋招要到来了,所以要抓紧提升下自己了,我整理很多面试专题都整理成了PDF,花了挺多时间的,大家记得给我点个关注哦,然后需要更多的面试题的话可以关注我的公众号 Java周某人 就可以免费领取拉,希望你们都可以拿到大厂的offer

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
存储 安全 Java
java基础面试题
java基础面试题
13 2
|
4天前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
20 1
|
5天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
20 2
|
9天前
|
缓存 安全 Java
三万字长文Java面试题——基础篇(注:该篇博客将会一直维护 最新维护时间:2024年9月18日)
本文是一篇全面的Java面试题指南,涵盖了Java基础、数据类型、面向对象、异常处理、IO流、反射、代理模式、泛型、枚举、Lambda表达式、Stream流等多个方面的知识点,并提供了详细的解析和代码示例。
36 0
三万字长文Java面试题——基础篇(注:该篇博客将会一直维护 最新维护时间:2024年9月18日)
|
3天前
|
XML Java 数据格式
Java正则表达式大全(参考)
Java正则表达式大全(参考)
|
9天前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
17 0
|
23天前
|
消息中间件 NoSQL Java
Java知识要点及面试题
该文档涵盖Java后端开发的关键知识点,包括Java基础、JVM、多线程、MySQL、Redis、Spring框架、Spring Cloud、Kafka及分布式系统设计。针对每个主题,文档列举了重要概念及面试常问问题,帮助读者全面掌握相关技术并准备面试。例如,Java基础部分涉及面向对象编程、数据类型、异常处理等;JVM部分则讲解内存结构、类加载机制及垃圾回收算法。此外,还介绍了多线程的生命周期、同步机制及线程池使用,数据库设计与优化,以及分布式系统中的微服务、RPC调用和负载均衡等。
|
5天前
|
监控 Java Linux
Java 性能调优:调整 GC 线程以获得最佳结果
Java 性能调优:调整 GC 线程以获得最佳结果
35 11
|
1天前
|
并行计算 Java 调度
深入理解Java中的多线程编程
【10月更文挑战第6天】 本文将探讨Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。通过详细的示例和解释,读者能够掌握如何在Java中有效地使用多线程来提高程序的性能和响应能力。
5 1
|
2天前
|
Java 开发者
在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选
【10月更文挑战第6天】在 Java 多线程编程中,Lock 接口正逐渐取代传统的 `synchronized` 关键字,成为高手们的首选。相比 `synchronized`,Lock 提供了更灵活强大的线程同步机制,包括可中断等待、超时等待、重入锁及读写锁等高级特性,极大提升了多线程应用的性能和可靠性。通过示例对比,可以看出 Lock 接口通过 `lock()` 和 `unlock()` 明确管理锁的获取和释放,避免死锁风险,并支持公平锁选择和条件变量,使其在高并发场景下更具优势。掌握 Lock 接口将助力开发者构建更高效、可靠的多线程应用。
8 2