Java基础:
1.基本数据类型:
byte short int float double long char string boolean
2.Map的类型:
- HashMap 最常用的Map类型,数组+链表+红黑树的数据结构,但是线程不安全
- LinkedHashMap HashMap的子类,内部维护了一个双向链表,保存了插入顺序
- TreeMap 有序的,实现了sortMap接口,能进行排序,遍历的数据是排过序的,底层是红黑树
- HashTable (基本淘汰,不建议使用)虽然线程安全,使用了大量的同步锁,但是也导致执行效率极低,不建议使用
- 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连表查询慢的时候,你都有什么解决方案?
- 首先是查看SQL语句,是否有出现导致全表查询的情况
- 使用的索引是否合适,是否需要给列添加索引
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