java中,String类对象中的内容一旦被初始化就不能再改变,那么String类中还有replace和toUpperCase方法呢
发布网友
发布时间:2022-05-25 16:23
我来回答
共4个回答
热心网友
时间:2023-11-18 03:54
朋友,你好,对于你的问题,我觉得下面的回答您会满意明了:
String类对象中的内容一旦被初始化就不能再改变 没错的,这是String类的特性,一定要记住。
下面举个例子:
String s = "Hello"; //这时候会在内存中开辟一块空间存储“Hello”,并且S的引用指向它;
s = “world”; //看这句,初学者一般觉得这样的话s的值就变了啊,跟String的特性相违背了啊,其实并不然,s只是对象的引用,真正的对象存在了内存中,执行这句语句的时候,会在内存中重新开辟一块内存,用来存储“world”,并将原来的s引用指向“world”。但是原来的内存中的“hello”并没有改变。也就是说String类对象中的内容一旦被初始化就不能再改变。
希望您会看明白。
热心网友
时间:2023-11-18 03:55
因为String类是final的,所以一旦初始化是不会被改变的
让我们来看看源码replace:
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
Pattern.compile的源码:
public static Pattern compile(String regex, int flags) {
return new Pattern(regex, flags);
}
Pattern.replaceAll源码:
public String replaceAll(String replacement) {
reset();
boolean result = find();
if (result) {
StringBuffer sb = new StringBuffer();
do {
appendReplacement(sb, replacement);
result = find();
} while (result);
appendTail(sb);
return sb.toString();
}
return text.toString();
}
有此可见,每次replace操作都是返回Pattern对象的text,因为每次Pattern.compile都返回个新的Pattern,所以他每次返回的是个新的str
而toUpperCase只是对char的数组操作后进行了一份拷贝,然后返回一个新的str:
return new String(0, count+resultOffset, result);
热心网友
时间:2023-11-18 03:55
replace方法并不能改变字符串本身的,只是replace方法能返回一个处理后的字符串而已,例如:
String s="hello";
System.out.println(s.replace("h","H"));
System.out.println(s);
输出结果:
Hello
hello
热心网友
时间:2023-11-18 03:56
String比较特殊,对String的操作,如果内容改变了那么就返回一个新的String,如果内容没变,就返回String的一个引用。