首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:String 类
1.1 概述
1.2 字面量的定义方式
1.3 String 的特点
1.4 String 的内存示意图
1.5 构造 String 对象
1.6 字符串拼接问题
1.7 字符串对象的比较
1.8 空字符串的比较
1.9 字符串的常用方法
1.10 常见正则表达式
第二章:StringBuilder 类
2.1 概述
2.2 常用方法
第三章:系统相关类
3.1 System 类
3.2 Runtime 类
第四章:数学相关的类
4.1 Math 类
4.2 大数运算类
第五章:数组的相关操作
5.1 数组的算法升华
5.2 数组工具类
第六章:日期时间API
6.1.1 概述
6.1.2 本地日期时间
6.2.3 指定时区日期时间 ZonedDateTime
6.2.4 持续日期/时间 Period 和 Duration
6.2.5 日期时间格式化 DateTimeFormat
第七章:字符编码的发展
7.1 ASCII 码
7.2 OEM 字符集的诞生
7.3 多字节字符集(MBCS)和中文字符集
7.4 ANSI 标准、国家标准以及 ISO 标准
7.5 Unicode 的出现
当前位置:
首页>>
技术小册>>
Java语言基础9-常用API和常见算法
小册名称:Java语言基础9-常用API和常见算法
1.6.1 拼接结果的存储和比较问题 - 原则: - 常量+常量:结果是常量池。 - 常量和变量 或 变量和变量:结果是堆。 - 拼接后调用 intern 方法:结果在常量池。 - 示例: ```bash package com.github.string.demo7; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { String s1 = "hello"; String s2 = "world"; String s3 = "helloworld"; String s4 = (s1 + "world").intern(); // 将拼接的结果放在常量池中 String s5 = (s1 + s2).intern(); System.out.println(s3 == s4); // true System.out.println(s3 == s5); // true } } ``` - 示例: ```bash package com.github.string.demo8; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { final String s1 = "hello"; final String s2 = "world"; String s3 = "helloworld"; String s4 = s1 + "world"; // s1是常量,"world"也是常量,所以s4是常量 String s5 = s1 + s2; // s1是常量,s2是常量,所以s5是常量 String s6 = "hello" + "world"; // "hello"是常量,"world"是常量,所以s6是常量 System.out.println(s3 == s4); // true System.out.println(s3 == s5); // true System.out.println(s3 == s6); // true } } ``` - 示例: ```bash package com.github.string.demo9; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { String s1 = "hello"; String s2 = "world"; String s3 = "helloworld"; String s4 = s1 + "world"; // s1是变量,"world"是常量,所以s4是变量 String s5 = s1 + s2; // s1是变量,s2是变量,所以s5是变量 String s6 = "hello" + "world"; // "hello"是常量,"world"是常量,所以s6是常量 System.out.println(s3 == s4); // false System.out.println(s3 == s5); // false System.out.println(s3 == s6); // true } } ``` 1.6.2 拼接效率问题 - 示例: ```bash package com.github.string.demo10; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { String str = "0"; for (int i = 0; i < 5; i++) { str += i; } System.out.println("str = " + str); } } ``` 不过,现在的 JDK 版本,都会使用可变字符序列对如上的代码优化,不信,反编译查看字节码: ```bash javap -c Test.class ``` ```bash Compiled from "Test.java" public class com.github.string.demo10.Test { public com.github.string.demo10.Test(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // String 0 2: astore_1 3: iconst_0 4: istore_2 5: iload_2 6: iconst_5 7: if_icmpge 35 10: new #3 // class java/lang/StringBuilder 13: dup 14: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V 17: aload_1 18: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 21: iload_2 22: invokevirtual #6 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 25: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 28: astore_1 29: iinc 2, 1 32: goto 5 35: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream; 38: new #3 // class java/lang/StringBuilder 41: dup 42: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V 45: ldc #9 // String str = 47: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 50: aload_1 51: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 54: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 57: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 60: return } ``` 1.6.3 concat 方法拼接 - concat() 方法拼接,哪怕是两个常量对象拼接,结果也是在堆中。 - 示例: ```bash package com.github.string.demo19; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { String s1 = "hello"; String s2 = "world"; String s3 = "helloworld"; String s4 = "hello".concat("world"); String s5 = "hello" + "world"; System.out.println(s3 == s4); // false System.out.println(s3 == s5); // true System.out.println(s1 + s2 == s5); // false } } ```
上一篇:
1.5 构造 String 对象
下一篇:
1.7 字符串对象的比较
该分类下的相关小册推荐:
Java语言基础11-Java中的泛型
Java语言基础12-网络编程
Mybatis合辑1-Mybatis基础入门
Java语言基础15-单元测试和日志技术
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础3-流程控制
SpringBoot合辑-初级篇
Mybatis合辑4-Mybatis缓存机制
JAVA 函数式编程入门与实践
Java并发编程实战
Java语言基础13-类的加载和反射
Java语言基础2-运算符