java新手请教java大师: string A=a;string B=a; A=B吗?

string A=a;string B=a; A=B吗?
string A=new A("a"); string B=new B("a"); 这个呢?
求前辈们详细指点

既然你问了,就给你说明白点:
*******************
String str="abc"; * 这种情况是引用数据类型,引用数据类型肯定存放在堆中 栈中放置的是参数变量而不能放对象 对象只能放在堆中
*******************
它只创建一个对象 在堆中创建一个对String类的对象引用变量str(引用变量肯定是存放在堆里的),然后查找栈中是否有"abc",若没有则将"abc"存放进栈,并令str指向"abc",若已经存在则直接令str指向"abc".(也就是说引用变量本身只能存放在堆中 它的值是所指向的字符串abc 它的地址存放在栈中) 它创建多个"abc"字符串在内存中其实只存在一个对象而已,这样有利于节省内存空间同时在一定程度上提高程序运行速度
******************************
String str=new String("abc");* 所有通过new操作符的操作都是在堆完成的
******************************
它创建两个对象 abc对象和str引用对象 两个必须存放在堆中 str指向堆中的abc对象 也就是说 两个对象和str的地址全部存放在堆中 因为使用了new操作符 所以下面的例子里str2,str3和str4即使是值都为abc因为str2的地址在栈中 str3和str4的地址各自开辟空间 所以他们的地址肯定不一样了
但是它们的值是一样的 那就是abc
*******
equals:* equals就是比较值 ==在基本类型里也是比较值 在引用类型里是比较地址 注意这个区别就OK了!
*******
表示堆中的引用变量的值是否相同(引用类型变量比较的是他们本身的值,本身的值是通过引用变量地址指向的对象或字符串来得到的,不管这个被指向的字符串或者对象是在栈中还是堆中)
****
==:*
****
表示堆中或者栈中的基本类型的值或者引用变量的地址是否相同(基本类型比较的是他们本身的值,引用类型变量比较的是地址)
当equals为true时,==不一定为true;
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
String str3=new String ("abc");
String str4 =new String ("abc");
System.out.println(str3==str4); // false
----------------------我是分割线---------------------------------
理解下堆和栈的区别
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-07-31
String 是引用类型的,如果没有new对象的话,他会引用之前存在的对象,应此前一个正确,后一个不正确
第2个回答  2012-07-31
只要用到了new 那肯定是不相等的
=是比较内存中的地址
equals是比较的内容
第3个回答  2012-07-31
String A=a;String B=a; A==B吗?[true]
String A=new String("a"); string B=new String("a"); [不好说,要看编译器]
第4个回答  2012-07-31
就是String 比较呗
String A = "a";
String B = "a";
A == B ;A.equals(B);
String A = new String("a");
String B = new Stirng("a");
A != B
A.equals(B)本回答被网友采纳
相似回答