面试随笔整理

1.Java基础

1.1 jdk1.8新特性 Lambda表达式、函数式接口、方法引用和构造器调用、Stream API、接口中的默认方法和静态方法、新时间日期API
1.2 Object对象常用方法 clone()、equals()、getClass()、hashCode()、notify()、wait()
1.3 String对象常用方法endsWith()、indexOf()、isEmpty()、length()、replace()、split()、substring()

1.4 常用的流
按功能来分:输入流(input)、输出流(output);
按类型来分:字节流和字符流;
字节流和字符流的区别是:字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据。

1.5 == 与equals(https://blog.csdn.net/caoxuecheng001/article/details/88804286)
一、==
1)用于比较基本数据类型(也称原始数据类型,byte、short、char、int、long、float、double、boolean,应用==)时,比较的是基本数据类型的值是否相等;
2)用于比较引用数据类型时,比较的时引用数据类型在内存中的存放地址(确切的说,是堆内存地址);
注:对于引用数据类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。
二、equals()方法
1)Object的eques()方法和==一样,可用来检查两个对象是不是同一个;
2)该方法需要重写,例如String重写的equals()方法,用于比较两个字符串的内容是不是相同;

1.6 synchronized关键字
1)在同步语句块时,synchronized关键字经过编译后,会在同步块的前后形成monitorenter和monitorexit两个字节码指令,代表对象实例或者Class对象作为线程要持有的锁;
2)在修饰方法时,synchronized关键字经过编译之后,会生成ACC_SYNCHRONIZED标识,代表该方法是一个同步方法。

2. 容器

3. 多线程

 引用: https://blog.csdn.net/m0_48795607/article/details/109076329)

3.1 Java中实现多线程的几种方法
1) 继承Thread类;
2)实现Runnable接口;
3)实现Callable接口通过FutureTask包装器来创建Thread线程;

3.2 如何停止一个正在运行的线程
1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止;
2)使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。
3)使用interrupt方法终端线程。

4、反射
5、对象拷贝
6、Java Web
7、异常
8、网络
9、设计模式

10、Spring/SpringMvc

10.1

11、SpringBoot/SpringCloud

11.1 SpringCloud五大核心组件
    1)Eureka(Nacos类似):服务架构的注册中心,专门负责服务的注册和发现;
                            服务启动时,Eureka会将服务注册到EurekaService,并且EurakeClient还可以返回过来从EurekaService拉去注册表,从而知道服务在哪里
    2)Feign(OpenFeign类似):@FeignClient注解创建动态代理,然后根据接口上的@RequestMapping等注解来动态构造出你要请求的服务地址。
                               基于fegin的动态代理机制,根据注解和选择机器,拼接url地址,发起请求
    3)Ribbon:负载均衡,默认使用的是RoundRobin轮询算法
               服务间发起请求的时候,基于Ribbon服务做到负载均衡,从一个服务的对台机器中选择一台
    4)Hystrix:隔离、熔断以及降级的一个框架,降级后手工处理数据
                发起的请求是通过Hystrix的线程池来走,不同的服务走不同的线程池,实现了不同的服务调度隔离,避免服务雪崩的问题
    5)Zull:微服务网关,负责网络路由。
             如果前端、后端、移动端调用后台系统,统一走Zull网关转发请求给对应的服务

12、Hibernate
13、MyBatis

13.1 MyBatis中#{}和${}的区别
     1)# 将传入的数据当成一个字符串,会对自动传入的数据加一个双引号;
     2)$ 将传入的数据直接显示在sql语句中;
     3)# 方式能够很大程度上防止sql注入,而$无法防止sql的注入;
     4)一般能用#的就不用$,$一般用于传入数据库对象,例如传入表名;
     5)mybatis排序时使用order by动态参数时需要注意,用$而不是#;

