Java面试总结

作者: h2coder | 来源:发表于2021-02-13 22:35 被阅读0次
    • 你怎么理解分布式的?

      • 将系统中独立的业务服务,分拆到不同的机器上,可以独立的部署,独立的运维。
    • SpringCloud主要有哪些组件及其作用?(5大组件)

      • Eureka注册中心,服务有很多个,可能随时会增加,就需要有一个注册中心,将多个服务的实例的信息保存,让服务之间查找通过注册中心去找,并且每个服务和注册中心有一个心跳连接,一定时间如果没有受到心跳,则任务服务不可用,在下一次服务查找(从来没调用过),就会剔除掉这个服务。但如果之前调用过,也还是有信息缓存,还是能调用通的。
      • Ribbon和Feign,它们主要是负责负载均衡调用,当从注册中心拿到服务列表,服务的实例可能有3、5个,这时候就要按照负载均衡策略确定调用哪个服务。
      • hystrix,当我们调用服务的时候,服务有可能挂掉了,为了服务的健壮性,要用到另外一个组件叫hystrix,它主要是做服务的熔断、降级以及限流的。
      • SpringCloud Config,主要是负责总多服务的一些配置管理,是一个统一的配置中心。
      • 网关zuul,服务有多个地址,前端配置那么多地址是不合理的,一般我们会统一地址,给前端调用。除了统一调用,还有统一鉴权,以及多服务的反向代理。
    • Zuul的权限怎么设计

      • Rbac,实体涉及用户、角色、权限,用户和角色是多对多,角色和权限也是多对多。
    • 项目做权限管理,用的什么框架

      • 单体应用用的是shiro,微服务项目用spring security。
    • 资源的url,有做一些资源限制吗?

      • 单例应用,先登录,再判断登录用户是否有权限给你去访问这个资源。
      • 微服务项目,用jwt来做,登录后返回token,并且将权限数据、用户信息保存起来,下次再访问,携带token,进行比对,直接去缓存的信息中找,就不需要去数据库中查找。
    • 分布式项目的分布式事务,你们怎么处理的?

      • 使用的事seat中的二阶段提交的方案,但效率会比较低。所以设计时尽量不要让它跨服务器事务,真的要跨的时候,才使用二阶段提交方案。
      • Tcc方案,缺点是要将事务的处理耦合到业务逻辑当中,会侵入我们的业务代码中,虽然效率比seat的二阶段提交高一点。
    • 分布式事务,还有哪些基于tcc方案的吗

      • tcc
      • 两段式提交
      • 最大努力通知
      • 最终消息可靠
    • 负载均衡算法有哪些?

    • Eureka的底层有了解过吗

    • Eureka挂了话,怎么办?

    • 说一下,你对Spring的了解

    • Jdk的动态代理和cglib的动态代理有什么区别吗?

      • Jdk需要接口,cglib不需要,但要求类不能是final,并且代理方法也不能是final
    • jdk动态代理和cglib的动态,哪个性能比较好?

    • Aspectj,你有听说过吗?

    • Spring是如何为我们创建对象的?

      • 通过配置文件,或者注解标识,获取要创建的对象的全限定类名,通过反射创建对象
    • Spring容器创建的对象,它的作用域有哪些?

      • Singleton单例、prototype多例、request、session
    • Spring容器中,默认对象是单例的,可能会产生线程安全问题,Spring是怎么解决的?

      • 用ThreadLocal来解决,变量的线程隔离
    • ThreadLocal底层是怎么实现的?

      • 内部有一个ThreadLocalMap,类似于Map的功能,key-value键值对的方式存储
    • Spring怎么去解决循环依赖的问题?

      • 三级缓存
    • ORM框架,用得最多是哪个?

      • MyBatis
    • MyBatis的动态sql是怎么去写?

      • 四大标签select、insert、update、delete。子标签有if、where。
      • 用#{}获取参数,拼接到sql的查询参数中。还有一种是${}来获取
      • Sql标签可以提取公共的查询字段,再用includ标签引入
    • MyBatis中,#符和$符有什么区别?

      • #符是预编译,能预防SQL注入,$符是字符串拼接,会SQL注入风险。
    • MyBatis中,Mapper和XML中的方法怎么对应起来的?

      • 类的命名空间+方法名,组成id来做唯一
    • MyBatis的XML中,常用的标签有哪些?

      • select、insert、update、delete、resultMap、一对多(collection)、多对多、if、where、choose、foreach
    • 嵌套查询和嵌套结果有什么区别?

      • 嵌套查询,相当于联查,只发送一次sql,嵌套结果可以做懒加载,是多次发送sql的结果
    • MyBatis怎么在插入后,获取插入的记录的id

      • useGenerateKeys属性设置为ture,或者使用selectKey标签
    • HashMap的底层是怎样的?

      • 1.7使用数组+链表,1.8使用数组+链表+红黑树。插值时会对key做一个取余来做hash运算来存储到数组中,当发现hash到的值已经有存值后,发生hash冲突,就会用链表保存起来,1.8版本对链表做了优化,当链表长度达到7时,会将链表转换为红黑树。
    • HashMap的扩容,加载因子是多少?初始容量是多少?为什么扩容是2的幂次

      • 加载因子为0.75,初始容量为16,2的幂次,用位运算代替取余
    • Cookie和Session的区别

      • 他们都是会话跟踪技术,Cookie是保存在客户端的,而Session保存在服务端,而Session还是依赖于Cookie的,Session的ID是保存在Cookie中的。
    • 如果浏览器将Cookie禁用了以后,Session还能用吗?

      • 可以url传参的方式,将SessionID进行传输
    • 数据库的隔离级别,默认是什么?

      • read_uncommitted读未提交、read_committed读已提交、repeatable_red可重复读、serializable串行化
    • 什么是脏读,什么是幻读,什么是不可重复读?

      • 脏读:一个事务读取到了另外一个事务还未提交的数据。
      • 幻读:
      • 不可重复读:
    • 哪些隔离级别会产生脏读、幻读、不可重复读

      • read_uncommitted读未提交会产生,幻读除了serializable串行化其他都会产生。
    • Sql的执行过程是怎样的?

      • from -> where -> group by -> having -> select -> order by -> limit
    • 数据库死锁有出现过吗?

    • 做过数据库的优化吗?

      • 反范式,冗余字段,避免联查来提高查询效率
      • 查询不要写select *
      • 添加索引
      • 分库分表
      • 水平分表(一个表的数据过多,分拆到好几张表,分表后,要找到,需要一些算法去确定)和垂直分表(将一些不经常查的字段分到别的表)
      • 读写分离
      • 缓存
    • 分表的策略有哪些?

      • 区间(范围),id从1到1万的一张表,1万到2万的放下一张表,以此类推
      • 时间,今年的都放一张表,或者按月分,一个月一张表。
      • Hash算法,通过一个标识,算出一个表名
    • 分表后,查询到某个范围,跨表了,怎么去查询

      • 通过标识查询出在哪些表中有,分别查询出来,用sql的union语句将表数据合并起来,再将合并结果返回出去。
    • union和unionall有什么区别?

      • union有去重,而unionall不去重。
    • 索引,你有了解过它的底层吗?

      • 案例,查第十万条数据,没有索引,会从头到尾去全表扫描,效率是很低的,定义一个索引结构,从索引结构中去查,查到标识后,直接就定位过去。
      • MySQL生成索引用的是b+tree。树的深度不会太深。
    • B+tree相对于二叉树有什么区别?

    • 数据库的存储引擎,myisam和innodb,在索引上有什么区别?

      • myisam是不支持事务的,所以读操作比较多。
      • Innodb是支持事务的。
      • Innodb的数据时和索引放一起的,而myisam的数据和索引是分开的。锁粒度,一个myisam是表级,innodb是行级。
    • 项目中,有遇到锁表的情况吗?

    • 具体的数据库优化方式有哪些?

      • Explain看sql查询速度,全文检索优化
    • MySQL支持的索引类型

      • 普通索引、唯一索引、主键索引
    • 索引的底层结构是怎样的?

      • 底层是B+Tree,和红黑树有什么区别?红黑树是平衡二叉树,B+Tree是多叉查找树,数据量大时,红黑树的树会变高,而B+Tree在千万级量级时,还是只有3层
    • 听说过聚集索引和非聚集索引吗?

      • 聚集索引:索引和数据存储在一起。非聚集:索引+内存地址,内存地址指向数据
    • 平时怎么用redis?怎么保证缓存和数据库的双写数据一致性

      • 先删redis缓存,再更新数据库,下次再访问时,从数据库中查,再放到redis缓存
      • 按业务来使用不同的方案,没有十全十美的方案,只有最适合的方案。
    • 你还了解redis的其他什么东西?

      • Redis是单线程+多路io复用,存储在内存中,比操作数据库要快,存储类型有string、list、hashset、sortset。数据淘汰策略,例如lru算法,淘汰掉最近最少使用,淘汰最少使用的缓存。持久化操作有rdb和aof,rdb是每隔一段时间进行一次持久化,而aof是没操作命令一次,就持久化一次。
    • 除了用redis来做缓存,还用它做过什么东西吗?

      • 保存登录信息,30分钟后过期,就用到redis的自动过期的功能。
      • 队列,有一个list,从一头进,另外一边出,就可以用来做队列,保证一致性、削峰等
    • Redis用来做过分布式锁吗?

      • 用redis的redisson(操作redis的一个框架)。用redis的setnx命令的话,会将你设置的值和过期时间的操作,变成一个原子性操作。但有可能他还没操作完,导致锁已经释放了,这时候就会出现问题。
    • Zookeeper怎么实现分布式锁?

      • Zookeeper有一个叫动态节点的东西,当有人访问的时候,对这个标识新增一个节点,代表已经有人来操作了,后来的人访问时,先看标识是否有节点,有的话,就等待。直到别人操作完了,将这个节点删掉了。再进行查,进行判断和操作。(多个人去访问的时候,都会在Zookeeper上产生节点,基于它的选举机制,谁先拿到那个数字比较大,或者比较小,就用那个锁)
    • 要实现缓存,用redis实现缓存,和其他方式实现缓存有什么区别?

      • 如果使用map,或者MyBatis的二级缓存,都是再JVM上实现的,多个服务之间是不能共享的,而使用redis是一个公共的地方,不依赖于JVM。(本地缓存和分布式缓存的区别)
    • 分布式锁的原理是什么?

      • 多个服务,多个进程,去访问公共的一个数据,例如2个人去商城买商品,查询的时候都查到有库存,有5个,2个人都想要买3个,但到买的时候,第一个人买了3个,只剩下2了,另外一个去买,就发现库存不足了。解决方案是,在进行查的时候,就加上锁,另外一个去查的时候就不能查,只有当第一个人操作完,第二个人才能进行查。由于他们是2个进程,我们就要提供一些公共的东西来作为锁,可以使用数据库、redis、zookeeper等,在公共的东西打标记,就可以让第二个去查之前,先去看标记,发现被锁了,就等待。
    • Redis的rdb和aof,这2种之持久化策略的区别吗?

    • 平时项目中,rdb和aof用哪种?

      • 2种都用,rdb间隔一段时间才备份,如果在备份区间内宕机,数据就会损失一部分。
    • 什么是Restful风格

      • 请求的uri对应着一种资源,请求的方法对应着资源的操作。Restful风格的接口,名称结尾都是避免用动词,具体的动作,通过http请求方式来表达。
    • 接口幂等性

    • Linux如何动态去查看Tomcat一些日志

      • 用tail -f命令,查看catalina.out日志文件,tail -f catalina.out,还有一个-n参数,表示查看末尾的多少行,例如tail -n 100 catalina.out,表示查询日志文件末尾100行的内容
    • Linux用哪个命令去查询服务的进程号

      • ps -ef | grep 服务名
    • Linux怎么去杀掉进程?

      • kill -9 进程pid,-9表示强制删除
    • Linux怎么全局查找文件

      • find -name ‘名称’
    • 线程和进程的关系是怎样的?

      • 线程依赖于进程
      • 进程是程序资源的基本的分配单位,线程是程序资源的基本调入单位。
    • 线程有哪些状态?

      • 1)初始状态,新创建一个线程对象,但没有调用start()方法
      • 2)就绪
      • 3)运行
      • 4)阻塞
      • 5)销毁
    • 线程常用方法有哪些?

      • 1)start(),开启
      • 2)getThreadName(),获取线程名称
      • 3)getThreadStatus(),获取线程状态
      • 4)interrupt(),中断
      • 5)yield(),线程让步
    • notify和notifyAll有什么区别?

    • 什么是线程安全?

      • 多线程环境下,对一个公共资源进行写操作就会出现安全问题,可能会出现数据不一致等问题。
    • 怎么解决线程安全问题?

      • 使用synchronize关键字进行加锁,可以用于代码块上、方法上、静态方法上
    • synchronize的锁膨胀过程(升级过程)是怎样的?

    • Java中的反射,可不可以获取到类中的私有变量或者私有方法

      • 1)先调用setAccess(true),设置允许访问
      • 2)再调用getDeclaredFields
    • 要创建一个自定义注解要怎么去创建?

      • 1)创建类型为@interface的类
      • 2)加上@Target注解,标识能作用于哪里,方法、变量、形参等
      • 3)加上@Retention注解,标识注解信息保留到什么阶段,运行期、编译期、Class等
      • 4)@Documented,是否被JavaDoc处理
      • 5)@Inherited,标识注解是否被自动继承,当查询注解时,目标类上如果没有查询到指定注解,那么会继续查找目标类的父类上是否有指定注解
    • 多态是怎么一回事?

      • 多态是Java的一种机制,首先要有类之间的继承或者实现关系,其次父类的引用指向子类对象,当子类有复写父类的方法时,调用对象的父类方法,会调用子类复写的方法。
    • 封装又是怎样的?

      • 提取公共父类,子类做特殊行为
      • 属性私有化,对外提供get、set方法
    • HashSet怎么做到存储元素去重的?

      • 通过调用类的hashCode和equals方法来决定类是否重复
    • TreeSet怎么做到存储元素排序和去重的?

      • 调用类comparable或者提供comparator比较器对象
    • ArrayList和LinkedList有什么区别?

      • ArrayList是数组实现的,LinkedList是用链表实现的
      • ArrayList适用于查询多的场景,他提供数组的索引提供查找,并且元素的地址是顺序的,所以查找速度比较快。但增删改会比较慢,每次改动都要复制数组移位
      • LinkedList适用于增删改多的场景,链表的增删改直接改节点的前、后即可
    • RandomAccess接口有什么作用?

      • 是一个标识性接口,ArrayList能够支持下标,快速访问获取
    • 序列化和反序列化有什么用?

      • 可以将对象持久化,持久化到磁盘中,或者网络上对象传输

    相关文章

      网友评论

        本文标题:Java面试总结

        本文链接:https://www.haomeiwen.com/subject/inqrdktx.html