面试记录:

本文详细介绍了Java的基本数据类型、Map的不同实现及其用途,JVM内存模型,反射的应用场景,SpringBoot中的Bean和自动装配,以及JDBC、MySQL、Redis、MyBatis和Linux命令的基础知识。
摘要由CSDN通过智能技术生成

Java基础:

1.基本数据类型:

byte  short int float double long char string boolean

2.Map的类型:
  1. HashMap   最常用的Map类型,数组+链表+红黑树的数据结构,但是线程不安全
  2. LinkedHashMap  HashMap的子类,内部维护了一个双向链表,保存了插入顺序
  3. TreeMap  有序的,实现了sortMap接口,能进行排序,遍历的数据是排过序的,底层是红黑树
  4. HashTable  (基本淘汰,不建议使用)虽然线程安全,使用了大量的同步锁,但是也导致执行效率极低,不建议使用
  5. ConcurrentHashMap  线程安全,JDK1.7 以segment大数组+小数组的形式,segment本身使用了Reetrantlock锁的重入锁,多线程访问时只能有一个进行操作,从而保证了数据安全。JDK1.8 对链表头结点加锁,从而保证了线程安全
3.JVM内存模型(晕菜,这个没有还好看,说了个大概)

JVM内存模型主要包括:堆,栈,方法区,程序计数器。

  • 堆:主要存放的对象实例,其中也包括字符串常量池。
  • 栈:主要存放了对象实例的引用,和执行方法的执行信息。
  • 方法区:存放了类编译后的信息,运行时常量池等编译后的信息。
  • 程序计数器:存放了各个线程的字节码执行行数。
4.什么是反射,什么时候用反射(这个真的忘了)

反射就是把类中的各个成分映射成对象。

场景:

创建JDBC连接,会直接使用Class.forName()创建驱动。

Spring的依赖注入,通过Java的反射机制创建所有需要的Bean,并将它们存储在Spring容器中

5.Spring中的Bean有用过吗,什么是JavaBean?(这个真的忘了)

JavaBean实际上是一种特殊的Java类,通过封装属性,方法等成为具有某个功能或者处理某种业务的对象。

主要是:代码重复利用

        编写简单,维护简单,使用简单

        基于Java,适用于跨平台。

6.如何通过JDBC创建数据库连接进行数据查询?

①使用反射的方法加载JDBC的驱动jar包  Class.forName("xx.xx.driver")

②使用driverManager创建Connection数据库连接

③通过数据库连接创建Statement语句,然后进行语句执行execute。

⑤通过ResultSet获取查询的结果集,通过.next方法进行结果的遍历。

7.SpringBoot和SpringMVC有什么不同?
8.SpringBoot的自动装配原理。

首先SpringBoot的启动类上会有一个注解@SpringBootApplication,这是个复合注解,点击进去后会发现有三个重点注解,@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan.

自动装配的重点是@EnableAutoConfiguration这个注解,这也是个复合注解。

@EnableAutoConfiguration注解导入@Import导入了一个AutoConfigurationImportSelector类。

这个类中有一个selectImport()方法,方法中调用了getAutoConfigurationEntry()方法,而这个方法中又调用了一个getCondidateConfiguration()方法,这个方法借助SpringFactoriesLoader.loadFactoryByNames()方法扫描了所有包含META-INF/spring.factories的jar包,这些jar包实际上就是我们引入的依赖。

然后把这些文件中的全类名进行实例化加载到IOC容器中。

9.SpringBoot的启动器和启动类。

启动器:

        

Mysql+Redis:(关系型数据库和非关系型数据库,可能会一起问)

1.Mysql执行过程如何查看:

(虽然在平时都在使用Mysql,而且对Mysql的面试题也都有了解,但是没有发现这个问题,自己本身也不太了解,所以记录一下。)

EXPLAIN  sql语句

---其他参数我再了解一下再记录 想只记录重点的

2.SQL连表查询慢的时候,你都有什么解决方案?
  1. 首先是查看SQL语句,是否有出现导致全表查询的情况
  2. 使用的索引是否合适,是否需要给列添加索引
3.你用过视图吗,视图有什么好处?(用过,但是真没注意这个的作用,当时就是感觉方便)
总的来说就是两点:安全,方便。

1.数据独立:对视图进行的操作,不会同步对对应的表进行操作,保证了原表的数据安全。

2.方便:直接适应视图,用户不用关心对应的表是否进行了复杂的查询和关联等等。

3.安全:用户只能看到自己允许被访问的数据。

4.MySQL的事务有了解吗,为什么使用事务,单表需要使用事务吗?

为了保证数据的安全性和一致性。

单表不需要使用事务,在多表关联的时候,事务用于批量回滚。

5.MySQL索引在什么情况下会失效?

①隐式类型转换

②索引上使用了函数或是计算

③使用了错误的模糊查询

④不符合最左匹配机制

⑤使用or

⑥对索引列进行is not null,not like进行查询

⑦没有覆盖索引时,使用了不等于

6.Mysql中的回表你知道是什么吗?(这个真没看,我看别的面试题也没有呀,难受了)

回表其实就是,你用索引查询到了对应的索引数据,但是还要返回对应主表的数据行查找一次完整的数据行。

其实这个问题主要是由于覆盖索引补全的问题导致的,比如说你查询的一个NAME=A的数据,NAME行你有索引,但是查询的数据有age,sex,这种情况下的话,还是会返回到主表进行查询的,会大大降低查询效率。

6.关系型数据库和非关系型数据库的区别

关系型数据库:

        1.容易理解,使用了关系模型对数据进行集合

        2.可以保持数据的一致性

        3.数据更新的开销更小

        4.支持复杂的查询(带where的查询)

非关系型数据库:

        1.无需进行SQL的解析,直接读写

        2.使用键值对的数据存储形式,读写性能强,扩展性强

        3.支持多种类型的数据存储形式,比如:文件,图片等

7.Redis如何和Mysql保持数据一致?(记了,有又好像没记,反正面试的时候是忘了,看了一下,真的以前有记过,但是忘记了。o(╥﹏╥)o)

延迟双删:先清除Redis缓存,然后更新MySQL,延迟几百毫秒后,再次删除Redis缓存。

就算在更新MySQL的时候有线程读取了老数据,之后仍然会删除缓存,重新从数据库中查找数据。

8.为什么使用Redis?

1.基于内存,并且是键值对结构,速度快,适用于大量数据读写。

2.能适用于多种业务场景,包括排行榜,定时器等。

9.Redis的五种基本类型

字符串string  列表list  集合set   有序集合sort set  哈希hash

Mybatis:

1.两种常用符号:(这个我当时脑壳昏了,离职时间长竟然给忘记了,人麻了,说出来了但是功能说反了)

答:#和$

问:都有什么区别

答:#{}是预编译处理,是占位符,${}是字符串替换,是拼接符

问:SQL注入问题呢?

答:由于${}是字符串替换,是可以拼接到SQL查询语句中的,所以会出现SQL注入的安全性问题,而#{}并不会出现这个问题,可以安全使用。

问:#在什么情况下使用呢?

答:当传递的参数是SQL命令或者SQL的关键字的时候,可以使用#进行拼接,但是一定要注意安全问题。

Linux:

(linux说实话平时在公司用到的也就几个命令,但是他直接一问我真有点蒙,直接整哑巴了)

1.查看当前路径

pwd

2.查看系统内存使用情况

free -h

3.查看一个文件内容

cat

vm

4.根据字符串定位在文件哪个位置

grep -n "xxx"  path

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值