美文网首页
Java中字符串的初始化及字符串操作类

Java中字符串的初始化及字符串操作类

作者: momdiemg | 来源:发表于2019-10-21 16:56 被阅读0次

例1

public static void main(String[] args) {
    String s1 = "hello";
    String s2 = new String("hello");
    System.out.println(s1 == s2);   //false
}
//首先查看做了什么
String s1 = "hello";

虚拟机首先会到字符串常量池中查找该字符串是否已经存在. 如果存在会直接返回该引用, 如果不存在则会在堆内存中创建该字符串对象, 然后到字符串常量池中注册该字符串。

//接着查看做了什么
String s2 = new String("hello")

当我们使用new关键字创建字符串对象的时候, JVM将不会查询字符串常量池, 它将会直接在堆内存中创建一个字符串对象, 并返回给所属变量。

例2

public static void main(String[] args) {
    String s1 = new String("hello ") + new String("world");
    s1.intern();
    String s2 = "hello world";
    System.out.println(s1 == s2);   //true
}

第一行代码String s1 = new String("hello ") + new String("world");的执行过程是这样子的:

1.依次在堆内存中创建”hello “和”world”两个字符串对象

2.然后把它们拼接起来 (底层使用StringBuilder实现, 后面会带大家读反编译代码)

3.在拼接完成后会产生新的”hello world”对象, 这时变量s1指向新对象”hello world”

第二行代码s1.intern();

String类的源码中有对intern()方法的详细介绍, 翻译过来的意思是: 当调用intern()方法时, 首先会去常量池中查找是否有该字符串对应的引用, 如果有就直接返回该字符串; 如果没有, 就会在常量池中注册该字符串的引用, 然后返回该字符串。

第三行代码String s2 = "hello world";
首先虚拟机会去检查字符串常量池, 发现有指向”hello world”的引用. 然后把该引用所指向的字符串直接返回给所属变量。

总结:当用new关键字创建字符串对象时, 不会查询字符串常量池; 当用双引号直接声明字符串对象时, 虚拟机将会查询字符串常量池. 说白了就是: 字符串常量池提供了字符串的复用功能, 除非我们要显式创建新的字符串对象, 否则对同一个字符串虚拟机只会维护一份拷贝。

例三!!!

public class Main {
    public static void main(String[] args) {
        String s1 = "hello ";
        String s2 = "world";
        String s3 = s1 + s2;
        String s4 = "hello world";
        System.out.println(s3 == s4);
    }
}

s3是通过新建一个StringBuilder对象,调用append方法对s1和s2拼接,之后调用StringBuilder的toString把拼接好的StringBuilder转化为String对象,s3指向这个对象,所以最终是new了一个String。

@Override
  public String toString() {
      // Create a copy, don't share the array
      return new String(value, 0, count);
  }

相关文章

  • Java--String、StringBuffer 、Strin

    [1] String类 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。 [...

  • java随记: String类

    字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串。 创建...

  • String扫盲贴

    字符串操作是最常见的操作。在Java中,往往使用String类来进行各种字符串操作。而对于String这个类,其实...

  • 软件测试攻略(二十五):字符串处理

    字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作...

  • Java String 类

    字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作...

  • 关于String,你了解多少?

    字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作...

  • 递归经典问题求解

    2.字符串相关操作 java 类 String 中对字符串的操作特别之多 如通过equal()判断字符串相等 tr...

  • Java String 类

    字符串广泛应用在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作...

  • 关于java字符串的常用操作

    2.String类对象的常用操作及方法 在Java中,String类包含有50多个方法来实现字符串的各种操作,以下...

  • java中String常用方法总结

    在 Java 中字符串属于对象,用 String 类来创建和操作字符串。String类为final类,不能被继承。...

网友评论

      本文标题:Java中字符串的初始化及字符串操作类

      本文链接:https://www.haomeiwen.com/subject/pcntvctx.html