关于string的问题,求解,求解,求解

为什么输出结果是hello,而不是hellow,我附了张图片。图片说明

1.在一个方法内对一个参数的引用重新赋值对原对象是没有任何影响的。
2.要想对原对象产生影响,你只能对该参数引用指向的对象内部进行修改
如:

    public static void  test(StringBuilder sb){
        sb.append("w");
    }
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("hello");
        test(sb);
        System.out.println(sb);
    }

3.String是不可变对象,它没有提供任何可以修改自己的方法。
4.new和双引号创建String的区别在于new会在堆和常量池里都创建一个String,双引号就只在常量池里创建。
5.如果一定要改怎么办?
5.1 换成StringBuffer或StringBuilder
5.2 返回修改后的字符串并接收后重新赋值
就是@avivadepp这位哥们的回答。
5.3 放入Map、List、数组等等对象里。
示例:

 import java.util.Arrays;
import java.util.List;
public class Test {
    String str;
    public Test(String str) {
        this.str = str;
    }
    public static void  test1(String[] ss){
        ss[0]=ss[0]+"w";
    }
    public static void  test2(List<String> ss){
        ss.set(0,ss.get(0)+"w");
    }
    public static void  test3(Test ss){
        ss.str=ss.str+"w";
    }
    public static void main(String[] args) {
        String[] s1={"hello"};
        test1(s1);
        System.out.println(s1[0]);
        List<String> s2=Arrays.asList(new String[]{"hello"});
        test2(s2);
        System.out.println(s2.get(0));
        Test s3 = new Test("hello");
        test3(s3);
        System.out.println(s3.str);
    }
}

传入函数的不是引用而是这个字符串的一个副本,对副本任何操作,和原来的字符串没有任何关系,自然也不会影响到原字符串

因为你“s1”这个对象确实没有变化啊。s1是指向堆里的一个对象,而你并没有操作这个对象,所以打印出来还是s1 这个对象的值。

这样?虽然不知道要求是什么。。。。。图片说明

从内存角度分析来说,当你调用Pra类的静态方法test(String str)的时候,就会为该方法创建一个方法栈。局部变量都存在该方法栈中,当该方法执行完毕时,test方法出栈,栈中的值是不会保存的(除非你有返回,才会把该栈中的值返回给给操作数栈,以便下一次操作时使用)。所以当你执行完第7行代码时,并没有什么用,然后你再输出的还是s1对象的值

你这里传的是值而不是引用,传值不会改变S1的值的哈

S1指向的是hello的地址,hellow没有变量引用它的地址。得用s1指向它。。。。。

因为你返回的类型是void,你这里是s1的值根本没有改变 你应该返回String类型

兄弟,你这是C++的语法

首先分清+=和=+的关系

test函数的S1前面加个&

你的s1还是原来的s1,打印结果跟你下面的类都没什么关系,一楼是正解!!!

Pra.test()方法里传入的参数“hello”和s1是两个概念,一个是值,一个引用 ,传值的话就是局部变量需要用返回值接受,引用的话就可以

卧槽,好可怕,虽然答得人很多,但是都没达到你的点上,如果觉得解决你问题了,记得采纳。

首先:你可能想问的是,我的test方法已经改变了那个hello啊,为什么最后的结果还是不对呢。

第一点:在java中,String是不可变对象,任何对String字符串的修改,都将是创建一个String对象。

第二点,我先给你看看debug的过程你就知道了。
首先程序跑起来,在调用test方法之前的截图
图片说明
可以看出来,这个s1对象的id是16,接着程序进入test方法,我把你的代码改了,
图片说明
接着你发现,在调用 += 之前,那个id还是16的。
然后执行+=之后就是这样了
图片说明
id变成25了。也就是说,引用的不是一个对象了。那为什么会变成这样呢?

原因是因为:java中的String字符串是不可变对象,即,如果你使用什么 + “as" 或者 += "w" 这种,
底层运算就是创建一个字符串,而不是在原字符串上修改。

实参和形参的慨念。

你可以这样理解:

1、把s1传进去函数,只是把值复制一份然后传过去。

2、你在函数里对副本进行各种操作,复制那一份只在函数内起作用。

3、跳出函数,此时的作用域是原来那一份。所以你一输出是输出原来那一份。

额 返回值都没有 所以还是原来的

传递过去的参数不过是原变量的一个拷贝,这样无法修改原变量,输出的自然是原变量咯。想输出“hellow”有两个方法:1、在test中输出;2、把s1声明成全局变量(比建议使用)