为了账号安全,请及时绑定邮箱和手机立即绑定

关于String的一个疑问

关于String的一个疑问

繁华开满天机 2019-03-01 04:39:20
先看一段代码: public class JavaTest { public static void changeStr(String str){ str="welcome"; } public static void main(String[] args) { String str="1234"; changeStr(str); System.out.println(str); } } String不是引用类型吗?为什么输出来的还是1234? 针对 @喵了个咪 的回答,贴段代码: public static void change(List list){ list.add("welcome"); } public static void main(String[] args) { String str="1234"; List<String >list = new ArrayList<>(); list.add(str); change(list); assert list.size() == 2; }
查看完整描述

7 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

String 是不可变的,所以你在函数体内部做的改变不可能修改这个变量本身地址的值,而是在另一个地址新建了一个String 类型的变量,而你获取不到这个新建的变量的地址,函数执行完毕这个变量就可能会被回收。

查看完整回答
反对 回复 2019-03-01
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

String str = "asd";
public static void change(String data){
    data = "123";
}

可以这样想,str是一个变量,指向内存地址A。
当调用 -change- 方法的时候,str将内存地址A传递给变量data
在change方法内,进行赋值的时候,java会重新申请一块内存空间去存放数值 "123",内存地址为B,并将data的内存地址修改为B
方法执行结束
注意方法外的变量str的指向的内存地址A是没有改变的,内存地址A指向的值还是为"asd"。

下面举个例子:

public class Main1 {
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.i = 123;
        System.out.println("方法外 : " + demo.hashCode());
        change(demo);
        System.out.println(demo.i);
        change2(demo);
        System.out.println(demo.i);
    }
    
    public static void change(Demo data) {
        System.out.println("方法内前 : " + data.hashCode());
        data = new Demo();
        System.out.println("方法内后 : " + data.hashCode());
        data.i = 321;
    }

    /*
     * 这样则是针对内存地址的修改
     */
    public static void change2(Demo data) {
        data.i = 321;
        System.out.println("方法内 : " + data.hashCode());
    }
}

class Demo {
    public int i;
}

结果:

方法外 : 366712642
方法内前 : 366712642
方法内后 : 1829164700
123
方法内 : 366712642
321

表达的不是太清楚。。。希望例子能表达清楚一些

查看完整回答
反对 回复 2019-03-01
?
墨色风雨

TA贡献1853条经验 获得超6个赞

java调用方法时传递的是值类型,不是引用类型。话说你也可以把地址打出来瞧一瞧。

查看完整回答
反对 回复 2019-03-01
?
冉冉说

TA贡献1877条经验 获得超1个赞

举个栗子:
  String str1 = "a";
  String str2 = "a";
  System.out.println(str1==str2); //true
  str1 = "b";
  System.out.println(str1 + "," + str2); //b,a
  System.out.println(str1==str2); //false
现象:
赋值的变化导致了类对象引用的变化,str1指向了另外一个新对象!而str2仍旧指向原来的对象.当我们改变str1的值的时候,JVM发现在栈中没有存放该值的地址,便开辟了这个地址,并创建了一个新的对象,其字符串的值指向这个地址。
why?

String类被设计成为不可改变(immutable)的类。如果你要改变其值,那么JVM在运行时就会根据新值悄悄创建了一个新对象,然后将这个对象的地址返回给原来类的引用,这个创建过程虽说是完全自动进行的.

so:
我推断,你打印出changeStr 方法中str改变后地址应该不等于main中str的地址.

查看完整回答
反对 回复 2019-03-01
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

可以将 String 理解为 一个特殊的常量噢!

查看完整回答
反对 回复 2019-03-01
  • 7 回答
  • 0 关注
  • 566 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信