跳槽者、应届生必看JAVA面试题系列 - JAVA基础知识(五)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 跳槽者、应届生必看JAVA面试题系列 - JAVA基础知识(五)

一: 前言

image.png

二: 面试挑战

 在文章开始前,首先安利下"面试挑战": 凡是满足下面的挑战条件的,如果一个月内没有拿到一个Offer的,免费提供简历封装建议和相关面试题目解答。


 如果面试通过的,可以截图分享领取奖励,让大家一起见证,具体条件如下:


 1、持续学习本人《面试大全》至少两个月且对其中的内容基本掌握的。


  2、计算机相关专业或者经过计算机相关专业的培训(不少于3个月,正常来说培训机构培训时间不会少于三个月),准备从事JAVA开发人员。


  3、 打算从事的工作是JAVA开发,年限是1-3年(大神的话就忽略我说的,可以直接退出了)或者是符合计算机相关专业,准备从学校出来就业的。


 4、需要提供相关面试证据或者是面试题目。


 如果大家对这个感兴趣的,可以关注【IT学习日记】回复【面试挑战】即可参与,现在参与还免费赠送一份面试资料。



三: JAVA基础知识(五)


一: 高并发情况下如何保证全局唯一ID的生成


 1、为何需要生成唯一ID



   随着业务量逐渐复杂,数量不断增大,项目不断分解拆分为分布式,很多业务场景需要有唯一标识字段来标识对应的数据,如美团、淘宝生成的订单,此时,分布式的唯一ID必不可缺。



 2、全局唯一ID必要要求



   唯一性: 能够在分布式情况下唯一表示一个数据



   趋势递增: 有序性可以有利于快速定位到数据,而且很多数据库底层索引是通过Btree实现,有序的数据能够保证写入的性能。



   安全性: 生成全局唯一ID的规则不能过于简单,防止恶意破坏者根据已知ID推算出其他ID,用于恶意使用。



 3、全局唯一ID系统生成可用性要求



 高可用: 在高并发情况下,唯一ID生成的成功率要大于99%,保证可用。



 高效率: 在高并发情况下,生成唯一ID的延迟不能太大。



 4、生成全局唯一ID方式



   1、UUID方式: 32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:110e8400-e29b-41d4-a716-446655440011。



   2、基于Redis方式: 通过INCR或者INCRBY命令来实现,以为Redis执行时单线程,天然保证了原子性。



   3、snowflake(雪花算法) :Twitter的分布式自增ID算法snowflake,Twitter的分布式自增ID算法snowflake,且生成的ID是根据时间有序的,SnowFlake 算法生成id的结果是一个64bit大小的整数, 为一个Long型(转换成字符串后长度最多19),分布式系统内不会产生ID碰撞(由datacenter和Iworkerld作区分)并且效率较高(图来源网络,侵删)

image.png

二: 为什么不推荐使用UUID作为数据表主键

  1、Mysql官方建议主键字段长度越短越好,UUID生成的全局ID长度为36个字符,不符合这一推荐,官方描述如下:

All indexes other than the clustered index are known as secondary
indexes. In InnoDB, each record in a secondary index contains the
primary key columns for the row, as well as the columns specified for
the secondary index. InnoDB uses this primary key value to search for
the row in the clustered index.*** If the primary key is long, the
secondary indexes use more space, so it is advantageous to have a
short primary key

2、Mysql 中索引的底层是B+树实现,但是UUID生成的全局ID是无序的,这样就要求每次插入数据都需要对索引进行重新的排序,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面,大大降低了写入数据的效率。



 3、InnoDB引擎使用聚集索引,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,这样查找时效率也更加高,因为范围查找是最常见的业务场景之一。




三: 创建类的有哪些方式


 1、使用new关键创建



 2、通过反射创建



 3、通过反序列化创建



 4、通过clone(克隆)方法创建




四: 如何看一个网络通不通


 方式一: ping ip地址/域名



 方式二: ssh ip地址 -p 端口号 -v



 方式三: telnet ip地址 端口号




五: 网络通了进程也运行着 但是访问不到可能是什么原因


 1、防火墙限制



 2、端口未开放



 3、主机被加入了黑名单




六: 从前后台描述下你如何将一个数据插入到数据库中


 回答思路:



   这种的题目主要是考察你是否对开发的流程掌握,可以直接使用创建账号案例来举例即可。



 案例:



   用创建账号为例子,前端将用户填写在表单的数据转换成json,然后通过ajax指定请求地址,发起请求,后端在control层接受前台传递的参数,转发到Service层,在Service做参数校验,不符合则直接返回错误提示,符合则将数据封装成对应的实体,传递到Dao层,Dao调用对应的持久层框架API,将数据存储到数据库中。





七: 你们的事务是放在那里,怎么使用


 回答思路:



   考官主要考察你实际项目中是否有接触过事务,使用事务之前是否了解事务的相关知识,所以,只需要往这两个方向回答就可以,最好可以举例一些特殊的情况,如使用声明式事务失效等



 使用场景:



   1、有多个对数据库操作的业务中



   2、且这多个操作需要保证原子性,要么所有业务都成功,要么所有业务都失败。



 使用方式:



   1、声明式事务: 使用Transactional注解,特点,侵入性小,使用简单



   2、编程式事务:



   特点:



   侵入性强,但是可用控制的颗粒度更小,适用的场景更多如多线程场景下



   使用方式代码如下:

