String 创建了几个对象?

本文详细解析了Java中字符串对象创建的问题,通过实例对比展示了不同情况下(常量、new String()、字符串连接)创建对象的次数,揭示了字符串池的工作原理,帮助读者理解内存管理。

 提问下面每段代码建了几个对象

问题一

String zy1 = "小朱";
String zy2 = "小朱";
复制代码

问题二

String zy1 = "小朱";
String zy2 = "大朱";
复制代码

问题三

String zy1 = new String("小朱");
String zy2 = new String("小朱");
复制代码

问题四

String zy1 = new String("小朱");
String zy2 = new String("大朱");
复制代码

问题五

String z = "小";
String y = "朱";
String zy = z + y;
复制代码

问题六

String zy = "小" + "朱";
复制代码

解析

会不会有人连问题一都不知道,"这明明是常量,这肯定没有创建对象",哈哈是不是有好多小伙伴都这么认为。
JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。
嘟噜嘟噜一大堆说什么什么东西我一句也没听懂,哈哈。我们换个思路,我们把问题一中的"小朱"理解成String zy = new String(new char[]{'小','朱'});为什么这么写看看String源码。

/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
复制代码

然后我们看问题一我们可以理解为

String zy = new String(new char[]{'小','朱'});
String zy1 = zy;
String zy2 = zy;
复制代码

是不是恍然大悟,一眼就看出来只创建了一个对象。
那我们继续看问题二

String z = new String(new char[]{'小','朱'});
String y = new String(new char[]{'大','朱'});
String zy1 = z;
String zy2 = y";
复制代码

两个对象

继续看问题三

String zy = new String(new char[]{'小','朱'});
String zy1 = new String(zy);
String zy2 = new String(zy);
复制代码

三个对象

继续看问题四

String z = new String(new char[]{'小','朱'});
String y = new String(new char[]{'大','朱'});
String zy1 = new String(z);
String zy2 = new String(y);
复制代码

四个对象

继续看问题五

String z1 = new String(new char[]{'小'});
String y1 = new String(new char[]{'朱'});
String zy1 = new String(new char[]{'小','朱'});
String z = z1;
String y = y1;
String zy = zy1;
复制代码

这个有意思了,竟然建了3个对象,所以为什么不要做字符串。

继续看问题六,这个就没办法用我的那种理解了,因为他们先加在一起。所以就和String zy = "小朱";这就创建了一个对象。

总结

String的东西很多,一篇文章也讲不完,今天就简单介绍了下一些喜欢面试问到的内容,也是最近看到的一个有意思的东西,所以写了这篇文章,各位看官可有自己理解?


作者:程序员小朱
链接:https://juejin.cn/post/6994613075538100255
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

实现CVSD(Continuously Variable Slope Delta)编码解码的C语言方法,可以从算法原理、硬件要求以及代码实现几个方面进行分析。 ### CVSD 编码的基本原理 CVSD 是一种基于1位量化的一阶自适应增量调制技术。它通过比较输入信号与预测信号之间的差异来生成编码输出。编码过程中会根据信号的变化动态调整量化步长,以提高语音质量并减少误码影响[^1]。CVSD 的核心思想是使用一个简单的线性预测器来预测下一个样本值,并根据误差调整步长。 #### 主要步骤: 1. **初始化**:设定初始步长预测值。 2. **差值计算**:当前输入信号与预测信号的差值。 3. **编码决策**:如果差值大于0,则输出为1;否则为0。 4. **步长调整**:根据连续编码结果调整步长大小。 5. **更新预测值**:根据编码结果更新预测值。 ### CVSD 解码的基本原理 解码过程与编码过程类似,需要根据接收到的比特流重新构造原始信号。解码端同样维护一个预测模型,并根据接收到的每一位数据调整预测值步长。 #### 主要步骤: 1. **初始化**:设置初始步长预测值。 2. **接收编码比特**:逐位处理接收到的比特流。 3. **预测值更新**:根据比特值决定是否增加或减少预测值。 4. **步长调整**:根据连续比特值调整步长大小。 5. **输出重构信号**:将预测值作为解码后的信号输出。 --- ### C语言实现示例 以下是一个简化的 CVSD 编码解码的 C 语言实现示例: ```c #include <stdio.h> #include <stdint.h> #define MAX_STEP_SIZE 100 #define MIN_STEP_SIZE 1 #define STEP_ADJUSTMENT_FACTOR 1.2f // CVSD 编码函数 uint8_t cvsd_encode(int16_t input, int16_t *predicted, float *step_size) { uint8_t encoded_bit = (input > *predicted) ? 1 : 0; if (encoded_bit) { *predicted += *step_size; } else { *predicted -= *step_size; } // 调整步长 if (encoded_bit == 1) { *step_size *= STEP_ADJUSTMENT_FACTOR; } else { *step_size /= STEP_ADJUSTMENT_FACTOR; } // 限制步长范围 if (*step_size > MAX_STEP_SIZE) { *step_size = MAX_STEP_SIZE; } else if (*step_size < MIN_STEP_SIZE) { *step_size = MIN_STEP_SIZE; } return encoded_bit; } // CVSD 解码函数 int16_t cvsd_decode(uint8_t bit, int16_t *predicted, float *step_size) { if (bit) { *predicted += *step_size; } else { *predicted -= *step_size; } // 调整步长 static uint8_t last_bit = 0; if (bit == last_bit) { *step_size *= STEP_ADJUSTMENT_FACTOR; } else { *step_size = *step_size / STEP_ADJUSTMENT_FACTOR; } last_bit = bit; // 限制步长范围 if (*step_size > MAX_STEP_SIZE) { *step_size = MAX_STEP_SIZE; } else if (*step_size < MIN_STEP_SIZE) { *step_size = MIN_STEP_SIZE; } return *predicted; } ``` --- ### 应用场景与注意事项 - **蓝牙通信**:CVSD 是蓝牙 SCO 链路中常用的语音编码方式,特别是在免提设备中被广泛支持[^2]。 - **低延迟需求**:由于结构简单且不需要复杂的帧格式,CVSD 适用于对时效性要求高的实时音频传输。 - **加密能力**:CVSD 可以集成在单硅片上,同时具备一定的复杂度,适合用于安全领域的数字加密。 - **性能调节**:CVSD 在不同速率下表现不同,在 9.6kbps 下音质较差,但在 24kbps 到 48kbps 之间已经可以达到可接受的质量水平。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值