多益一面

发布时间 2023-10-31 10:39:11作者: 求知律己

1.基础

1)多态:一个对象具有多种状态,即提供一个统一的接口,使不同类型的对象可以实现同一个操作或方法具体表现为父类引用指向子类实例。如Map<Integer, Integer>map = new HashMap<>();

2)继承:不同类型对象,相互之间经常有一定共同点。

  1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法)。但是父类的私有属性和方法,子类只能拥有,无法访问。
  2. 子类可以拥有自己的属性和方法,即子类可对父类进行拓展。
  3. 子类可以自己方式实现父类方法。

3)接口:可以通过接口实现多个类

4)动态绑定和静态绑定:

  1. 动态绑定:在运行时才能确定调用哪个函数或方法。当引用变量是一个基类类型,实际引用类型是派生类类型,动态绑定会根据对象实际类型调用对应方法或函数。动态绑定的作用是实现多态。
  2. 静态绑定:编译时即可确定调用哪个函数或方法。如一个类中有一个静态方法,在编译时就可确定调用该方法的地址,因此静态方法在编译时就确定的

5)浅拷贝和深拷贝,如果数组B拷贝到A,不拷贝地址

  • 浅拷贝:堆创建不同对象,但共用同一个内存地址
  • 深拷贝:拥有各自的对象以及内存地址
  • 引用拷贝:共用一个对象以及内存地址

使用深拷贝,不共用相同内存地址

6)JVM可能出现的异常,怎么避免

  • OOM(内存溢出)检查是否存在内存溢出,及时释放不再使用的对象(通过GC Root引用链查找)可达性分析;调整堆大小
  • StackOverflow(无限递归或方法调用层次多)检查是否存在无限递归;增加JVM栈大小,增加栈容量

7)创建对象的方式,new与反射哪个效率高
方式:new 、clone、反射、序列化和反序列化

 

8)MYSQL的快照读和当前读

MYSQL Innodb引擎默认级别虽是可重复读,但它能在很大程度上避免幻读(并不是完全解决),解决方式分别是快照读当前读
快照读(普通select语句):通过MVCC方式方式解决幻读事务执行过程中看到的数据,一直跟这个事务启动时看到数据一致,即使中途有其他事务插入一条数据,是查询不到该数据的,很好避免了幻读。
当前读(select...for update等语句)通过next-key lock(记录锁+间隙锁)解决幻读当执行select...for update语句时,会加上next-key lock如果有其他事务在next-key lock锁范围内插入一条记录,那么这个插入语句会被阻塞,无法成功插入,可很好避免幻读。

9)索引类型可以分为几类,聚簇索引

  1. 按照数据结构分类分为B+tree索引hash索引Full-text索引
  2. 按照物理结构分为聚簇索引和二级索引
  3. 按照字段属性分类,分为主键索引唯一索引前缀索引
  4. 按照字段个数分类:单列索引联合索引
  5. 聚簇索引主键索引二级索引辅助索引

10)如何查看索引是否有效
通过explain关键字查看查询是否使用索引,其中possiblekey字段表示可能用到的索引type表示表中找到所需行的方式真实是否使用索引,其中至少达到range以上最好达到ref。其中range>index>all。key列显示Mysql实际决定使用的键(索引)包含FORCE INDEXUSE INDEXIGNORE INDEX。

11)分页查询limit注意点
深度分页,即指定分页大小前面的偏移量

12)Redis缓存和MYSQL数据一致性(旁路缓存)
先更新数据库再删缓存,缓存设置一个缓存时间,图形如下所示:
13)Redis性能:高性能(单线程处理任务,其余线程分别处理关闭文件,AOF刷盘、释放内存)、高可用(集群、主从复制)
14)缓存雪崩、缓存击穿、缓存穿透是什么以及它们的解决方案

缓存雪崩大量缓存数据在同一时间过期(失效)时,如果此时有大量用户请求都无法在Redis中处理,于是全部请求都直接访问数据库导致数据库压力剧增严重时会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃。
解决方案:1)将缓存时间随机打散,即在原有失效时间上面增加一个1到10分钟的随机值。这样缓存时间不会都重复,降低缓存集体失效概率。2)设置缓存不失效,即后台服务器更新缓存数据
缓存穿透:在缓存和数据库中大量数据查不到
缓存击穿缓存中某个热点数据过期,大量请求访问该热点数据,无法从缓存中获取,直接访问数据库,数据库很容易被高并发请求冲垮。其实缓存雪崩跟缓存击穿很类似,一个是缓存数据一个是热点数据
解决方案:1)互斥锁:同一时间只有一个业务线程请求缓存,未能获取互斥锁的请求,需要等待锁释放后重新读取缓存,要么返回空值或默认值。2)不给热点数据设置缓存时间,由后台异步更新缓存。或在热点数据失效前,提前通知后台线程更新缓存或重新设置过期时间。
15)Web安全
①xss是什么,如何避免

XSS(跨脚本攻击)是种常见的Web应用程序安全漏洞,攻击者通过受信任的网站上注入恶意脚本,使用户在浏览器中执行这些脚本,从而实现攻击目的,如窃取用户敏感信息,会话劫持。
解决方法:1)输入验证和过滤,服务器对用户输入内容进行严格地输入验证和过滤,确保只接受合法的输入数据,拒绝或转义可能含有恶意代码的特殊字符,如HTML标签,JavaScript代码。2)输出/编码/转义:将用户输入的数据输出到HTML页面中时,使用合适的编码方式对数据进行转义,防止恶意脚本被浏览器执行。常用转义方法包括HTML实体编码,JavaScript转义等。3)使用安全框架,有些框架内置安全机制,能够有效过滤和转义用户输入内容,减少XSS攻击。4)设置合适的HTTP头:设置HTTP响应头的Content-Security-Policy(CSP)和X-XSS-Prottion字段,帮助浏览器自动组织XSS攻击。

②cors是什么,如何避免

cors(跨域资源共享)是一种浏览器的安全机制,允许Web应用程序在不同域名之间共享资源。跨域请求指是在浏览器的同源策略下,当一个网页上的脚本试图访问另一个域名下的资源会被阻止。
避免方式:1)服务器设置CORS响应头空值跨域资源共享,在响应头添加“Access-Control-Allow-Origin”指定允许访问资源的域名,也可设置为“”,允许任何域名访问,或设置为特定域名,只允许指定的域名访问。2)设置其他CORS相关响应头,如 Access-Control-Allow-Methods(指定允许使用的请求方法)、Access-Control-Allow-Headers(指定允许的请求头字段)3)使用WebSocket代替AJAX,是一种全双工通信协议,可在不同域名之间建立实时的双向通信。
2.编程题
给一个不重读集合,求所有子集