Java后端面试题(day16)

目录

java常见的引用类型


java的引用类型一般分为四种:强引用、软引用、弱引用、虚引用

  1. 强引用:普通的变量引用

    • 第一种:直接new

      java 复制代码
      User user = new User();
    • 第二种:通过反射

      java 复制代码
      Class<?> studentClass = Class.forName("com.beiyou.model.student");
      Object o = studentClass.newInstance();
  2. 软引用:

    • 当所剩内存空间不够我们新的对象存储的时候,直接干掉软引用。
    • 当所剩内存空间够我们新对象的存储的时候,不会删除我们的软引用对象。
    java 复制代码
    SoftReference<User> user = new SoftReference<User>(new User());
  3. 弱引用:

    将对象用WeakReference弱引用类型的对象包裹,只要GC执行了,他就会被回收掉.

    java 复制代码
    public static WeakReference<User> user = new WeakReference<User>(new User());
  4. 虚引用:虚引用也称为幽灵引用或者幻影引用

java中深拷贝和浅拷贝


Java中,对象的复制分为深拷贝(Deep Copy)和浅拷贝(Shallow Copy)两种方式,主要区别在于对对象内部引用类型成员变量的处理不同。

  • 浅拷贝(Shallow Copy)

    浅拷贝是指在创建新对象时,对于对象中的基本数据类型 的成员变量会复制其值,而对于引用类型 成员变量则只复制其引用

    实现浅拷贝的方式

    Java中实现浅拷贝的一种常见方式是通过 Object类的clone()方法 。需要注意的是,clone()方法是受保护的,所以通常 需要在类中重写此方法并声明为public ,同时还需要实现Cloneable接口

  • 深拷贝(Deep Copy)

    深拷贝则是 完全复制对象及其所有引用类型成员变量指向的对象,即不仅复制引用本身,还复制引用指向的对象。

    Java中实现深拷贝有几种常见方式

    1. 序列化
    2. 构造函数
    3. 复制对象的属性
    4. 使用第三方库

如何设计一个秒杀系统?


秒杀活动请求以公网 为划分点,可以分为:前端部分、后端部分。

整体思路是尽量将流量挡在前面,让尽量少的流量留到后端部分。因为越往后端,我们的处理逻辑就越重,其处理能力也越弱。

  • 前端优化

    对于前端部分来说,常见的优化手段有:【页面静态化 + CDN】、【请求频率限制】。

    CDN: 内容分发网络,它由非常多台 分布在世界各地 的缓存服务器组成。每次用户请求特定域名的时候,会转发到对应 CDN 的 DNS 解析服务器,随后会返回一台 离用户地理位置最近的一台 CDN 服务器

    • 页面静态化 + CDN
      可以将所有可以静态化的内容全部静态化,然后将其配置在 CDN 服务器上。这样既提高了用户打开页面的时间,又减少了后端服务器的压力
    • 请求频率限制
      求频率限制,指的是根据业务的特点,在前端做一些流量拦截,减少后端服务器的压力。常见的拦截方式有:
      1. 设定一个请求概率,只允许 30% 的概率向后端发送接口请求。
      2. 设定一个请求频率,例如 10 秒钟只能请求 1 次,随后按钮置灰。
  • 后端优化

    后端的优化有如下几种方式:

    • 增加缓存层 + 预热数据
    • MQ 异步处理
    • 限流、熔断、降级
    • 业务端优化

谈一下对高并发的理解,平时怎么处理高并发问题?


高并发是指系统在同一时间段内 能够处理 大量 并发请求的能力。

在互联网应用中,随着用户数量的增长,系统的访问量也会急剧增加,这就需要系统能够支持高并发,以保证服务的稳定性和响应速度。

下面是一些关于高并发的处理方法:

  1. 分库分表
  2. Spring Cloud Sentinel [哨兵]
  3. K8S 部署应用 [可以动态扩展副本]
  4. 用nginx作负载均衡
  5. Redis作缓存层
  6. mysql数据库用集群 (读写分离)
  7. Lua脚本减少对数据库的请求
  8. MQ异步
  9. 前端静态页面
  10. CDN

Comparable和Comparator区别?


  • 相同点:ComparableComparator 都是用于比较排序

  • 不同点:

    1. 接口所在包不同:java.lang.Comparablejava.util.Comparator
    2. 比较逻辑不同:Comparable是内部比较器,Comparator是外部比较器
    3. 排序方法不同:Comparable重写方法compareTo(T o),Comparator重写方法compare(T o1, T o2)
    4. 排序规则数量限制不同:Comparable 唯一字段排序,Comparator可以有 多个字段排序

解决hash冲突有哪些方法?


  1. 链表法
  2. 开放地址法
  3. 再hash法
  4. 公共溢出区

Synchronized锁的升级过程


  • 一开始是无锁状态

  • 当一个线程首次获得对象锁时,JVM会设置为 偏向锁。

  • 当第二个线程尝试获取偏向锁失败时,偏向锁会升级为 轻量级锁

  • 此时,JVM会使用CAS自旋操作来尝试获取锁,如果成功则进入临界区域,否则升级为 重量级锁。

相关推荐
汇能感知13 分钟前
光谱相机的工作原理
经验分享·笔记·科技·相机
紫罗兰盛开13 分钟前
分布式调度框架学习笔记
笔记·学习
汇能感知19 分钟前
光谱相机在农业中的具体应用案例
经验分享·笔记·科技
Q_192849990620 分钟前
基于Spring Boot的个人健康管理系统
java·spring boot·后端
地球空间-技术小鱼1 小时前
YUM(Yellowdog Updater, Modified)和DNF(Dandified YUM)简介
linux·运维·服务器·笔记·学习
m0_748245171 小时前
Web第一次作业
java
小码的头发丝、1 小时前
Java进阶学习笔记|面向对象
java·笔记·学习
m0_548514771 小时前
前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现
java·前端·javascript
坊钰2 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表