当前位置: 首页 > article >正文

Java后端面试题(day16)

目录

  • java常见的引用类型
  • java中深拷贝和浅拷贝
  • 如何设计一个秒杀系统?
  • 谈一下对高并发的理解,平时怎么处理高并发问题?
  • Comparable和Comparator区别?
  • 解决hash冲突有哪些方法?
  • Synchronized锁的升级过程

java常见的引用类型


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

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

    • 第一种:直接new
      User user = new User();
      
    • 第二种:通过反射
      Class<?> studentClass = Class.forName("com.beiyou.model.student");
      Object o = studentClass.newInstance();
      
  2. 软引用

    • 当所剩内存空间不够我们新的对象存储的时候,直接干掉软引用。
    • 当所剩内存空间够我们新对象的存储的时候,不会删除我们的软引用对象。
    SoftReference<User> user = new SoftReference<User>(new User());
    
  3. 弱引用
    将对象用WeakReference弱引用类型的对象包裹,只要GC执行了,他就会被回收掉.

    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自旋操作来尝试获取锁,如果成功则进入临界区域,否则升级为 重量级锁。


http://www.kler.cn/news/341295.html

相关文章:

  • 【万字长文】Word2Vec计算详解(二)Skip-gram模型
  • 第三方软件测评机构简析:软件安全测试报告的内容和作用
  • 第一弹:计算机网络概述与UDP通信
  • 强化学习笔记之【DDPG算法】
  • 初始化数据的正确方式?
  • 计算机毕业设计 基于Python音乐平台的设计与实现 Python毕业设计 Python毕业设计选题 Vue 前后端分离【附源码+安装调试】
  • B端系统推荐使用UI框架,但是核心页面还是要设计的
  • 搭建一个普通的网站需要多少费用?
  • 等保测评与ISO 27001:融合构建全面网络安全管理体系
  • jdk 11.0.8 配置 classpath
  • go发送邮件:在Go语言中实现发邮件的教程?
  • ProteinMPNN数据输入主要函数介绍
  • 【SEO】什么是SEO?
  • Vue.js 过渡 动画
  • Rocky Linux 9搭建K8s-1.28.0+docker一主多从集群测试环境
  • 【算法刷题指南】BFS解决FloodFill算法
  • 云数据库价格贵吗?云数据库租用价格表
  • NFT 是什么?
  • 服务端口的查看和释放
  • CIME2025深圳国际热管理材料与设备展览会(宝安新馆|2025年6月25-27日)