如何实现Java 字符串变量间的赋值
publicclassdd{publicstaticvoidmain(String[]args){Stringa,b;a="dfdf";b=a;System.out.pr...
public class dd{
public static void main(String[] args) {
String a,b;
a="dfdf";
b=a;
System.out.println(b==a);
}
}如上讲a赋值给b,赋值的只是a的引用地址,如何实现真正赋值?? 展开
public static void main(String[] args) {
String a,b;
a="dfdf";
b=a;
System.out.println(b==a);
}
}如上讲a赋值给b,赋值的只是a的引用地址,如何实现真正赋值?? 展开
5个回答
展开全部
可以用new一个字符串,字符串本身就比较特殊,根据创建方式不同,占用的内存区域也不同。
如果用String str = new String("acb");那么就会再堆内存中分配一个空间。如果按你上面那种赋值,那么当a="afdf"时候,就会栈中找值等于"dfdf"的字符串,如果找到了,就将a的引用指向它,如果没有找到就开通新的内存,让后a指向它,执行到b=a;时同上,当然这个时候栈中必然有"dfdf"所以不会开辟新的内存空间,而是将b的引用直接指向"dfdf"所占的内存地址。
栈内存中的值可以共享,而堆内存不同,因为堆内存是在编译的时候才会分配的,属于动态的,因为事先也不知道,它会占用多大内存,所以不好分配。
如果用String str = new String("acb");那么就会再堆内存中分配一个空间。如果按你上面那种赋值,那么当a="afdf"时候,就会栈中找值等于"dfdf"的字符串,如果找到了,就将a的引用指向它,如果没有找到就开通新的内存,让后a指向它,执行到b=a;时同上,当然这个时候栈中必然有"dfdf"所以不会开辟新的内存空间,而是将b的引用直接指向"dfdf"所占的内存地址。
栈内存中的值可以共享,而堆内存不同,因为堆内存是在编译的时候才会分配的,属于动态的,因为事先也不知道,它会占用多大内存,所以不好分配。
追问
就是说,当内存中已经分配有这个字符串空间,就不允许再分配一个同样字符串的空间,只能引用之前的?
追答
这就是栈内存机制,你可以用equals和== 测测
equals是比较值的,==是比较内存地址的。对象的引用和一些基本数据变量在栈中存放。还有些说法是内存有四块有堆内存,栈内存,常量区和静态块。
展开全部
相对来说,为了节省内存,优化程序,不必要的情况下不会去开辟新的物理内存。
如果希望地址不同,但值相同,那可以再new String("?");一个变量,然后用equals方法判断前后变量的值。
即:b = new String("dfdf");
System.out.println(b==a); //false
System.out.println(b.equals(a)); //true
大概就这样,希望对你有帮助!
如果希望地址不同,但值相同,那可以再new String("?");一个变量,然后用equals方法判断前后变量的值。
即:b = new String("dfdf");
System.out.println(b==a); //false
System.out.println(b.equals(a)); //true
大概就这样,希望对你有帮助!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接b="dfdf";
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
b = new String("dfdf"); 强制要求分配内存空间
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
长知识了,以前没想过这个问题,一般都是想数组和别的应用数据类型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询