@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;
 //手动开启事务
transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
//手动提交事务
dataSourceTransactionManager.commit(transactionStatus);
//手动回滚
dataSourceTransactionManager.rollback(transactionStatus);

八: Transactional注解失效的场景有哪些


 

 Transactional 可以作用在接口、类、类方法。



 作用于类:当把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性信息。



 作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。



 作用于接口:不推荐这种使用方法,因为一旦标注在Interface上并且配置了Spring AOP 使用CGLib动态代理,将会导致@Transactional注解失效



 失效场景:



 1、如果Transactional注解应用在非public 修饰的方法上,Transactional将会失效。



 2、Transactional 注解属性 propagation 设置错误这种失效是由于配置错误,若是错误的配置以下三种 propagation,事务将不会发生回滚。



 TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。



 TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。



 TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。



 3、rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。



 4、同一个类中方法调用,导致@Transactional失效。因为Transactional是基于AOP实现的,它的功能实际上是生成的代理对象去实现,所以,同一个类中的方法调用,实际上默认是this,即当前类调用,不是生成的代理类调用,所以无效



 5、手动使用了try…catch捕获异常,此时也不会生效



 6、数据库引擎不支持事务。事务能否生效数据库引擎是否支持事务是关键。常用的MySQL数据库默认使用支持事务的innodb引擎。一旦数据库引擎切换成不支持事务的myisam,那事务就从根本上失效了。



 7、类没有被 Spring 管理,此时即使方法添加了Transactional也无法生效



 8、多数据源时,数据源没有配置事务管理器也不会生效。



 Spring Boot本身并不管理事务,只是提供了 PlatformTransactionManager 接口来供持久层实现来达到事务的管理,Spring Boot 默认使用JDBC来控制事务。

如果是多数据源的话,需要对每个数据源配置事务管理器,步骤如下(图来源网络,侵删):

image.png

九: 集中式和分布式的特点


 集中式:



   就是一个项目就是一个独立的应用,这个项目中包含了各个子模块,比如,邮件功能、文件上传功能等等。最多也就是多部署几个服务器,前面挡上负载均衡来平衡系统负载。



 缺点:不易拓展、更新一个功能就需要重新部署整个项目。 一个子模块出问题就可能影响整个系统的。



 优点:对于开发、测试、运维会比较方便,不用考虑复杂的分布式环境。



 分布式:



   也就是 若干个 独立功能的计算机的组合,通常做法就是针对一个系统,将系统中的各个业务模块分离开来分别部署到不同的计算机上,来配合工作使系统正常运转的一种系统部署方式,如果某个业务模块负载较高那么就增 加服务器并挡上负载均衡来缓解压力,但多个服务器仍然是只提供一个业务模块的功能。 但是对于用户是感觉不到的。



 缺点: 对于开发、测试、运维 要考虑复杂的分布式环境,比如分布式事务、分布式锁等。



 优点: 项目的各功能模块独立分开,一个模块更新不影响其他模块。



十: 静态代码块、构造代码块和构造函数的区别


 静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。



 构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。



 构造函数: 给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。



 创建对象时,三者被加载执行顺序:静态代码块—>构造代码块—>构造函数



四: 总结


 由于文章篇幅的限制,面试大全的第五章暂时到这里就告一段落。如果有意见或者建议,可以在下方或者私信留言,看到会及时回复,也欢迎大家参加面试挑战和面试题投稿,希望大家早日获得心仪的Offer,如果觉得文字对你有帮助,欢迎关注和点赞。



 面试大全系列文章会保持稳定的更新速度,大概每周两更到三更,感兴趣和可以关注我。



 如果想参加面试挑战,可以私信回复【面试挑战】即可,如果想进行面试题目投稿,可以私信回复【面试题目投稿】即可,如果想获取更多面试问题和资料,查看最新的面试题目更新进度,可以关注我,私信【面试资料】即可,谢谢大家的阅读和关注。



五: 热门推荐


 1、跳槽者、应届生必看JAVA面试题系列(一)



 2、跳槽者、应届生必看JAVA面试题系列(二)



 3、跳槽者、应届生必看JAVA面试题系列(三)



 4、跳槽者、应届生必看JAVA面试题系列(四)



 5、面试宝典(一) - 让你不再错过“金九银十“的求职浪潮之简历包装篇



 6、轻松写出优雅的Restful风格API


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
60 2
|
3月前
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
3月前
|
Java
【Java基础面试四】、介绍一下Java的数据类型
这篇文章介绍了Java的数据类型,包括8种基本数据类型(整数、浮点、字符、布尔)和3类引用数据类型(数组、类、接口),并提供了基本数据类型所占内存空间和数据范围的详细信息。
|
3月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
40 0
|
12天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
410 37
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
19 1
|
1月前
|
Oracle Java 关系型数据库
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
缓存 安全 Java
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
Java的特点和优点,、Java 8的新特性、面向对象、基本数据类型和引用类型、自动拆装箱与自动装箱、==与equals()的区别、为什么重写equals()就要重写hashcode()、抽象类和接口的区别、重载和重写的区别、四种引用方式、wt()和sleep()的区别、java方法是值传递还是引用传递?访问修饰符、static、final、this和super、volatile的用法及原理
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)