String类不是final的吗 为啥我还可以修改值 String s="123";s=s+"666";打印123666

时间:2021-08-12 18:24:24
String类不是final的吗  为啥我还可以修改值 String s="123";s=s+"666";打印123666

String str = "abc";
   
     str.concat("123");
     System.out.println(str);
为啥这样输出还是 abc呢

21 个解决方案

#1


str.concat("123");返回一个新的String,本身没有改变。

#2


引用 1 楼 caizhitong 的回复:
str.concat("123");返回一个新的String,本身没有改变。

String类不是final的吗  为啥我还可以修改值 String s="123";s=s+"666";打印123666
那这个为啥打印123666

#3


s是字符串对象,“123”还是没变,只是s的引用指向了“123666”的那个内存地址吧

#4


我只知道结果 具体原因我也不知道哈

#5


s代表的地址变了啊

#6


引用 3 楼 u012992880 的回复:
s是字符串对象,“123”还是没变,只是s的引用指向了“123666”的那个内存地址吧
我知道结果啊  关键为啥这样呢  不是final不可以改变值的吗

#7


final class 是指类本身不能被继承 ,不是这个属性不可修改,
如果这个属性是final的则不可修改,例如:
final String a = "abc"; 
这样的字符串不可以修改。

#8


String类中concat源码,返回的是一个新字符串,原来的不变。


    public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
    }

#9


String  类型的数据值可以改变的

#10


引用 8 楼 yiran_ming 的回复:
String类中concat源码,返回的是一个新字符串,原来的不变。


    public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
    }
厉害 都看源码了

#11


引用 8 楼 yiran_ming 的回复:
String类中concat源码,返回的是一个新字符串,原来的不变。


    public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
    }
   大牛 String类不是final的吗  为啥我还可以修改值 String s="123";s=s+"666";打印123666

#12


楼主转牛角尖了啊    String s="123";s=s+"666";打印123666 记住就好了

#13


final 是不可以不可以改变值啊,它创建了一个新类啊,你输出 

#14


引用 11 楼 hellojava888 的回复:
Quote: 引用 8 楼 yiran_ming 的回复:

String类中concat源码,返回的是一个新字符串,原来的不变。


    public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
    }
   大牛 String类不是final的吗  为啥我还可以修改值 String s="123";s=s+"666";打印123666


根据concat函数的返回值可以看出return new String(0, count + otherLen, buf);,是返回一个新的对象。final类是不允许继承,你的String s引用并没用final来修饰,所以s引用可以改变指向的对象。执行之后,s引用所指向的对象已经不是原来的123了。而是新创建的一个123666对象。引用没变,只是所指向的对象变了。

#15


final指的是类不能被继承,用于field表示field能修改。
LZ应该说的是mutable和immutable
String类确实是immutable的
所以String s = "abc";
s += "123";
是产生了一个新的String object,然后s引用新的对象

#16


你能不能把你的第一个问题的完整代码写下来

#17


引用 15 楼 ForestDB 的回复:
final指的是类不能被继承,用于field表示field能修改。
LZ应该说的是mutable和immutable
String类确实是immutable的
所以String s = "abc";
s += "123";
是产生了一个新的String object,然后s引用新的对象
基础知识有时候最烦人了  学习一下

#18


生成了一个新的String对象,s指向新的对象,原来的string还在内存里

#19


String s="123";s=s+"666"; 
面试题经常会问这里有几个对象
你弄懂这个就会知道变没变了

#20


引用 1 楼 caizhitong 的回复:
str.concat("123");返回一个新的String,本身没有改变。


盗版啊 盗用我的头像 我第一眼还在奇怪我什么时候回复了

#21


s=s+"666";
s+"666"编译期间就优化为"123666"了

#1


str.concat("123");返回一个新的String,本身没有改变。

#2


引用 1 楼 caizhitong 的回复:
str.concat("123");返回一个新的String,本身没有改变。

String类不是final的吗  为啥我还可以修改值 String s="123";s=s+"666";打印123666
那这个为啥打印123666

#3


s是字符串对象,“123”还是没变,只是s的引用指向了“123666”的那个内存地址吧

#4


我只知道结果 具体原因我也不知道哈

#5


s代表的地址变了啊

#6


引用 3 楼 u012992880 的回复:
s是字符串对象,“123”还是没变,只是s的引用指向了“123666”的那个内存地址吧
我知道结果啊  关键为啥这样呢  不是final不可以改变值的吗

#7


final class 是指类本身不能被继承 ,不是这个属性不可修改,
如果这个属性是final的则不可修改,例如:
final String a = "abc"; 
这样的字符串不可以修改。

#8


String类中concat源码,返回的是一个新字符串,原来的不变。


    public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
    }

#9


String  类型的数据值可以改变的

#10


引用 8 楼 yiran_ming 的回复:
String类中concat源码,返回的是一个新字符串,原来的不变。


    public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
    }
厉害 都看源码了

#11


引用 8 楼 yiran_ming 的回复:
String类中concat源码,返回的是一个新字符串,原来的不变。


    public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
    }
   大牛 String类不是final的吗  为啥我还可以修改值 String s="123";s=s+"666";打印123666

#12


楼主转牛角尖了啊    String s="123";s=s+"666";打印123666 记住就好了

#13


final 是不可以不可以改变值啊,它创建了一个新类啊,你输出 

#14


引用 11 楼 hellojava888 的回复:
Quote: 引用 8 楼 yiran_ming 的回复:

String类中concat源码,返回的是一个新字符串,原来的不变。


    public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
    }
   大牛 String类不是final的吗  为啥我还可以修改值 String s="123";s=s+"666";打印123666


根据concat函数的返回值可以看出return new String(0, count + otherLen, buf);,是返回一个新的对象。final类是不允许继承,你的String s引用并没用final来修饰,所以s引用可以改变指向的对象。执行之后,s引用所指向的对象已经不是原来的123了。而是新创建的一个123666对象。引用没变,只是所指向的对象变了。

#15


final指的是类不能被继承,用于field表示field能修改。
LZ应该说的是mutable和immutable
String类确实是immutable的
所以String s = "abc";
s += "123";
是产生了一个新的String object,然后s引用新的对象

#16


你能不能把你的第一个问题的完整代码写下来

#17


引用 15 楼 ForestDB 的回复:
final指的是类不能被继承,用于field表示field能修改。
LZ应该说的是mutable和immutable
String类确实是immutable的
所以String s = "abc";
s += "123";
是产生了一个新的String object,然后s引用新的对象
基础知识有时候最烦人了  学习一下

#18


生成了一个新的String对象,s指向新的对象,原来的string还在内存里

#19


String s="123";s=s+"666"; 
面试题经常会问这里有几个对象
你弄懂这个就会知道变没变了

#20


引用 1 楼 caizhitong 的回复:
str.concat("123");返回一个新的String,本身没有改变。


盗版啊 盗用我的头像 我第一眼还在奇怪我什么时候回复了

#21


s=s+"666";
s+"666"编译期间就优化为"123666"了