面试遇到的一些题目

1、简述jdk中常见的集合。

2、由于第一个问题聊到了链表,所以让自己创建一个链表,实现链表的头插、尾插、头删、尾删、按下标插入、按下标删除、按下标插入。

3、顺便写出如何判断一个链表是否有环。

4、说说mysql的事务隔离级别。

(1)Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

(2)Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是mysql默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一条select语句可能返回不同结果。

(3)Repeatable Read(可重读)

这是mysql的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

(4)Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争,因此使用该隔离级别会造成数据库性能的显著下降。

5、在可重读的条件下,A事务先读一行数据,B事务再修改这行数据,A在读该行数据,问A前后两次数据是否一致。

简述

MySQL默认的事务隔离级别是可重复读,即:事务A在读到一条数据之后,此时事务B对该数据进行了修改操作并提交,那么事务A再读该数据,依然还是原来的内容。 额,MySQL可重复读是如何做到的?

其实使用的是一种叫MVCC的控制方式 ,即Mutil-Version Concurrency Control(多版本并发控制),类似于乐观锁的一种实现方式。

实现细节

InnoDB在每行记录后面保存两个隐藏的列,分别保存了这个行的创建时间(版本号)和行的删除时间(版本号)。这里存储的并不是实际的时间值,而是系统版本号,当数据被修改时,版本号加1。
在读取事务开始时,系统会给当前读事务一个版本号,然后,事务会读取版本号<=当前版本号的数据。
此时如果其他写事务修改了这条数据(增删改),那么这条数据的版本号就会加1,从而比当前事务的版本号高,所以,当前事务读取的并不是更新后的数据,而是当前事务对应版本下的数据。

案例分析

假设初始版本号为1。

insert

insert into user (id,name) values (1,'Tom');


下面模拟一下文章开头的场景:

select(事务A)

select * from user where id = 1;
此时读到的版本号为1

update(事务B)

update user set name = 'Jerry' where id = 1;
在更新操作的时候,该事务的版本号在原来的基础上加1,所以版本号为2。
先将要更新的这条数据标记为已删除,并且删除的版本号是当前事务的版本号,然后插入一行新的记录

select(事务A)

此时事务A再重新读数据:

select * from user where id = 1;
 由于事务A一直没提交,所以此时读到的版本号还是为1,所以读到的还是Tom这条数据,也就是可重复读

delete

delete from user where id = 1;
 在删除操作的时候,该事务的版本号在原来的基础上加1,所以版本号为3
删除时,将当前版本号作为删除版本号

6、继续5问,如果A第二次查询时,select * from user where id = 1 for update,前两两次数据是否一致。实践证明,不一致,第二次查询是事务B修改后的结果。

7、多线程相关知识点,比如线程池。

8、锁

java中的各种锁_xyzko1的博客-CSDN博客_java 锁

死锁的产生和回退。

9、String的底层实现,以及String是否有长度限制(有)(问到两次)

10、是否了解NIO

java之NIO简介_爱上口袋的天空的博客-CSDN博客_java nio

11、数据库相关的。外连接、内连接的区别

12、mysql有哪些引擎,区别。(两次)

对比InnoDB与MyISAM
1、 存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

2、 存储空间
MyISAM: MyISAM支持支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。当表在创建之后并导入数据之后,不会再进行修改操作,可以使用压缩表,极大的减少磁盘的空间占用。

InnoDB: 需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3、 可移植性、备份及恢复
MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

4、 事务支持
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

5、 AUTO_INCREMENT
MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。

InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

6、 表锁差异
MyISAM: 只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB: 支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

7、 全文索引
MyISAM:支持 FULLTEXT类型的全文索引

InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

8、表主键
MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

9、表的具体行数
MyISAM: 保存有表的总行数,如果select count() from table;会直接取出出该值。

InnoDB: 没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

10、CRUD操作
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。

11、 外键
MyISAM:不支持

InnoDB:支持

马尾:

什么是分布式锁

在分布式系统中,多个进程对同一种资源的访问,为了同步性必须对资源进行加锁,这种锁就是分布式锁。
为什么要用分布式锁不用本地锁? 

在分布式系统中,这个锁必须对各个进程可见,而本地锁只能对同一进程内的所有线程可见,故必须使用分布式锁不能使用本地锁。

为什么读多的时候使用乐观锁?

因为写的情况少,则比较等待的时间就少,效率就高,吞吐量就高。

马尾:
mysql索引的底层数据结构?主键索引和普通索引区别?Mysql最左匹配原则_Summersadness8的博客-CSDN博客_最左匹配原则

马尾:
lru了解吗,如果自己实现怎么实现

马尾:
java对象的创建方式有哪些?

1、使用新关键字

这是创建对象的最常见和常规的方法,也是一种非常简单的方法。通过使用此方法,我们可以调用要调用的任何构造函数(无参数的构造函数和参数化的)。

