java - Java String 如何在内部删除所有非数字工作?

标签 java string immutability

由于字符串是不可变的,我必须编写如下以从字符串中删除所有非字母数字。

void test(String str) {
    str = str.replaceAll("[^a-zA-Z0-9\\s]", "").toLowerCase();
    System.out.println("\n" +str);
    }

我不明白的是,它如何通过重新分配给 str 来工作?

由于 String 是不可变的,我知道如果我将它分配给一个新的 String newString,它们会指出两个不同的对象,str 和 newString。 也就是说,原始字符串指向 str ,修改后的字符串指向 newStr ,它们有两个不同的不可变字符串。这对我来说没问题。

void test(String str) {
            String newStr = str.replaceAll("[^a-zA-Z0-9\\s]", "").toLowerCase();
    System.out.println("\n" +newStr);
    }

但是如何通过重新分配给同一个 str 对象来工作呢?根据我的理解,它不应该工作,因为 immutable str 无法修改,因此修改后的 str 的结果不能存储在 immutable str 中。

void test(String str) {
      // this shouldn't be working based on my understanding. But it works. Why?
    str = str.replaceAll("[^a-zA-Z0-9\\s]", "").toLowerCase();
    System.out.println("\n" +str);
    }

如下图所示,string1 和 string2 指向堆中的同一个 String 对象。您能解释一下它的内部工作原理吗?

最佳答案

您没有分配给同一个 str 对象。

看一下replaceAll等方法,你会发现它们返回String,这是replaceAll方法创建的一个新的String对象。

因此 str=str.replaceAll()str 获取 String 引用,调用 replaceAll()在那个字符串中。 replaceAll 处理 this,然后返回一个包含处理结果的新 String 对象。然后,您将其分配回原始引用。

关于java - Java String 如何在内部删除所有非数字工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20605909/

相关文章:

java - EJB 容器中的 ThreadLocal(和 Singleton)

java - HSQLDB - DELETE后自动执行CHECKPOINT

reference - 在 Kotlin 中将 ArrayList 转换为 List 时的不变性问题

python - 根据分隔符后的字符分割字符串 - python

java - java中的长二进制字符串算术

java - 在反序列化期间将 POJO 映射到具有不可变列表的案例类

python - 可变和不可变对象(immutable对象)

java - CollectionUtils 使用对象元素集合过滤对象集合

java - Android:有没有办法将对象添加到微调器并仅显示它的一个属性?

python - 如何将嵌套列表的字符串转换回嵌套列表?