面试题 笔记
1、String a = "123"; String b = "123"; a==b的结果是什么?这包含了内存,String存储方式等诸多知识点;
答:true, String a String b 都指向常量池中的“123”,==这里比较的是引用地址,引用地址相同,所以true。如果String a = new String("123");String b = new String("123"),则为false,因为new会开辟新的内存空间,地址不同。
2、HashMap里的hashcode方法和equal方法什么时候需要重写?如果不重写会有什么后果?对此大家可以进一步了解HashMap(甚至ConcurrentHashMap)的底层实现;
答:以HashSet举例,HashSet底层是由HashMap实现,如果HashSet进行排序会使用TreeMap。像HashSet中add三个user对象,user具有age,name属性,user1 = new user(1,"a"),user2 = new user(2,"a"),user3 = new user(1,"a");
会发现HashSet中有三个元素,user1和user3是一样的,理想情况下不应该同时存在。这时需要重写hashcode方法,让其变为age+name进行比较。之所以能存进去是由于拿着对象的引用地址进行hashcode计算,显然不同值,可存入。
为什么重写完hashcode还要重写equal,因为比较完hashcode,如果值相同,还要比较equal,equal比较时也默认用的引用地址,so need override。
3、什么是哈希表?
哈希表可以理解为一个数组,但并不是普通数组那样,下标是从0-length-1之间,下标是通过hash函数计算出来的。 hash函数是 关键字的ascii码值减去a的ascii码值。
4、ArrayList和LinkedList底层实现有什么差别?它们各自适用于哪些场合?对此大家也可以了解下相关底层代码;
arrayList底层是数组,linkedList底层链表。 arrayList查询快,增删慢,linkedList查询慢,增删快。
5、介绍下JAVA集合。
collection接口下有三个接口,set , list ,queue, 独立接口map;
set下有hashSet,treeSet,linkedSet,
list下有arrayList,verctor,linkedSet,
queue下有priorityQueue,
map下有hashMap,treeMap,hashTable,linkedHashMap,concurrentMap
如何使用collection接口集合,
是否唯一,
是,set,
是否排序
是treeSet,linkedSet
否hashSet
否,list
是否线程安全
是,verctor
否,arrayList,linkedList
查询多arrayList
增删多linkedList
如果知道用set不知道用哪个,就用hashSet,知道用list,不知道用哪个,就用arrayList,如果知道用collection,不知道更多信息,用arrayList.
hashSet底层 哈希表 由hashCode equals决定唯一性。
linkedSet底层是链表+哈希表 链表保证有序,哈希表保证唯一性
treeSet底层是红黑树,排序自然排序,比较器排序,比较返回值是否为0保证唯一性。
arrayList底层是数组,查询快,增删慢,线程不安全,效率高。
verctor底层是数组,查询快,增删慢,线程安全,效率低。
linkedList底层是链表,查询慢,增删快,线程不安全,效率高。
hashTable,concurrentMap线程安全,hashTable是整块区域加锁,concurrentMap区域块进行加锁,效率高。
6、volatile关键字有什么作用?由此展开,大家可以了解下线程内存和堆内存的差别;
volatile关键字保证了线程安全,主要有两个功能,保证可见性,和防止指令重排。
什么是可见性,举例,有两个线程,在不同的处理器上运行,都使用主内存中的共享变量,如果一个线程修改了变量,不会立即反应到主内存中。线程获取变量会先从本线程缓存中获取,加上volatile是为了,让线程始终从主内存中获取,如果修改则立即反映到主内存中。
long double读写时不是原子性操作。long double二进制长度是64位,在32位操作系统中,读写时会操作两次32位,并发环境中可能存在问题。加上volatile就是原子性了。
7、CompletableFuture,这个是JDK1.8里的新特性,通过它怎么实现多线程并发控制?
completableFuture实现了completionStage和future接口,可以像Futrue那样使用它。
8、JVM里,new出来的对象是在哪个区?再深入一下,问下如何查看和优化JVM虚拟机内存;
new出来的对象存在堆中分配空间,栈是用来保存局部变量和临时变量,和存放对象的引用,对象实际内存还是在堆中。
使用top命令查看虚拟机内存,使用shift+m按照内存排序,查看RES,占用内存,但是是KB。
如何优化JVM虚拟机内存,Xmx设置最大值,Xms设置最小值。
9、Java的静态代理和动态代理有什么差别?最好结合底层代码来说。
静态代理和动态代理都是为了增强代码的功能,静态代理的代理类需要自己编写代码,动态代理类通过Proxy.newInstance方法生成,指向了一个InvocationHandler实现类,不管静态代理和动态代理都要实现两样接口,面向接口编程。
https://www.cnblogs.com/cC-Zhou/p/9525638.html
10、redis好处,缓存穿透,缓存击穿,缓存雪崩怎么解决
redis数据在内存中,查询快,单线程,避免线程上下文切换(线程运行环境,堆栈,寄存器等),Io多路复用(有多个水管,每个水管不定时来水,一会去这个接水,一会去另外一个水管接水,总之把水接完;如果每个水管都派分身接水,则是Threaded io)
缓存穿透,一个不存在的key来查询,会load db ,
缓存击穿,一个热点Key来查询,失效时大量数据load db
缓存雪崩,服务器重启,或大量Key同时失效,load db
缓存穿透,1、将所有可能存在的值放入Map,校验 2、空值缓存起来
缓存击穿,使用互斥锁,避免大量KeyLoad db,只让一个Key load db,redis.setnx方法
缓存雪崩,1、随机化key失效时间 2、使用二级缓存 3、使用锁或排队减轻数据库压力
resid底层数据接口
字符串处理 redis自己构建了simple dynamic string (sds 简单动态字符串) 记录已经用字符串数量,未使用字符串数量,数组保存字符串 不用担心内存溢出,因为长度固定, 空间预分配字符串长度,获取长度直接取len字段
双向链表拓展了头、尾节点、元素等属性。可以直接获得头尾节点,是双向链表。
字典hash,在数组+链表基础上,加了rehash优化(键值对过多时为了拓展或收缩)。 采用单链表结构,采用链地址处理冲突,没有使用红黑树。
跳跃表 用在有序集合键,集群节点sikplistNode内部数据结构,skiplist有序的。
整数集合 intset encoding,length,contents[]
压缩列表 为了节省内存,顺序型数据结构,用在列表键和哈希键中。 encoding,content,previous_entry_length 可以进行指针运算达到表尾向表头遍历。
11、如何防止接口抓包频繁调用
1、验证码 2、IP限制3、设备请求频率4、API接口签名5、接口加token做验证6、风控7、数据安全8、恶意IP库9、前端代码混淆
12、String类为什么是final的
为了效率和安全性,如果字符串存在常量池中,直接获取,不用创建新对象,不可变,线程是安全的。
13、hashmap的源码,实现原理,底层结构
hashmap是基于哈希表map接口的非同步实现,底层是由数组+链表实现的。
hashmap允许null值和null键,但不保证映射顺序,向map中put值时,是根据key的hashcode值寻找下标,如果下标处有值,则以链表的形式存放,新加入的放到链头,最先加入的放到链尾。java中基本的数据结构是数组+模拟指针,hashmap的数据结构是数组+链表。在jdk1.8之后,由链表查询转化为红黑树查询。
14、反射中,class.forname和classloader的区别
classforname和classloader都可以对类进行加载,
classforname除了将.class文件加载到jvm内之外,还会对类进行解析,执行类中的static静态代码块。
classloader,只将.class加载到jvm内,并不会对static静态代码块中的内容进行解析,只有在new instance方法的时候才会对static进行解析。
jdbc driver源码使用classforname为了反射回去执行static代码块。
类装载顺序 加载-验证-准备-解析-初始化-使用-卸载
15、session和cookie的区别和联系,session的生命周期,多个服务部署时session管理
session和cookie都创建于服务器端,session保存在服务器端,cookie保存在客户端。
cookie以明文形式存在客户端,但可以进行加密后存放。安全性较低。session安全性高。
cookie生命周期是累计的,可以设置setmaxAge,如果没有设置浏览器关闭,就消亡了。session生命周期是间隔的,比如20分钟,第19分钟访问,会刷新生命周期,从新计算20分钟。
session会有唯一的sessionid,多台服务器部署时,需要多个服务器可以同时存取,并且不同服务器对同一客户端产生相同cookie。
16、堆排序原理
堆分为大根堆,小根堆,是完全二叉树,大根堆父节点大于两个孩子节点,小根堆父节点小于两个孩子节点。
排序过程,先将待排序的数组按照大根堆排序,得到最大值和末尾的值,拿末尾的值跟N-1个数再次构造大根堆,反复,便能得出有序数组。
17、java中的队列有哪些,有什么区别
非阻塞队列 priorityQueue 优先有序队列
concurrentLinkedQueue基础链表同步队列
LinkedList
阻塞队列
ArrayBlockingQueue有界队列
LinkedBlockingQueue一个由链接节点支持的可选界限队列

