StringBuilder、String应用

该代码段展示了如何从中国身份证号码中提取出生日期。通过substring方法获取年、月、日信息,并组合成日期字符串返回。

题目:获取身份证号中的出生日期

代码实现:

public class Id {

	public String getBirth(String cardId){ 
		cardId="61039620080122799";
           String year = cardId.substring(6, 10);
           String month = cardId.substring(10,12);
           String day = cardId.substring(12,14);
        return year + "-" + month + "-" + day;
	}
}
public class Test {

	public static void main(String[] args) {
	StringBuilder sb=new StringBuilder();
	System.out.println(sb.append(new Id().getBirth("s")));
	}
}

结果:2008-01-22

### String 常量池概念及其工作原理 #### String 常量池概述 在 Java 中,`String` 是一种特殊的对象类型,具有不可变性(immutable)。为了提高内存利用率和性能优化,Java 提供了一个名为 **字符串常量池** 的特殊区域用于存储字符串实例。当通过字面量方式创建字符串时(如 `String s = "hello";`),JVM 首先会在字符串常量池中查找是否存在相同内容的字符串。如果存在,则直接返回该字符串的引用;如果不存在,则将新的字符串实例添加到常量池中,并返回其引用[^1]。 需要注意的是,使用 `new` 关键字显式创建字符串对象时(如 `String s = new String("hello");`),无论常量池中是否已存在相同的字符串,都会在堆内存中创建一个新的字符串对象,而不影响常量池中的内容[^2]。 --- ### StringStringBuilder 应用场景对比 #### 不同特性分析 | 特性 | String | StringBuilder | |-------------------|----------------------------------|------------------------------------| | **可变性** | 不可变 | 可变 | | **线程安全性** | 自然线程安全 | 线程不安全 | | **性能** | 较低 | 较高 | ##### 1. **可变性** - `String` 是不可变的,这意味着每次对字符串的操作实际上都是创建了一个全新的字符串对象[^1]。 - `StringBuilder` 则是可变的,允许在其基础上进行多次修改而无需频繁创建新对象,从而提高了性能[^4]。 ##### 2. **线程安全性** - `String` 因为其不可变性天然具备线程安全性。任何线程都无法更改现有的字符串对象,因此不需要额外的同步机制[^3]。 - `StringBuilder` 并未实现线程安全功能,适用于单线程环境下的高效字符串拼接操作[^3]。 ##### 3. **性能** 由于 `StringBuilder` 的可变性和无锁机制,在需要频繁修改字符串的情况下,其性能显著优于 `String`[^3]。 --- ### 场景应用建议 #### 使用 `String` 的场景 - 字符串内容较少发生变更或者仅需少量修改时,推荐使用 `String`,因为它简单易用且能够充分利用常量池的优势[^3]。 - 多线程环境下处理字符串时,优先选择 `String` 或者其他线程安全的数据结构,因为 `StringBuilder` 缺乏内置的同步支持[^3]。 #### 使用 `StringBuilder` 的场景 - 单线程环境中涉及大量字符串拼接或修改操作时,应选用 `StringBuilder` 来替代传统的字符串连接运算(如 `+` 或 `+=`),以获得更高的执行效率。 - 性能敏感型应用程序中,尤其是在循环体内反复构建复杂字符串时,`StringBuilder` 是更合适的选择。 --- ```java // 示例代码:演示 StringStringBuilder 的差异 public class Main { public static void main(String[] args) { // 使用 String 拼接 long startTime = System.currentTimeMillis(); String result = ""; for (int i = 0; i < 10000; i++) { result += "a"; } System.out.println("Time taken by String: " + (System.currentTimeMillis() - startTime)); // 使用 StringBuilder 拼接 startTime = System.currentTimeMillis(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append("a"); } System.out.println("Time taken by StringBuilder: " + (System.currentTimeMillis() - startTime)); } } ``` 上述代码展示了在高频次字符串拼接操作下,`StringBuilder` 明显优于 `String` 的性能表现。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风儿吹吹吹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值