JAVA中常用类型
一、包装类
1.1 包装类简介
java是面向对象的语言,但是八大基本数据类型不符合面向对象的特征。因此为了弥补这种缺点,为这八中基本数据类型专门设计了八中符合面向面向对象的特征的类型,这八种具有面向对象特征的类型,就叫做包装类,英文:wrapper class。
所有的基本数据类型和包装类型的对比如下图:

1.2 装箱和拆箱
-
装箱boxing : 由基本数据类型转型为包装类型。
-
调用包装类的构造器,进行装箱
-
调用valueOf()静态方法,进行装箱
-
-
拆箱 unboxing: 由包装类型转型为基本数据类型。
-
调用xxxValue()非静态方法,进行拆箱
-
public class Demo01 {public static void main(String[] args) {int age = 10;Integer a1 = new Integer(age);//用第一种方式进行装箱操作,由值转为了对象Integer a2 = Integer.valueOf(100);//用第二种方式进项装箱操作int s = a1.intValue();//拆箱操作,由对象转为了值int s1=a2.intValue();System.out.println(a1);System.out.println(a2);System.out.println(s+1);//打印结果是11,证明已经变回了值System.out.println(s1+1);//打印结果是101,证明已经变回了值} }
1.3 自动装箱和拆箱
为了方便获取包装类对象,从jdk1.5以后,提供了一个自动装箱的操作,也提供了一个包装类到基本数据类的自动拆箱操作。
自动装箱 : 直接使用一个基本数据类型的变量或字面值给一个包装类型的引用进行赋值即可; 省略掉的是 valueOf 方法
自动拆箱 : 直接使用一个包装类型的引用给一个基本数据类型的变量进行赋值即可;省略掉的是 xxValue 方法
Integer b=66;//实际上,底层直接帮我们调用了工具方法valueof()方法进行装箱
Short b1=new Short("20");
short b2=b1;//底层自动调用Shortvalue()自动拆箱
1.4 包装类的常量池
对于装箱操作后的包装类的对象,jvm在堆中,维护了一个常量池,该常量池适用于调用了valueOf()方法产生的包装类对象,以及自动装箱的包装类对象。不适用于new关键字创建的包装类对象。
Byte, Short, Integer, Long :创建了数值范围为[-127,128]的相应类型的缓存数据
Character :创建了数值在 [0, 127] 范围的缓存数据
Boolean 直接返回 true 或 false
两种浮点数类型的包装类 Float, Double 并没有实现常量池技术。
Integer b3=new Integer(11); Integer b4=Integer.valueOf(11); System.out.println(b3==b4);
证明b3和b4不是同一个对象,一个在包装常量池,一个在堆中
double d1 = 3.14;
Double d2 = Double.valueOf(d1);
Double d3 = Double.valueOf(d1);
System.out.println(d2==d3);
如何有常量池,那么d2和d3应该指向同一个地址,结果是true,但结果是false,证明没有常量池
1.5 包装类其他常用方法
工具方法:
static WrapperClassName valueOf(xxx value)
static WrapperClassName valueOf(String value)
static xxx parseXXX(String value)
static String toBinaryString(); 转成二进制
static String toHexString(); 转成16进制
static String toOctalString() 转成8进制
String line="123456"; int i=Integer.parseInt(line); System.out.println(i+1);//结果为123457,证明把字符串line转成了int类型的数字 int num = 1001; System.out.println(Integer.toBinaryString(num)); //1111101001 System.out.println(Integer.toOctalString(num)); // 1751 System.out.println(Integer.toHexString(num)); // 3e9
二、BigDecimal
提供该类的意图:就是为了更精确的运算。(double和float在运算时,有精度损失,科研中一般不用)
1.1 常用构造器
BigDecimal(String s): 推荐使用
BigDecimal(int v):
BigDecimal(long v):
BigDecimal(double v):
1.2 常用方法
BigDecimal add(BigDecimal other);
BigDecimal subtract(BigDecimal other);
BigDecimal multiply(BigDecimal other);
BigDecimal divide(BigDecimal other): 做除法时要注意,除数不能是0, 还有不能出现除不尽的情况,不然都会报异常。
public class Demo02 {public static void main(String[] args) {BigDecimal m =new BigDecimal("10");BigDecimal n =new BigDecimal("20");BigDecimal sum=m.add(n);System.out.println(sum);//调用了重写的toString,返回字符串样子。BigDecimal c=n.subtract(m);System.out.println(c);BigDecimal c1=n.multiply(m);System.out.println(c1);BigDecimal c2=n.divide(m);System.out.println(c2);} }
1.3 常用的舍入模式
BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
setScaler(1,BigDecimal.ROUND_CEILING)接近正无穷大的舍入
setScaler(1,BigDecimal.ROUND_FLOOR)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
1、ROUND_UP,向远离0的方向舍入,在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。
eg: 保留1位小数 1.60->1.6 1.61->1.7 1.66->1.7 , -1.62->-1.7
2、ROUND_DOWN,向接近0的方向舍入,在丢弃某部分之前,始终不增加数据(即,截断),该方式是只减不加。
eg: 保留1位小数 1.60->1.6 1.61->1.6 1.66->1.6 , -1.62->-1.6
3、ROUND_CEILING,向正无穷方向舍入,如果数值为正,舍入方式与ROUND_UP一致,如果为负,舍入方式与ROUND_DOWN一致,该模式始终不会减少计算数值。
eg: 保留1位小数 1.60->1.6 1.61->1.7 1.66->1.7 , -1.62->-1.6
4、ROUND_FLOOR,向负无穷方向舍入,如果数值为正,舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。该模式始终不会增加计算数值。
eg: 保留1位小数 1.60->1.6 1.61->1.6 1.66->1.6 , -1.62->-1.7
5、ROUND_HALF_UP,向“最接近的”数字舍入,也就是四舍五入。
eg: 保留1位小数 1.61->1.6 1.65->1.7 1.66->1.7 , -1.62->-1.6
6、ROUND_HALF_DOWN,向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式,也就是五舍六入。
eg: 保留1位小数 1.61->1.6 1.65->1.6 1.66->1.7 , -1.62->-1.6
7、ROUND_HALF_EVEN,向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
eg. 1.15->1.2, 1.25->1.2
8、ROUND_UNNECESSARY,计算结果是精确的,不需要舍入模式。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
1.4 BigDecimal常见问题
1、创建 BigDecimal精度丢失
在BigDecimal 中提供了多种创建方式,可以通过new 直接创建,也可以通过 BigDecimal.valueOf 创建。这两种方式使用不当,也会导致精度问题。
public static void main(String[] args) throws Exception {
BigDecimal b1= new BigDecimal(0.1);
System.out.println(b1);
BigDecimal b2= BigDecimal.valueOf(0.1);
System.out.println(b2);
BigDecimal b3= BigDecimal.valueOf(0.111111111111111111111111111234);
System.out.println(b3);}
上面示例中两个方法都传入了double类型的参数0.1但是 b1 还是出现了精度的问题。造成这种问题的原因是 0.1 这个数字计算机是无法精确表示的,送给 BigDecimal 的时候就已经丢精度了。
结论:
第一,在使用BigDecimal构造函数时,尽量传递字符串而非浮点类型;
第二,如果无法满足第一条,则可采用BigDecimal.valueOf方法来构造初始化值。但是valueOf受double类型精度影响,当传入参数小数点后的位数超过double允许的16位精度还是可能会出现问题的
2、等值比较的坑
一般在比较两个值是否相等时,都是用equals 方法,但是,在BigDecimal 中使用equals可能会导致结果错误,BigDecimal 中提供了 compareTo 方法,在很多时候需要使用compareTo 比较两个值。
public static void main(String[] args){
BigDecimal b1 = new BigDecimal("1.0");
BigDecimal b2 = new BigDecimal("1.00");
System.out.println(b1.equals(b2));
System.out.println(b1.compareTo(b2));
}
出现此种结果的原因是,equals不仅比较了值是否相等,还比较了精度是否相同。示例中,由于两个值的精度不同,所有结果也就不相同。而 compareTo 是只比较值的大小。返回的值为-1(小于),0(等于),1(大于)。
3、无限精度的坑
BigDecimal 并不代表无限精度,当在两个数除不尽的时候,就会出现无限精度的坑,此种情况,只需要在使用 divide方法时指定结果的精度即可:
BigDecimal b3 = new BigDecimal("1");
BigDecimal b4 = new BigDecimal("3");
System.out.println(b3.divide(b4,2, RoundingMode.HALF_UP));//结果为0.33
在使用BigDecimal进行(所有)运算时,尽量指定精度和舍入模式。
三、Date日期类型
3.1 简介
1、是一个用来表示时间、日期的类,这个类在 java.util 包中,在使用 Date的时候,一定要注意 : 在 java.sql 包中,也有一个Date,千万不要导错包了。
2、 Date对象,用来表示一个时间点。是距离纪元时间点的总毫秒数。
3、纪元时间点: 1970年1月1日00:00:00(本初子午线处的时间点)
3.2 常用API
1)构造器
-
Date() :获取当前系统时间
-
Date(long time):设置一个距离固定点的指定毫秒数的时间点。
2)方法
-
long getTime()
-
void setTime(long time)
-
String toString() 格式: Thu May 24 19:32:14 CST 2018
Date now = new Date(); System.out.println(now); Date d = new Date(24*60*60*1000*2);//使用有参构造器,来获取距离纪元的2天后的时间 System.out.println(d);
四、SimpleDateFormat类型
4.1 简介
java.text.SimpleDateFormat是一个用来格式化和解析日期的具体类,它允许进行格式化(日期 ->文本)、解析(文本 -> 日期)和规范化
-
将一个Date对象转成一个指定格式的字符串
-
将一个自定格式的字符串转成一个Date对象
4.2 常用构造器和方法
1)构造器
- SimpleDateFormat()
- SimpleDateFormat(String pattern):指定一个日期格式符号来构造对象
2)方法
- final String format(Date date) Date
- Date parse(String source) throws ParseException String
3)日期模式匹配字符
| 字符 | 含义 | 案例 |
|---|---|---|
| y | 年 | yyyy年—2018年;yy-18年 |
| M | 月 | MM月—05月;M月—5月 |
| d | 日 | dd日—06日;d日—6日 |
| E | 星期 | E-星期日(Sun) |
| a | 上下午(AM、PM) | a—下午(PM) |
| H | 24小时制 | a h时--------下午 10时HH:mm:ss------12:21:34hh(a):mm:ss------12(PM):21:34 |
| h | 12小时制 | |
| m | 分钟 | |
| s | 秒 |
public class Date01 {public static void main(String[] args) throws ParseException {Date now = new Date();System.out.println(now);Date d = new Date(24*60*60*1000*2);//使用有参构造器,来获取距离纪元的2天后的时间System.out.println(d);//进行格式化SimpleDateFormat a =new SimpleDateFormat("yyyy.MM.dd HH.mm.ss");String str=a.format(now);System.out.println(str);String s1="2002年11月09日";//字符串转日期时,SimpleDateFormat里的格式按照字符串来写SimpleDateFormat date=new SimpleDateFormat("yyyy年MM月dd日");Date date1=date.parse(s1);System.out.println(date1);}
五、Calendar类型
5.1 简介
1、日历类型,位于java.util包下,封装了日历信息,包括年月日时分秒这些时间分量。
2、Calendar是抽象类,有很多子类型,比如格力高日历类型。该格力高日历类型正是大多数国家通用的日历类型,即阳历。
3、 程序员不需要直接调用子类型的构造器来获取日历对象,Calendar类型里封装了一个工具方法getInstance(),来获取该地区的子类型对象。
5.2 常用方法
1)getInstance方法
Calendar提供了一个类方法getInstance,以获取此类型的一个通用的对象
此方法返回一个Calendar对象,其日历字段已经由当前日期和时间初始化
2)getActualMaximum方法
作用:指定一个时间常量,返回指定日历分量可能拥有的最大值
Date getTime();
get(int Field)
5.3 时间常量
Calendar.YEAR: 年
Calendar.MONTH: 月 注意 该值的范围是0~11,分别表示1月~12月。 因此表示月份时,要+1操作。
Calendar.DAY_OF_MONTH 日
Calendar.DATE 日
Calendar.HOUR_OF_DAY 24小时制的时
Calendar.HOUR 12小时制的时
Calendar.MINUTE 分钟
Calendar.SECOND 秒钟
Calendar.DAY_OF_WEEK: 星期几 范围1~7, 1表示周日, 7表示周六, 显示时要-1操作
Calendar.DAY_OF_YEAR: 一年中的第几天。
public class Calendar01 {public static void main(String[] args) {//想要获取一个日历对象Calendar cal = Calendar.getInstance();System.out.println(cal);Date time = cal.getTime();System.out.println(time);System.out.println("------------设置时间分量------------------");// 修改成北京奥运时间: 2008-8-8日 20:08:00cal.set(Calendar.YEAR,2008);System.out.println(cal.getTime());cal.set(Calendar.MONTH,8-1);cal.set(Calendar.DAY_OF_MONTH,8);cal.set(Calendar.HOUR_OF_DAY,20);cal.set(Calendar.MINUTE,8);System.out.println(cal.getTime());} }
相关文章:
JAVA中常用类型
一、包装类 1.1 包装类简介 java是面向对象的语言,但是八大基本数据类型不符合面向对象的特征。因此为了弥补这种缺点,为这八中基本数据类型专门设计了八中符合面向面向对象的特征的类型,这八种具有面向对象特征的类型,就叫做包…...
PostgreSQL学习的必要性
据分析师、运维工程师,还是技术决策者,掌握 PostgreSQL 都能带来显著的优势。以下是其必要性的核心要点:企业级开源数据库的首选 功能全面性:PostgreSQL 支持复杂的 SQL 查询、事务(ACID 特性)、多版本并发…...
使用 GPTQ 进行 4 位 LLM 量化
权重量化方面的最新进展使我们能够在消费级硬件上运行大量大型语言模型,例如 RTX 3090 GPU 上的 LLaMA-30B 模型。这要归功于性能下降最小的新型 4 位量化技术,例如GPTQ、GGML和NF4。 在本文中,我们将探索流行的 GPTQ 算法,以了解…...
【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
【黑马点评优化】2-Canel实现多级缓存(RedisCaffeine)同步 0 背景1 配置MySQL1.1 开启MySQL的binlog功能1.1.1 找到mysql配置文件my.ini的位置1.1.2 开启binlog 1.2 创建canal用户 2 下载配置canal2.1 canal 1.1.5下载2.2 配置canal2.3 启动canal2.4 测试…...
【CUDA】Pytorch_Extensions
【CUDA】Pytorch_Extensions 为什么要开发CUDA扩展? 当我们在PyTorch中实现自定义算子时,通常有两种选择: 使用纯Python实现(简单但效率低)使用C/CUDA扩展(高效但需要编译) 对于计算密集型的…...
CPP集群聊天服务器开发实践(五):nginx负载均衡配置
1 负载均衡器的原理与功能 单台Chatserver可以容纳大约两万台客户端同时在线聊天,为了提升并发量最直观的办法需要水平扩展服务器的数量,三台服务器可以容纳六万左右的客户端。 负载均衡器的作用: 把client的请求按照负载均衡算法分发到具体…...
使用 NVM 随意切换 Node.js 版本
安装nvm https://github.com/coreybutler/nvm-windows/releases nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)-CSDN博客 验证 NVM 是否安装成功-查看版本 nvm --version安装指定版本的 Node.js nvm i…...
百问网(100ask)的IMX6ULL开发板的以太网控制器(MAC)与物理层(PHY)芯片(LAN8720A)连接的原理图分析(包含各引脚说明以及工作原理)
前言 本博文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 。 本博文和博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 的目录是找出百问网(100ask)的IMX6ULL开发板与NXP官方提供的公板MCIMX6ULL-EVK(imx6ull14x14evk)在以太网硬件…...
组件库地址
react: https://react-vant.3lang.dev/components/dialoghttps://react-vant.3lang.dev/components/dialog vue用v2的 Vant 2 - Mobile UI Components built on Vue...
2025.2.16机器学习笔记:TimeGan文献阅读
2025.2.9周报 一、文献阅读题目信息摘要Abstract创新点网络架构一、嵌入函数二、恢复函数三、序列生成器四、序列判别器损失函数 实验结论后续展望 一、文献阅读 题目信息 题目: Time-series Generative Adversarial Networks会议: Neural Information…...
最新智能优化算法: 中华穿山甲优化( Chinese Pangolin Optimizer ,CPO)算法求解23个经典函数测试集,MATLAB代码
中华穿山甲优化( Chinese Pangolin Optimizer ,CPO)算法由GUO Zhiqing 等人提出,该算法的灵感来自中华穿山甲独特的狩猎行为,包括引诱和捕食行为。 算法流程如下: 1. 开始 设置算法参数和最大迭代次数&a…...
使用 DeepSeek + 语音转文字工具 实现会议整理
目录 简述 1. DeepSeek与常用的语音转文字工具 1.1 DeepSeek 1.2 讯飞听见 1.3 飞书妙记 1.4 剪映电脑版 1.5 Buzz 2. 安装Buzz 3. 使用DeepSeek Buzz提取并整理语音文字 3.1 使用 Buzz 完成语音转文字工作 3.2 使用 DeepSeek 进行文本处理工作 3.3 整理成思维导图…...
【OS安装与使用】part4-ubuntu22.04安装anaconda
文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 官网下载Anaconda(1)确认自己的系统型号与硬件架构(2)官网下载对应版本 2.2.2 安装Anaconda(1)基于shell脚本…...
把程序加入开机自启动
一、Windows 系统 方法 1:通过启动文件夹 1. 按下 Win R,输入 shell:startup,回车打开 **启动文件夹**。 2. 将应用程序的快捷方式复制到此文件夹中。 右键应用程序主程序(.exe)→ 创建快捷方式 → 拖动到启动文件夹。…...
介绍cherrypick
git cherry-pick 是 Git 中的一个强大命令,用于将一个或多个提交(commit)从一个分支应用到另一个分支。它允许你选择性地将特定的变更引入到当前分支,而无需合并整个分支。以下是对 git cherry-pick 操作的详细介绍: 1…...
Spring IoC DI:控制反转与依赖注入
目录 前言 - Spring MVC 与 Spring IoC 之间的关系 1. IoC 1.1 Spring Framework, Spring MVC, Spring boot 之间的联系[面试题] 1.2 什么是容器 1.3 什么是 IoC 2. DI 2.1 什么是 DI 3. Spring IoC & DI 3.1 Component 3.2 Autowired 4. IoC 详解 4.1 Applica…...
JavaAPI常用类型(包装类、BigDecimal类)
包装类 java语言是面向对象的语言,但是其中的八大基本数据类型不符合面向对象的特征。 因此java为了弥补这样的缺点,为这八种基本数据类型专门设计了八种符合面向对象特征的的类型,这八种具有面向对象特征的类型,统称为包装类&a…...
项目中一些不理解的问题
1.Mybatis是干啥的 他是用来帮我们操作数据库的,相当于是我们的一个助手: 我们想要得到数据库中的什么数据,就可以告诉mybatis,他会给我们想要的结果,同时,我们想要对数据库做出什么操作,也可…...
数字化转型4化:标准化奠基-信息化加速-数字化赋能-智能化引领
随着经济增速的放缓,大国体系所催生的生产力逐渐释放,后续业务的发展愈发需要精耕细作,精益理念也必须深入企业的骨髓。与此同时,在全球经济一体化的大背景下,企业面临着来自国内外同行,甚至是跨行业的激…...
Lineageos 22.1(Android 15) 开机向导制作
一、前言 开机向导原理其实就是将特定的category的Activity加入ComponentResolver,如下 <category android:name"android.intent.category.SETUP_WIZARD"/>然后我们开机启动的时候,FallbackHome结束,然后启动Launcher的时候…...
“让App玩捉迷藏:Android教育平板的‘隐身术’开发实录”
1. 前言:一场App的“消失魔术” 在定制教育平板时,客户要求:“朕要某些App在桌面上消失,只能在系统设置里当个‘幽灵’,而朕一声令下,它们又得原地复活!”于是,程序员们翻开了Androi…...
简单易懂,解析Go语言中的Channel管道
Channel 管道 1 初始化 可用var声明nil管道;用make初始化管道; len(): 缓冲区中元素个数, cap(): 缓冲区大小 //变量声明 var a chan int //使用make初始化 b : make(chan int) //不带缓冲区 c : make(chan stri…...
C++基础知识学习记录—模版和泛型编程
1、模板 概念: 模板可以让类或者函数支持一种通用类型,在编写时不指定固定的类型,在运行时才决定是什么类型,理论上讲可以支持任何类型,提高了代码的重用性。 模板可以让程序员专注于内部算法而忽略具体类型&#x…...
已解决IDEA无法输入中文问题(亲测有效)
前言 在使用IDEA的时候,比如我们想写个注释,可能不经意间,输入法就无法输入中文了,但是在其他地方打字,输入法仍然能够正常工作。这是什么原因呢,这篇文章带你解决这个问题! 快捷键 如果你的I…...
人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)
要想做好目标追踪,须做好目标检测,所以这里就是基于yolov5检测基础上进行DeepSort,叫它为Yolov5_DeepSort。整体思路是先检测再追踪,基于检测结果进行预测与匹配。 一.参数与演示 这里用到的是coco预训练人的数据集: 二.针对检测结果初始化track 对每一帧数据都输出…...
Copilot基于企业PPT模板生成演示文稿
关于copilot创建PPT,咱们写过较多文章了: Copilot for PowerPoint通过文件创建PPT Copilot如何将word文稿一键转为PPT Copilot一键将PDF转为PPT,治好了我的精神内耗 测评Copilot和ChatGPT-4o从PDF创建PPT功能 Copilot for PPT全新功能&a…...
使用GDI+、文件和目录和打印API,批量将图片按文件名分组打包成PDF
代码写了两个小时,速度太慢(包括学习文档的时间) #include <stdio.h> #include <Windows.h> #include <gdiplus.h> #include <string.h> using namespace Gdiplus; #pragma comment(lib, "Gdiplus.lib") …...
【Linux】【网络】Libevent基础
【Linux】【网络】Libevent基础 libevent 是轻量级 c语言实现的 网络io库 能够跨平台 且线程安全 是单线程的 libevent 的使用过程通常包括几个主要步骤: 1.创建Libevent实例2.注册事件、添加事件、设置处理事件回调函数3.启动事件循环4.清理资源 1. 创建Libeven…...
MySQL 主从复制原理及其工作过程
一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核…...
nginx负载均衡, 解决iphash不均衡的问题之consistent
原因分析 客户端IP分布不均:部分IP段请求集中,导致哈希到同一后端。 服务器数量变动:增删节点时,传统ip_hash未使用一致性哈希,导致分布重置。 哈希键范围过小:例如仅使用IPv4前24位,不同IP可…...