priorityBlockingQueue优先级堆支持的无界队列
DelayQueue延迟队列
SynchronousQueue同步队列
LinkedTransferQueue链表结构组成的无界阻塞队列
add和remove队列满时或队列空时会抛异常。
poll(移除元素并返回头部元素)和peek(返回队列头部元素)方法出错返回null,向队列插入null值不合法。
有阻塞操作put(添加元素)和take(移除元素返回头部元素),put方法在队列满时阻塞,take方法在队列空时阻塞。
同步、异步、阻塞、非阻塞 同步、异步指是否会接收回调,阻塞、非阻塞指处理事情时可否做其他事。
消息队列使用场景 有序,一些事情集中处理,例如批量发送短信,邮件等。
18、java内存模型以及GC算法
java内存模型包括 方法区、堆、本地方法栈、虚拟机栈、计数器
方法区和堆 是线程共享的,本地方法栈、虚拟机栈、计数器线程隔离的。
GC算法 复制清除算法、标记清除算法、标记整理算法。
年轻代、老年代、永久代。
年轻代使用minoer gc,老年代、永久代使用full gc
年轻代分为 一个新生代,两个复活代,GC时只使用一个新生代和一个复活代,GC时将新生代和复活代复制到另外一个复活代,并将存活的元素标识为活动复活代,每次存活下来的元素年龄+1,超过15将转换为老年代。
年轻代会产生大量死亡对象,使用复制清楚算法,老年代和永久代使用标记清除和标记整理算法。
19、java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高
数组查询快,增删慢,链表查询慢,增删快。
数组如同一个班级,每个人有学号,找人快,固定长度,当元素增加时,会超过原来定义的个数,当数据减少时,造成内存浪费。数组查询时间复杂度为o(1),增删复杂度o(n)
链表如同铁链,环环相扣,查询得挨个查找,动态存储分配,方便插入,删除。存链表查询复杂度o(n),增删复杂度o(1)
20、java内存泄漏的问题调查定位,jmap,jstack的使用等等
jps 主要用来输出JVM中运行的进程状态信息
jstack 查看某个java进程内的线程栈信息
jmap 查看堆内存使用状态
deadlock 有死锁 warting on condition 等待某个资源来唤醒自己
blocked 阻塞 waiting on mointor entry 等待获取锁
21、如何实现多线程,thread和runnable的区别和联系,多次start一个线程会如何,线程有哪些状态。
继承thread,实现runnable,实现callable接口通过futuretask包装器来创建线程,实现future,executorService实现有返回结果的线程,java单继承,多实现。
调用线程使用start方法,不使用run,run只是线程中的一个方法,线程体。多次start会抛出illegalThreadStateException,第二次调用start,线程状态会发生变化,抛异常。
线程状态,新建 就绪 运行 阻塞 死亡
22、假如有四个线程分别统计C/D/E/F四个盘大小,所有线程完毕后线程5汇总,如何实现,
1、使用callable,future有返回结果的线程2、使用join阻塞 3、使用java.util.concurrent下的方法解决 countDownLatch。
23、线程池有几种,区别和联系,实现原理,使用场景
常用线程池有四种,通过调用executors返回executorService
newCachedThreadPool 一个可缓存线程池,线程无限大。 执行短周期小程序
newFixedThreadPool 一个固定大小线程池 执行周期较长的任务
newScheduledThreadPllo 一个固定大小线程池,可定时执行 延迟执行 周期性执行任务
newSingleThreadExecutor 创建单线程化的线程池,只会用唯一的线程来执行,保证任务按照顺序执行 一个任务一个任务执行
实现原理 线程池一直循环遍历需要执行的任务,直至线程池死亡,如果某个线程发生异常,则新建一个线程继续执行任务,如此反复。
24、synchronized和reentrantLock的区别,synchronized锁普通方法和静态方法、死锁的原理及排查方法
synchronized是java的关键字,加锁,解锁由jvm完成,使用方便。
reentranLock是api层面的互斥锁,需要手动lock,unlock,通常配合try finally完成,使用较为灵活。
如果synchronized修饰在普通方法上,线程之间无联系,可任意执行自己的对象锁,
如果修饰在static方法上,表示锁定了class类,多个线程是相同的一把锁,哪个线程先执行代码,哪个线程就获取锁,其他线程无法执行。
死锁主要由于系统资源不足,线程执行顺序,资源分配不当,
死锁四要素,互斥,占用等待,不可强行占用,循环等待
排查 jps查找进程号,jps -l 找deadLock jstack jmap还可查看堆 有新生代 两个复活代
或 top ps -ef | grep java 转化为16进制 再用jstack
25、NIO原理,NIO属于哪种IO模型,NIO三大组成
BIO 阻塞io,同步阻塞IO
AIO 异步非阻塞IO
NIO 不是严格意义上的同步非阻塞IO,属于多路复用,多路复用会阻塞在selector的select方法上
nio三大组成 selector选择器,channel通道,buffer 缓冲区,
每个channel 对应一个buffer,selector对应一个线程,selector负责在channel上切换,buffer是内存块,底层是数组
26、netty
基于nio同步非阻塞io开发的网络通信框架,dubbo,rocketmq都使用netty作为通讯基础。
27、String的hashcode方法怎么实现
string类中有个变量hash,第一次会进行几次,以后获取则直接返回。
计算时以31为奇素数,乘法被位移,减法被替换,更大的质数碰撞会减少。
string equal方法,会比较对象地址,判断类型,判断长度,判断每一个字符是否相等,如果只用hashcode不严谨。
28、ReentrantLock、AQS的源代码
AQS abstarctQueuedSynchronizer 用于构建锁和同步容器的框架,AQS使用FIFO队列表示排队等待锁的线程,队列头节点称作哨兵节点,它不与任何线程关联,其他节点与等待线程关联,每个阶段维护一个等待状态。AQS有一个表示状态的字段state,例如reentrantLock用它来表示线程重入锁的次数,semphore用它来表示剩余的许可数量,futureTask用它来表示任务状态,对state变量值得更新都采用cas操作保证更新操作的原子性。
29、hashMap的扩容机制,线程为什么不安全,1.7 头插 1.8尾插 为什么,concurrentHashMap 1.7 1.8 区别, 1.8 cas 乐观锁 ,数组的大小为什么是2的幂次方
hashmap当元素超过数组大小*loadfactor(加载因子0.75)时,进行扩容,数组大小扩大一倍。
负载因子是0.75空间利用率高,避免了相当多的hash冲入,使底层的链表或红黑树高度较低,提升了空间效率。
为什么线程不安全, 数据丢失,数据重复,死循环,
死循环是由于1.7resize过程中对链表进行倒叙处理,java8中不存在。
为什么是2的幂次方,计算容量时 取余%操作 如果除数是2的幂次方等价于除数减一的与(&)操作,采取二进制算法可以提高运算效率。 hash%length == hash&(length-1)
30、多线程死锁如何解决,锁升级过程,每一步的过程,volatile为什么保证不了原子性,线程yield、Join、interrupt方法。
死锁四要素:互斥、占有并保持,不可强行占有,循环等待
线程1占有线程2的资源,线程2占有线程1的资源,线程以要获取线程二的资源,线程2要获取线程1的资源,形成循环等待。
syschronized锁在对象头中,包括mark word 标记字段 和klass pointer 类型指针
无锁 01 没有对资源进行锁定,所有线程能访问修改同一个资源,但只有一个线程能修改成功
偏向锁 01 对象的代码一直被一个线程执行,不存在多线程,为了线程执行获取锁,指向第一个检索线程。
轻量级锁 00 在偏向锁基础上,又来一个线程B访问,会升级为轻量级锁,线程B自旋尝试获取锁,不会阻塞。
重量级锁 11 在轻量级锁基础上,自旋15次以上变为重量级锁,获取锁的线程处于阻塞状态。
CAS机制 ABA问题
i++复合操作不能保证原子性 分为读取值 自增计算 刷回i值
AtomicInteger compareAndSwap 比较和替换 三个参数 var1 va2 var4 1和2相等时 替换4
ABA问题 A修改成B B修改成A ABA问题增加 版本号
join 线程有序进行使用Join
sleep 线程不参与cpu调度,但是不释放锁
yield 线程让出cpu使用,处于就绪状态
interrupt 线程间的协作模式,并不能直接中断其他线程执行,需要其他线程判断中断状态来决定是否终止执行。
31、Object类中的方法以及每个方法的作用
1、clone方法,浅复制,实现了cloneable可以调用
2、getclass 运行类型
3、toString
4、finalize释放资源
5、equals
6、hashcode 减少equals方法
7、wait使线程等待对象锁,线程必须是对象的拥有者,wait方法一直等待或者被中断,调用次方法线程处于睡眠状态,知道调用该对象notify,notifyAll,时间间隔到,或者中断,中断会抛异常。
8、notify 唤醒该对象上等待的某个线程
9、notifyAll 唤醒在该对象上等待的所有线程
32、spring框架中需要引入哪些jar包,以及这些jar包的用途
spring-core.jar 核心工具类
spring-bean.jar 访问配置文件,创建管理bean
spring-aop.jar aop特性需要的类
spring-context.jar spring核心提供拓展
spring-dao.jar spring dao,spring transaction 进行数据访问的类
spring-hibernate.jar 使用hibernate封装的类
spring-jdbc.jar 对jdbc数据库访问进行的封装类
spring-orm.jar 对dao进行拓展
spring-remoting.jar 支持ejb,jms远程调用方面的类
spring-support.jar 缓存类
spring-web.jar web开发时需要的类
spring-webmvc,jar mvc相关的类
spring-mock.jar mock类测试使用
33、spring mvc的原理
客户端请求-->dispatcherServlet-->查找handlerMapping-->handler-->handlerAdapter-->controller-->modelAndView-->view-->浏览器
34、springmvc注解的意思
@controller 分发处理器会扫描这些类,并检测方法@requestMapping
@requestMapping 标注处理请求地址
@requestParam 请求区参数映射到方法上
@param 指定request包含的参数
@resource 默认名称注入 @autowired 默认类型注入 如果按照名称注入结合@qualifier 注入时使用的注解
@repository 注解dao层
@component 通用注解
@restcontroller 结果无法返回页面 rest统一的命名风格 一般以动词 get \put \delete等 只返回数据
35、spring中beanFactory和applicationContext联系和区别
beanFactory实例化对象和拿对象功能
applicationContext 国际化 访问资源 载入多个上下文 消息发送 AOP拦截
36、spring注入的几种方式
注解注入 autowired 类型 resource 名称
构造器注入
setter注入
37、spring如何实现事务管理
事务的四种特性 原子性 一致性 隔离性 持久性
原子性 要么全部成功,要么全部失败
一致性 数据库执行事务前后状态一致
隔离性 一个事务执行时不能看到另外一个事务修改的数据中间状态
持久性 事务结束后,数据永久保存
事务七种传播机制
propagation_supports 支持当前事务,如果没有事务,就以非事务执行
propagation_requierd 没有事务,新建事务,如果有事务加入这个事务
propagation_reauierd_new 新建事务,如果有事务,把当前事务挂起
propagation_mandatory 使用当前事务,如果没有事务,抛出异常
propagation_not_supported 以非事务方式执行,存在事务则把事务挂起
propagation_never 以非事务方式执行,存在事务,抛出异常
propagation_nested 存在事务,嵌套事务执行,不存在事务,新建事务
数据库隔离级别
读未提交 read uncommitted 一个事务可以读另一个事务未提交的数据 造成脏读
读提交 read committed 只能读提交的数据 会造成不可重复读,两次读的时候,第二个事务修改了数据,并且提交
可重复读 repeated read 默认隔离级别 不允许其他事务update操作,允许insert,delete 造成幻读
序列化 serializable 一个个排队执行,都可以避免,效率低,没人用
如何解决幻读,多版本mvcc 快照度,一致性读,next-key原理,数据上下间隙锁定,索引上的锁,索引之间的锁
事务实现方式
编程式事务管理
1、在代码中调用begintransaction commit rollback
声明式事务管理
2、基于transactionProxyFactoryBean 代理工厂
3、基于transcational声明 注解
4、基于aspectj aop配置事务 aop
38、spring bean的生命周期
实例化 instantiation 赋值 populate 初始化 initialization 销毁 destruction
39、spring ioc aop原理
spring ioc 基于反射,传统项目创建对象,需要new,spring将对象交给容器管理,只需要在配置文件配置或加上注解。
spring aop 面向切面编程,动态代理模式,在invoke方法前后加上相应代码。
40、jdk用到哪些设计模式,spring用到哪些设计模式
工厂模式 beanFactory applicationContext创建bean
代理设计模式 spring aop
单例模式 spring中的bean默认单例
模板方法 spring jdbctemplate hibernateTemplate
包装器设计模式 链接多个数据库,每次访问动态切换不同数据源
观察者模式 spring事件驱动模型
适配器模式 spring mvc中适配器模式适配controller handlerAdapter
41、spring中循环注入的方式,以及解决办法
构造器参数循环依赖 spring无法解决
setter方式单例 bean提前暴露,缓存到map中
setter方式原型 不进行缓存,报错
spring解决循环注入,使用三级缓存
一级缓存存放完全创建好的对象
二级缓存存放无参构造好的对象
三级缓存存放二级缓存的时候会查看是否有后置处理器,接口拓展
先从一级缓存中获取,如果获取不到,从二级缓存获取,如果获取不到,从三级缓存获取,再将对象从三级缓存中移动到二级缓存,初始化完成后,放入一级缓存。
二级缓存就能实现,使用三级缓存因为三级缓存有后置处理器,可以接口拓展。
42、union和union all区别,left join ,right join区别,几种索引区别
union 不包含重复行,会进行排序
union all 包含重复行,不进行排序,效率高
left join 返回左表中所有记录和右表中联结字段相等的记录
right join 返回右表中所有记录和左表中联结字段相等的记录
inner join 返回两个表中联结字段相等的行
索引分为聚集索引,非聚集索引
聚集索引就是主键 ,非聚集索引包括 普通索引,唯一索引,全文索引,组合索引
43、循环中return continue break区别
continue 跳出当次循环
breake跳出当前循环体
return 跳出方法
44、string s = new string("xyz")创建了几个对象,可以被string类继承吗
创建了一个或者两个,如果字符串常量区存在,则创建一个,
如果字符串常量区不存在,则创建一个。
string 被final修饰,不可被继承
55、forward 和 redirect区别
forward是转发 服务端发起 浏览器地址不显示被请求的 一个request 客户端只发一次请求
redirect是重定向 客户端发起 浏览器地址显示被请求的 重新开始一个request 客户端发两次请求
56、打印九九乘法表
两个for循环
57、有使用过缓存吗,redis和memcached有什么区别?
1、redis和memcached都是讲数据放到内存中,不过memcached还可以缓存图片,视频。
2、redis不仅仅支持简单的k/v类型数据,同时还提佛那个List,set,hash等数据结构
3、redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘。
4、过期策略 memcache在set时就指定,例如set key 1008 ,即永不过期,redis可以通过例如expire设定,例如expire name 10
5、分布式-设定memcache集群,利用magent做一主多从,redis可以做一主多从,都可以做一主多从
6、存储数据安全-memcache挂掉后,数据就没了,redis可以定期保存到磁盘上
7、灾难恢复-memcache挂掉后,数据不可恢复,redis数据丢失后可以通过aof恢复
8、redis支持数据的备份,即master-slave模式的数据备份
9、应用场景不同,redis除了作为nosql数据库使用外,还可以消息队列,数据堆栈和数据缓存等,memcached适合于缓存SQL语句,数据集,用户临时性数据,延迟查询数据和session等
使用场景
1、如果有持久方面的需求或对数据类型和处理要求应该选择redis
2、如果简单的key/value存储应该选择memcached
一般电子商务类网站中,会有分类,还有搜索结果列表,针对这种情况我们对分类的数据可以使用缓存,数据不会改变,读多写少。
1、底层数据库引擎不支持事务,则spring自然无法支持事务
2、在非public修饰的方法使用,aop代理指针对public类
3、异常被try-catch吃掉
4、一个类中未声明事务的方法A调用声明事务的方法B,会导致B方法的事务失效
spring扫描bean的时候会为transcational注解的类生成一个代理类,当有注解方法被调用时,代理类会开启事务,
如果同类方法互相调用,此时B方法并非是代理类,而是通过原有的bean直接调用
5、rollbackFor属性设置错误
设置错误,导致不能正常回滚
6、noRollbackFor属性设置错误
7、propagation属性设置错误
事务传播属性设置错误,比如propagation.supports propagation.not_supported propagation.never
8、原始SSM项目,重复扫描导致事务失效
1、配置了context:component-scan 同时扫描了service层
2、先加载springmvc配置文件,加载配置文件时把service也加载进去
service层的配置设置在spring配置文件或者其他配置文件中
60、索引失效的几种场景
1、如果条件中有or,左右查询字段只有一个带索引
2、组合索引,不是使用第一列索引,失效
3、like查询是以%开头
4、数据类型隐式转换,varchar不加单引号会转换成int型,全表扫描
5、如果使用全表扫描比使用索引快,则不使用索引
6、索引列上使用is null或is not null 操作,索引不索引空值,设置默认值解决
7、在索引字段上使用not , <>,!= 不等于操作永远不使用索引,改为or ,or左右都是索引列
8、索引字段进行计算
9、索引字段使用函数

