前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 中 String 相关问题

Java 中 String 相关问题

原创
作者头像
JiahuiZhu1998
修改2023-05-05 11:46:00
3150
修改2023-05-05 11:46:00
举报
文章被收录于专栏:JiahuiZhu1998_技术笔记

1. String 字符串 定义两个常量类


代码语言:javascript
复制
     String st1 = "abc";
     String st2 = "abc";
     System.out.println(st1 == st2);            // true
     System.out.println(st1.equals(st2));       // true

JVM 如图:

2. String 字符串 创建 String Object


代码语言:javascript
复制
String st1 = new String(“abc”); // 创建两个 Object: 常量池创建一个, Heap里复制常量池的对象

JVM 如图:

3. String 字符串 判断 String Object 和 String 常量是否相等


代码语言:javascript
复制
     String st1 = new String("abc");
     String st2 = "abc";
     System.out.println(st1 == st2);             // false
     System.out.println(st1.equals(st2));        // true

JVM 如图:

4. String 字符串 判断 拼接String 和 完整String 是否相等


代码语言:javascript
复制
     String st11 = "a" + "b" + "c";
     String st12 = "abc";
     System.out.println(st11 == st12);         // true
     System.out.println(st11.equals(st12));    // true 常量池里面有“abc” 所以不再创建
     
     String st1 = "ab";
     String st2 = "abc";
     String st3 = st1 + "c";
     System.out.println(st2 == st3);       // false
     System.out.println(st2.equals(st3));  // true     原因如下图:

JVM 如下

st1 + "c" 底层先调用StringBuilder/StringBuffer, 再调用 toString(); 所以最终 st2在常量池, st3在 heap
st1 + "c" 底层先调用StringBuilder/StringBuffer, 再调用 toString(); 所以最终 st2在常量池, st3在 heap

5. String 的 Intern() 方法


代码语言:javascript
复制
String a = new String("aaaaa");
String b = a.intern();  // 返回 a 在常量池中的地址
String c = "aaaaa";
System.out.println(a == b);   //  false  一个是 heap地址, 一个是 常量池地址
System.out.println(b == c);   // true  都是 常量池的同一个地址
代码语言:javascript
复制
// a 在 常量池存入 "aaaaa" 和 "bbbbb"
String a = new String("aaaaa") + "bbbbb";   // 常量池中创建了 "aaaaabbbbb"
String b = a.intern(); 
System.out.println(a == b);   // true
           
String c = "aaaaabbbbb";
System.out.println(a == c);  // true
System.out.println(b == c);  // true
     
String d = new String("aaa") + "aa";
String f = d.intern();
System.out.println(d = f); // false  d在 heap里, f在 常量池里

6. String 的 StringBuilder() 构造器 和 StringBuffer() 构造


StringBuilder 是 非线程安全的, append完成才返回完整的 final String

StringBuffer 是 线程安全的, 同样是 append 完成才返回完整的 final String; 主要用 append() 和 insert()

7. String 的 可变长参数 String...


String... 代表的就是 String []

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. String 字符串 定义两个常量类
    • JVM 如图:
    • 2. String 字符串 创建 String Object
      • JVM 如图:
      • 3. String 字符串 判断 String Object 和 String 常量是否相等
        • JVM 如图:
        • 4. String 字符串 判断 拼接String 和 完整String 是否相等
          • JVM 如下
          • 5. String 的 Intern() 方法
          • 6. String 的 StringBuilder() 构造器 和 StringBuffer() 构造
          • 7. String 的 可变长参数 String...
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档