由于字符串是不可变的,我必须编写如下以从字符串中删除所有非字母数字。
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/