Employee emp1 = new Employee();

2.使用Class类的newInstance()方法

我们还可以使用Class类的newInstance()方法创建一个对象。此newInstance()方法调用no-arg构造函数来创建对象。

我们可以通过newInstance()通过以下方式创建对象:

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();

Or

Employee emp2 = Employee.class.newInstance();

3.使用构造方法类的newInstance()方法

与Class类的newInstance()方法类似,java.lang.reflect.Constructor类中有一个newInstance()方法可用于创建对象。我们还可以使用此newInstance()方法来调用参数化构造函数和私有构造函数。

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();

这两种newInstance()方法都被称为创建对象的反射方式。实际上,Class类的newInstance()方法在内部使用了Constructor类的newInstance()方法。这就是为什么最好使用后一种方法,并且也将其用于诸如Spring,Hibernate,Struts等不同框架的原因。要了解这两种newInstance()方法之间的区别,请阅读使用Example在Java中通过Reflection创建对象。

4.使用clone()方法:

每当我们在任何对象上调用clone()时,JVM实际上都会为我们创建一个新对象,并将先前对象的所有内容复制到其中。使用clone方法创建对象不会调用任何构造函数。

要在对象上使用clone()方法,我们需要实现Cloneable并在其中定义clone()方法。

·

Employee emp4 = (Employee) emp3.clone();

Java克隆是Java社区中最值得探讨的话题,它的确有其缺点,但是在对象完全满足Java克隆的强制条件之前,它仍然是创建任何对象的副本的最流行和最简单的方法。

5.使用反序列化

每当我们序列化然后反序列化一个对象时, JVM就会为我们创建一个单独的对象。在反序列化中,JVM不使用任何构造函数来创建对象。要反序列化对象,我们需要在类中实现Serializable接口。

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));Employee emp5 = (Employee) in.readObject();

马尾:
threadlocal是干嘛的,为什么它能实现线程独享

马尾:
事物失效知道吗

Spring事务失效的8种原因_circlw的博客-CSDN博客_事务失效

------2022-10-27----

final

异常有哪些,如何处理?

查找数组中最小的k个数 | 最小的k个数,最优时间复杂度是多少?

(由于一时没有想出解决思路,开始回答的时候想的是先排序,但知道肯定不是最优解,而且排序我也不清楚用什么排序方法好,然后面试官就直接问给出最优时间复杂度,我凭经验大概想了下可能是nlogk,他又问是怎么得出来的,当时我都不清楚具体要怎么做,所以也不知道怎么回他,他又问你知道什么是时间复杂度吗,知道怎么求吗?我说根据循环体语句的循环次数判断,可能说的也不很清除,磕磕巴巴说了半天,他直接来一句是我在问你,你要说出怎么来的,而不是你来问我。哎,当时我内心焦灼得都想自己关掉电脑了。最后还来了一句你的java是在培训班学的吗?)

查找数组中最小的k个数 | 最小的k个数_瘦弱的皮卡丘的博客-CSDN博客_给定一个数组,找出其中最小的k个数

了解Linux吗(不怎么了解)

如何查看SQL的执行计划(使用explain)

影响sql语句执行效率的因素或者说如何优化sql(这个没准备到,只是简单答了一下:可能)

执行SQL响应比较慢,你有哪些排查思路?_Tom弹架构的博客-CSDN博客_程序执行查询sql过慢

redis了解吗?rule脚本

git用过吗(回答用过)如何解决代码冲突。

sql注入

了解动态规划吗(回答了解过一点),好给你一个动态规划的题。(没做出来)写了半天,写了一个错误的思路,然后面试官看时间差不多了就直接说今天就先面到这里吧。

-------2022-10-28----

评价代码的几个指标

        可维护性、可读性、可扩展性

  jdk8的新特性

JDK8新特性详解_爱编程的大李子的博客-CSDN博客_jdk8新特性有哪些

拉姆达表达式如何保证对象的类型是匹配的

表达式类型的实现_Lambda表达式入门(下篇)_weixin_39683144的博客-CSDN博客

泛型(底层如何实现)

写出广度优先搜索

(了解哪些模式)写出单例模式

了解redis吗,适用场景,用在内存中会出现哪些问题。缓存穿透,缓存击穿,缓存雪崩详解_程序猿青石的博客-CSDN博客_缓存击穿 缓存穿透 缓存雪崩

函数式编程(Java 函数式编程_xuanxuan爱吃肉的博客-CSDN博客_java函数式编程

数据库如何选择索引

Mysql索引类型如何选择?_无敌浪浪的博客-CSDN博客

Spring常见面试题总结(超详细回答)_张维鹏的博客-CSDN博客_spring面试题(包括SpringMVC)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值