14、RabbitMQ(https://blog.csdn.net/qq_39470733/article/details/80576013)

14.1 为什么要使用消息队列?
     1)解耦
        传统模式:系统间耦合性太强,例如:系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦。
        中间件模式:将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。
     2)异步
        传统模式:一些非必要的业务逻辑以同步的方式运行,太耗费时间。
        中间件模式:将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
     3)削峰
        传统模式:并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常
        中间件模式:系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。

15、Kafka

16、Zookeeper与Dubbo
17、MySql
18、Redis

18.1 redis五种数据类型:string 字符串(可以为整形、浮点型和字符串,统称为元素)
                        list   列表  (实现队列,元素不唯一,先入先出原则)
                        set    集合  (各不相同的元素)
                        hash   hash散列值(hash的key必须是唯一的)
                        sort set 有序集合

18.2 如何防止redis雪崩???(https://blog.csdn.net/qq_35433716/article/details/86375506)
     1)对于“对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。”
        解决方法:在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期;
     2)对于“redis挂掉了,请求全部走数据库”
        解决方案:事发前->实现redis的高可用(主从架构+Sentinel(哨兵)或者Redis Cluster(集群)),尽量避免Redis挂掉这种情况发生。
                  事发中->万一redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
                  事发后->redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

19、JVM
Java Virtual Machine - Java虚拟机
19.1 静态方法加锁:static synchronized是类锁
非静态方法加锁:synchronized是对象锁
19.2 一个锁的是类对象,一个锁的是实例对象
若类对象被lock,则类对象的所有同步方法(static synchronized func)全被lock
若实例对象被lock,则该实例对象的所有同步方法(synchronized func)全被lock

19.3 JVM的内部体系结构分为三部分:类装载器(ClassLoader)子系统、运行时数据区、执行引擎

20、Vue

21、数据库知识

21.1 如何防止sql注入???
    1)代码层防止sql注入攻击的最佳方案就是:sql预编译;
    2)确认每种数据的类型,比如时数字,数据库则必须使用int类型来存储;
    3)规定数据长度,能在一定程度上防止sql注入;
    4)严格限制数据库权限,能最大程度减少sql注入的危害;
    5)避免直接响应一些sql异常信息,sql发生异常后,自定义异常进行响应;
    6)过滤参数中含有的一些数据库关键词;

21.2 sql如何快速查出前5条数据?
    oracle:
    select * from table1 where rownum <=5
    mysql:
    select * from table1 where 1=1 limit 5
    sqlserver:
    读取前5条:select top(5)* from table1 where 1=1
    读取后5条:select top(5)* from table1 order by id desc
    access:
    select top(10)* from table1 where 1=1
    db2:
    select column from table1 where 1=1 fetch first 10 rows only

21.3 如何优化sql语句执行效率?
    (1)尽量选择较小的列
    (2)将where中用的比较频繁的字段建立索引
    (3)select子句中避免使用‘*’
    (4)避免在索引列上使用计算,not,in和<>等操作
    (5)当只需要一行数据的时候使用limit 1
    (6)保证表单数据不超过200w,适时分割表
    (7)针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况

21.4 什么是存储过程,使用存储过程的好处?
        存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字给出参数来执行它。
    存储过程是数据库中的一个重要对象,任何一个设计良好 的数据库应用程序都应该用到存储过程。
     优点:
     (1)允许模块化程序设计,就是说只要创建一次过程,以后在程序中就可以调用该过程任意次。
     (2)允许更快执行,如果某操作需要执行大量sql语句或重复执行,存储过程比sql语句执行的要快。
     (3)减少网络流量,例如需要数百行的sql代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。
     (4)更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们的执行存储过程。

22、线程池

22.1 简述一下你对线程池的理解
(线程池如何用、线程池的好处、线程池的启动策略)
     1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成得到消耗;
     2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行;
     3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统稳定性,使用线程池可以进行统一的分配,调优和监控。

22.2 Java并发编程(volatile关键字解析)(https://www.cnblogs.com/dolphin0520/p/3920373.html)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值