java面试总结

设计模式:
 单例模式:
如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
 好处:
减少新生成实例的消耗
减少jvm垃圾回收
更快的获取对象
 缺点:
没有抽象层,扩展困难
 使用场景:
网站计数器,线程池
 工厂模式:
多种支付方式的时候
 策略模式:
一个业务多种实现方案,第一个方案由于异常无法处理的时候第二个方案去处理
 观察者模式
当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新,下单后记录日志,发送短信,送积分
 
mysql:
 索引类型有:
唯一索引,主键(聚集,聚簇)索引,非聚集索引,全文索引
 优化:
select不要使用*
尽量减少子查询,用关联查询代替
in 的数据不能过多
不频繁修改的字段可以合理增加冗余字段
建立索引
避免全表扫描,比如:!= <>,对where字段进行表达式,函数,算数操作
能使用数字类型字段尽量使用,因为字段串数据库索引处理的时候会比较每一个字符,数字类型只需要比较一次
索引注意点:
模糊查询,%放第一个位置不生效
联合索引,带有第一个字段才会生效
or必须前后两列都是索引才生效

SpringCloud:
 Eureka
服务注册于发现。
高可用,部分挂了,可以切到其它节点,可能会信息不一致
 ZooKeeper
一致性,主挂了之后30多s会进行leader选举,此时不可用,会导致整个微服务停止
 Feign
基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
 Ribbon
实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix
提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
 Zuul
网关管理,由 Zuul 网关转发请求给对应的服务。

redis:
单线程的,轻松处理每秒几十万的请求
快:基于内存,数据结构简单,单线程(不用考虑锁,多线程切换而消耗cpu),多路I/O复用模型(多个网络连接复用一个线程)
 支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。
 持久化:把内存的数据保存到磁盘
 原因:
 基于内存的数据库,容易丢失
rdb:
 每隔一段时间或者key改变达到一定数量自动往磁盘保存一次
aof:
 每执行一次命令就写入aof文件,如果数据丢失了就读取这个文件恢复数据
缓存穿透:查询一个不存在的数据结果为空,导致每次直接查询数据库。
解决方案:每次查询结果为空时也缓存1分钟。
缓存击穿:缓存过期,同一时间大量用户全部请求进入到数据库
解决方案:设置永不过期,加入互斥锁
缓存雪崩:缓存出现问题或者大批量缓存同时失效,全部请求进入数据库,导致服务挂掉
解决方案:哨兵模式集群模式高可用,限流或者熔断降级,缓存时间设置永不过期,不要设置同时失效

操作字符串的类有:
String、StringBuffer、StringBuilder的区别
String每次都会生成一个新的对象,其它都是在原有对象追加
StringBuffer线程安全,StringBuilder线程不安全,性能高
默认16,不够会自动进行扩容工作,扩展为原数组长度的2倍加2,创建一个新的数组,并将数组的数据复制到新数组。

悲观锁:数据库sql控制
乐观锁:版本号控制

cookie数据存放在客户的浏览器上,session数据放在服务器上
单个cookie在客户端的限制是3K

幂等性
定时任务
导出处理

消息队列:
为什么要使用:异步,分散服务器压力,解耦
 重复消费:
使用数据库字段或者redis建立唯一键判断
 消息丢失:
消费者接受消息之后告诉生产者
 消息积压:
开启多个消费者或者多线程处理

关键字作用:
 static:
修饰变量,修饰方法,静态块,静态内部类,静态导包,不会被序列化
为什么java中静态方法不能调用非静态方法和变量?
因为静态方法在类加载的时候就已经分配内存了,而非静态方法要在对象初始化之后才存在,然后通过类的对象去访问
 volatile:
可见性,有序性(由于虚拟机可能会对代码重排序)
 final:
基本类型:值无法修改
数据类型:对象地址的引用不能修改
类成员变量:必须赋值,否则报错
方法:无法重写,可以被继承
类:无法被继承
 transient:
不会被序列化
 synchronized:
jdk自带,非公平锁(不保证线程顺序),不能获取到锁,悲观锁,计数器+1阻塞,-1变为0释放
 Lock:
java.uiti下面的接口,可以公平锁,可以获取到锁,可响应中断,需要手动释放,乐观锁cas+volatile
 ArrayList:
查询快
 LinkedList
插入,删除快
双向链表结构
 HashMap:
线程不安全
数组+链表实现
HashMap无序,LinkedHashMap有序
关键字16,0.75,12,8,6,2
链表解决哈希冲突
put方法先判断hashcode相等,在判断equals
 HashTable:
线程安全,synchronized锁整张hash表
 ConcurrentHashMap:
数组加数组加链表
线程安全,分段锁实现,volatile让value具有可见性
 HashSet:
基于HashMap实现
value为什么用对象不用null是因为:add方法返回的是一个boolean,为空返回true,而hashmap返回的是value

线程:
继承Thread重写run方法,因为单继承局限性不推荐
实现Runnable接口
实现Callable接口,有返回值
 状态:
创建new、就绪start、运行run、阻塞sleep,死亡stop
 属性:
编号(ID)
名称(Name)
线程类别(Daemon)
优先级(Priority
 确定设置的线程数:
耗cpu的设置为:cpu个数+1,耗IO设置为:2倍cpu个数+1 
 线程池ExecutorService:
execute():只能执行 Runnable 类型的任务。
submit():可以执行 Runnable 和 Callable 类型的任务。
    参数详解:
1.corePoolSize:线程池中的常驻核心线程数
2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于1,Runtime.getRuntime().availableProcessors() * 2 这个意思是处理器核心数*2
3.keepAliveTime:多余的空闲线程的存活时间,当空闲时间达到keepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。
4.unit:keepAliveTime的单位
5.workQueue:任务队列,被提交但尚未执行的任务
6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可
7.handIer:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)
 拒绝策略:
1:直接报错,抛出异常
2:丢弃提交的线程
3:丢弃最老的一个线程
4:不会丢弃,谁提交任务谁执行
 优点:
重用存在的线程,减少对象创建销毁的开销
有效控制最大并发数,避免过多资源竞争

mybaits工作原理:
加载配置文件
创建SqlSessionFactory会话工厂
返回SqlSession的实现类DefaultSqlSession对象
获取接口代理对象
执行sql语句
返回结果集


谈一下你在项目中解决过的比较复杂的问题

Aop设计:

说出5条IO的最佳实践
说出至少5点在Java中使用线程的最佳实践

实战能力

有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的。

开发中有没有遇到什么技术问题?如何解决的

如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能。

新浪微博是如何实现把微博推给订阅者

Google是如何在一秒内把搜索结果返回给用户的。

12306网站的订票系统如何实现,如何保证不会票不被超卖。

如何实现一个秒杀系统,保证只有几位用户能买到某件商品。

软能力

如何学习一项新技术,比如如何学习Java的,重点学习什么

有关注哪些新的技术

工作任务非常多非常杂时如何处理

项目出现延迟如何处理

和同事的设计思路不一样怎么处理

如何保证开发质量

职业规划是什么?短期,长期目标是什么

团队的规划是什么

能介绍下从工作到现在自己的成长在那里


 

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值