如何实现Java 字符串变量间的赋值

public class dd{
public static void main(String[] args) {
String a,b;
a="dfdf";
b=a;
System.out.println(b==a);
}
}如上讲a赋值给b,赋值的只是a的引用地址,如何实现真正赋值??

可以用new一个字符串,字符串本身就比较特殊,根据创建方式不同,占用的内存区域也不同。
如果用String str = new String("acb");那么就会再堆内存中分配一个空间。如果按你上面那种赋值,那么当a="afdf"时候,就会栈中找值等于"dfdf"的字符串,如果找到了,就将a的引用指向它,如果没有找到就开通新的内存,让后a指向它,执行到b=a;时同上,当然这个时候栈中必然有"dfdf"所以不会开辟新的内存空间,而是将b的引用直接指向"dfdf"所占的内存地址。
栈内存中的值可以共享,而堆内存不同,因为堆内存是在编译的时候才会分配的,属于动态的,因为事先也不知道,它会占用多大内存,所以不好分配。追问

就是说,当内存中已经分配有这个字符串空间,就不允许再分配一个同样字符串的空间,只能引用之前的?

追答

这就是栈内存机制,你可以用equals和== 测测
equals是比较值的,==是比较内存地址的。对象的引用和一些基本数据变量在栈中存放。还有些说法是内存有四块有堆内存,栈内存,常量区和静态块。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-20
相对来说,为了节省内存,优化程序,不必要的情况下不会去开辟新的物理内存。

如果希望地址不同,但值相同,那可以再new String("?");一个变量,然后用equals方法判断前后变量的值。
即:b = new String("dfdf");
System.out.println(b==a); //false
System.out.println(b.equals(a)); //true

大概就这样,希望对你有帮助!
第2个回答  2011-12-20
直接b="dfdf";
第3个回答  2011-12-20
b = new String("dfdf"); 强制要求分配内存空间
第4个回答  2011-12-20
长知识了,以前没想过这个问题,一般都是想数组和别的应用数据类型

如何实现Java 字符串变量间的赋值
可以用new一个字符串,字符串本身就比较特殊,根据创建方式不同,占用的内存区域也不同。如果用String str = new String("acb");那么就会再堆内存中分配一个空间。如果按你上面那种赋值,那么当a="afdf"时候,就会栈中找值等于"dfdf"的字符串,如果找到了,就将a的引用指向它,如果没有找到就开通...

如何在java中将字符串赋值为数字?
执行赋值语句a="123"+"456"后,变量a的值是"123456"。字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。通常以双引号内部的整体作为操作对象。字符串的连接运算语句公式为s1+s2+s3+…+sn。因此,"123"和"456...

java中 输入字符串怎么给String数组赋值
java中输入的字符串主要是使用scanner类来接收用户从键盘输入的数值,然后建立一个字符串数组来赋值,代码如下:public class ceshi {public static void main(String[] args){String[] s = new String[3];\/\/字符串数组Scanner sc = new Scanner(System.in);接收用户从键盘输入的字符串String str =...

java 字符串变量赋值例如 String a="abc"; String b; b=a; b="_百 ...
String a = "abc"; \/\/ 定义了一个 "abc" 字符串 ,a 指向 这个字符串String b;b = a; \/\/ 使b也指向 a现在指向的那个字符串("abc")b = "abcd"; \/\/ 定义了一个"abcd" 字符串,b 指向 这个新的字符串在内存中大致的示意图如下:所以最后 a =“abc”,b=“abcd”java中...

java字符串重新赋值
使用StringBuffer或StringBuilder类。这两个类都提供了修改字符串内容的方法,例如append()、insert()、delete()等。我们可以先创建一个StringBuffer或StringBuilder对象,然后通过调用其方法修改其内容。最后,我们可以通过调用toString()方法将修改后的内容转换为字符串。点击学习大厂名师精品课使用String类中的...

java中字符串数组如何赋值?
变量初始化,和变量赋值是两个不同的语法。数组初始化时,可以为null,{value1,value2,value3,...},或者赋予另一个数组的值:String[] b = a;常量只能被初始化,一次,不能再次赋值;非常量则可以进行赋值操作,赋值操作只能赋予以下情况:null,另一个数组的值。lz的问题中,a={","}是一个初...

java 中 String 数组怎么动态赋值
String[] str = new String[5]; \/\/创建一个长度为5的String(字符串)型的一维数组 str[0] = a; \/\/赋值 str[1] = b;str[2] = c;str[3] = d;str[4] = e;\/\/也可以创建并赋值 String[] str = {a,b,c,d,e};\/\/二维数组 String[][] str = new String[2][2]; \/\/创建...

javastring源码中的属性value是如何被赋值的?
在Java的String类中,属性value用于存储字符串内容。当使用空字符串创建String对象时,value属性默认为null。因为String类的实现是final和immutable的,所以value的值一旦被赋值,就不能被更改。构造方法`String(String s)`用于初始化String对象,其中参数`s`即为要初始化的字符串内容。在构造方法中,`this....

java 关于字符串数组的赋值
String[] apart =new String[3];String[] eye1=new String[3] ;这样赋值只能赋到eye1[2]=apart [2]; 结果是NULL。int类型的话是0;如何把apart[1]赋值给eye1[7]呢?至少满足下面条件 String[] apart =new String[8];String[] eye1=new String[1] ;eye[1]=apart[7];...

java字符串数组for循环赋值的问题
你的String a=new String[5]写错了,应该写成String[ ] a=new String[5],你这样写编译器没报错吗?你可以写成这样 int [] a=new int[10];double average=0;Scanner s=new Scanner(System.in);for(int i=0;i<10;i++){ a[i]=s.nextInt();} for(int i=0;i<10;i++){ average...

相似回答