不断尝试加锁,加锁的同时设置超时, 使用set方法,
jedis,eval 方法,保证判断key和删除key是原子操作,谁拥有,谁释放
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
https://www.cnblogs.com/chanllenge/p/11833173.html
64、如何保证接口数据的传输安全
2)你怎么理解 Spring 是一个容器?
3)Tomcat怎么做 Session 共享?
4)什么是松耦合?你们项目是怎么做的?
1、有使用过缓存吗?Redis和Memcached有什么区别?
2、Redis的线程模型?单线程的Redis如何实现高性能的?
3、使用Redis实现过分布式锁吗?什么是分布式锁
4、有什么其他方式实现分布式锁吗?ZK实现的和Redis有何区别?
5、zk实现的分布式锁如何解决网络抖动的锁丢失导致的并发问题?
6、zk底层的zab算法有了解吗?如何进行选主的?paxos算法呢?
7、分布式事务有了解吗?如何实现分布式事务?
8、什么是2PC,和3PC有什么区别?
9、如何实现一个高性能的服务接口?
10、什么是分库分表?为什么要做,怎么做?
11、有没有做过限流降级相关的事情?
以上这些问题,对于一个没有过分布式经验的人来说其实还是比较难的。但是很多大厂有要求面试者有分布式经验,但是很多小厂有没有分布式的场景...
所以,到底什么是分布式经验,想要回答好面试官的问题,需要会哪些和分布式有关的知识呢,大概可以总结如下:
分布式服务框架。如Dubbo、SpringCloud
分布式事务。2PC、3PC、TCC
分布式锁。Redis实现、zk实现
消息中间件。Kafka、RabbitMQ、RocketMQ
分布式缓存。Redis、Memcached
分布式搜索系统。Elasticsearch
分布式理论。CAP、BASE
高性能、高可用、高并发。分库分表、读写分离、缓存、限流、降级、异步消息
以上这些知识点,有几个方面需要注意:
1、要知道同类竞品之间的差异、优缺点
2、要知道为什么使用这类产品,如RPC框架、消息中间件等
3、使用这些产品带来的一些问题是什么,如分库分表带来的分布式事务问题
4、常用中间件的基本原理,如Redis的线程模型、zk的存储模型
电商,
1、 xxl-job 生成定时任务, 订单到时提醒,不能超时,
2、定时任务 轮训
3、mq死信队列,时间限制的消息队列。
生产者,消费者消费,如果没有消费,
4、redis键空间通知 创建订单之后,哪个点会失效,订单
1、两个字符串是如何想加的,流程是啥,stringbuffer是如何拼接字符串的
2、https的一个执行流程 具体发了啥指令
3、核心线程 最大线程如何计算
4、线程池的核心线程什么时候被释放
5、一个类如何被加载多次 方法的一个运行流程是如何的
6、两个字符串相加,他的内部流程是如何的
7、秒杀的时候,别人恶意抢单占用,不付款该怎么办
8、mysql一次性查询100页的数据,怎么优化
9、分布式锁 内部实现原理
10、hello world的一个运行流程
11、mybatis 原理
12、rabbitmq kafka
13、
dubbo zk apollo spring springboot redis jenkins mybatis
dubbo spring cloud
posted on 2020-06-29 18:28 doudou20181128 阅读(283) 评论(1) 收藏 举报
浙公网安备 33010602011771号