面试题day4
任拓数据科技
-
自我介绍
-
聊我的项目
-
项目中的网页有没有安全机制?防sql注入等等
{}
权限认证,shiro、springsecurity,认证授权
-
json数据裸奔
对数据加密,MD5加密
权限认证,shiro
-
项目中遇到的问题?跨域
-
为什么跨域?解决方法?
-
几个算法(括号匹配、排序高考分数、身份证号码索引)
-
说我的简历好像没有体现对代码的热爱?没有什么内容,基本上都是学校的课程任务。
-
平时使用最多的语言?
Java
-
谈谈职业规划?
-
对公司有哪些了解?
-
反问?(技术栈、新人学习机会)
思特奇
-
自我介绍
-
介绍项目,权限控制怎么做的;
- 验证手机号是否为注册用户手机号
- 非注册报错, 否则生成随机验证码,然后调用第三方接口给用户发送验证码
- 将随机数保存在redis,给接口调用方返回成功信号
- 先验证用户输入的验证码是否正确
- 验证成功后删除redis中的验证码
- 生成登录用的token,保存在redis,返回tokenId
-
spring注入的几种方式;
setter注入、构造器注入、注解注入
-
bean加载步骤;
-
自动配置怎么实现的;
-
@EnableAutoConfiguration
:启用 SpringBoot 的自动配置机制自动装配核心功能的实现实际是通过
AutoConfigurationImportSelector
类。- 获取需要自动装配的所有配置类,读取
META-INF/spring.factories
- 筛选,
@ConditionalOnXXX
中的所有条件都满足,该类才会生效
- 获取需要自动装配的所有配置类,读取
-
@Configuration
:允许在上下文中注册额外的 bean 或导入其他配置类 -
@ComponentScan
: 扫描被@Component
(@Service
,@Controller
)注解的 bean,注解默认会扫描启动类所在的包下所有的类 。
-
-
重载和重写的区别;
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
-
抽象类和接口的区别;
-
单继承多实现
-
抽象类可以有成员变量,而接口中只可有常量final
-
抽象类可有有成员方法用(public、protected和default),而接口中只有抽象方法(public)
-
抽象类可以有构造器,而接口不能有构造器
-
-
抽象方法能不能加final;
final修饰类不能继承,方法不能重写,变量不能修改
-
集合框架中的线程安全类你知道那些;
StringBuffer
list Vector
HashTable ConcurrentHashMap
ArrayBlockingQueue
AtomicLong AtomInteger
-
进程和线程的区别;
进程是运行的程序
线程是操作系统能够进行运算调度的最小单位
-
创建线程的方式;
继承Thread类创建线程,并重写该类的run(),调用线程的start()
实现Runnable接口,并实现run(),作为Thread的参数,调用线程的start()
实现Callable接口,并实现call(),创建该类的实例,Future Task类来包装Callable对象,FutureTask对象作为Thread对象的target创建并启动线程
线程池
-
说说锁重入;
可重入锁:自己可以再次获取自己的内部的锁。比如有线程A获得了某对象的锁,此时这个时候锁还没有释放,当其再次想获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。
-
sleep和wait的区别;
sleep方法没有释放锁,wait方法释放了锁
sleep()方法可以在任何地方使用,wait()方法只能在synchronized方法或synchronized块中使用
-
数据库优化了解哪些;
多表关联最多2张
使用left join或right join代替not in和exist
不使用外键和触发器
查找避免索引失效
逻辑删除
更新使用id作为条件,更新非索引字段
增加 id有顺序
-
索引何时失效;
违背最左前缀匹配原则
对索引字段做函数操作
隐式类型转换
!= 或 <>
-
左右外连接;
外连接 保留所有行,无对应补null
左连接 保留条件都相等的行及左表未对应的行,无对应补null
有链接 保留条件都相等的行及右表未对应的行,无对应补null
内连接 只保留两表条件都相等的行
-
视图的好处。
视图能够简化用户的操作
视图使用户能以多种角度看待同一数据
视图重构数据库提供了一定程度的逻辑独立性
视图能够对机密数据提供安全保护
视图能够更清晰的表达
蚂蚁金服
-
半小时,上来先简单自我介绍一下再简要介绍项目。
-
项目有用到redis,说说redis两种持久化的方式和特点、再说说缓存雪崩、缓存击穿缓存穿透吧,解决办法?redis为什么快?缓存淘汰策略?
- 定时删除
- 创建一个定时器,当key有过期时间时,时间一到,定时器任务就会立即执行 将expires区域和k-v区域都删除
- 优点:节约内存
- 缺点:cpu压力较大,此时无论cpu负载量多高,都会占用cpu来释放,影响redis的吞吐量
- 惰性删除
- 数据过期后,并不会立刻删除 等到该数据下次访问的时候,redis才会删除该数据,并返回该值为nil
- 优点:节省cpu的资源
- 缺点:可能存在大量的,无人访问的数据会一直存在服务器
- 定期删除
- 每秒钟定期对redis中每个库的数据进行轮询 轮询的数据,对过期的数据随机删除一部分 如果随机删除的数据占轮训数据的比例超过一定值,继续轮询删除
- 定时删除
-
说说springmvc一些常用注解和作用
-
简单说说cookie做什么的?session又是什么?它们直接的关系?
记录客户状态的机制
cookie数据存放在客户的浏览器上,session数据放在服务器上。
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
-
说说浏览器输入网址到返回页面的过程?
dns
ip
tcp
http
-
如果服务器返回不是静态的页面?动态的?
json数据
-
说说线程之间的同步方式?
原子变量
volatile
synchronized
reentrantLock
-
两个不同的JVM的进程如何同步?
文件锁
-
消息中间件,可靠性消息?
-
分布式事务?
-
MySQL(GBK编码下)有个字符串”coder李四110”它们的char_length()和length()函数的值?
length()字节 2*2+8
char_length()字符 5+2+3
招银网络
-
自我介绍
-
项目用到redis redis过期数据删除的机制 删除的策略
- 定时删除
- 创建一个定时器,当key有过期时间时,时间一到,定时器任务就会立即执行 将expires区域和k-v区域都删除
- 优点:节约内存
- 缺点:cpu压力较大,此时无论cpu负载量多高,都会占用cpu来释放,影响redis的吞吐量
- 惰性删除
- 数据过期后,并不会立刻删除 等到该数据下次访问的时候,redis才会删除该数据,并返回该值为nil
- 优点:节省cpu的资源
- 缺点:可能存在大量的,无人访问的数据会一直存在服务器
- 定期删除
- 每秒钟定期对redis中每个库的数据进行轮询 轮询的数据,对过期的数据随机删除一部分 如果随机删除的数据占轮训数据的比例超过一定值,继续轮询删除
- 定时删除
-
实际项目中用到了redis哪些数据结构 用list做了什么
- string 缓存 session共享 分布式锁
- list 消息队列
- hash 存储对象
- set 集合
- zset 排行榜
-
kafka 如何保证消费者不会重复消费数据
-
offset自动提交还是消费完之后才提交offset
-
kafka有没有什么确认机制保证消息一定写入kafka集群当中
-
哈希表的作用 哈希表使用的数据结构 哈希内部解决哈希冲突的方式有哪几种
快速的插入操作和查找操作
再哈希法
链地址法
-
多线程环境下为什么要引入同步的机制
同步机制可以实现线程之间的通信,同步机制保证共享资源只能被一个线程所持有,
避免了多线程执行时数据的不安全问题.
-
java内部有哪些同步的机制 回答 synchronized 和 reentrantLock 问 这两种锁有哪些区别
- 原始构成
- Synchronized是关键字属于JVM层面,
monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖monitor对象只有在同步块或方法中才能调wait/notify等方法)
monitorexit - Lock 是具体类(java.util.concurrent.locks.lock)是api层面的锁
- Synchronized是关键字属于JVM层面,
- 使用方法
- Synchronized 不需要用户手动释放锁,当synchronized代码执行完成后系统会自动让线程释放对锁的占用
- Reentrantlock则需要用户去手动释放锁若没有主动释放锁,就有可能导致出现死锁的现象。
需要lock()和unlock()方法配合try/finally语句块来完成
- 等待是否可中断
- synchronized不可中断,除非抛出异常或者正常运行完成。
- Reentrantlock 可中断,
- 设置超时方法。tryLock(Long timeout,TimeUnit unit)
- lockInterruptibly()放代码块中,调用interruptibly()方法可中断。
- 加锁是否公平
- synchronized非公平锁
- Reentrantlock俩者都可以,默认非公平锁,构造方法可以传入boolean值,true为公平锁,false为非公平锁。
- 锁绑定多个条件Condition
- synchronized没有
- Reentrantlock用来实现分组唤醒需要唤醒的线程们,可以精确唤醒,不像synchronized随机唤醒或者唤醒全部线程。
- 原始构成
-
多线程什么场景下会发生死锁
当两个(或更多)线程(进程)相互持有对方所需要的的资源,又不主动释放,导致所有人都无法继续前进,导致程序陷入无尽的阻塞,这就是死锁
-
有什么具体的办法可以避免死锁
- 避免多次锁定。尽量避免同一个线程对多个 Lock 进行锁定。例如上面的死锁程序,主线程要对 A、B 两个对象的 Lock 进行锁定,副线程也要对 A、B 两个对象的 Lock 进行锁定,这就埋下了导致死锁的隐患。
- 具有相同的加锁顺序。如果多个线程需要对多个 Lock 进行锁定,则应该保证它们以相同的顺序请求加锁。比如上面的死锁程序,主线程先对 A 对象的 Lock 加锁,再对 B 对象的 Lock 加锁;而副线程则先对 B 对象的 Lock 加锁,再对 A 对象的 Lock 加锁。这种加锁顺序很容易形成嵌套锁定,进而导致死锁。如果让主线程、副线程按照相同的顺序加锁,就可以避免这个问题。
-
Http的请求报文和响应报文各有哪几部分组成
请求行 请求头 请求体
响应行 响应头 响应体
-
Http 协议和TCP协议的关系是什么
http协议是应用层协议,主要是解决如何包装数据。而tcp协议是传输层协议,主要解决数据如何在网络中传输。
-
Http TCP 都有保活 keep-alive 机制 两者有什么区别
HTTP协议(七层)的Keep-Alive意图在于连接复用,希望可以短时间内在同一个连接上进行多次请求/响应
TCP协议(四层)的KeepAlive机制意图在于保活、心跳,检测连接错误。
-
实际项目中有用到Spring AOP模块吗 主要用来做什么
记录日志,接口运行时间
面向切面编程,不影响原有的业务基础上增强
-
AOP底层通过什么机制来实现的
动态代理
-
Spring 内部具体有哪几种代理的方式呢
如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象
对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。常用于计算接口运算时间、记录日志。