黑马程序员技术交流社区

标题: 字符串对象实例化 [打印本页]

作者: 冯国强    时间: 2013-11-8 19:37
标题: 字符串对象实例化
public class StringDemo {
public static void main(String[] args) {
  // TODO Auto-generated method stub
  String s=new String("aaaaajdsfoi");
  String a="aaaaajdsfoi";
  String b="aaaaajdsfoi";
  sap(a==b);
  sap(s==a);
  sap(s.equals(a));//比较的是字符串的内容
}
public static void sap(Object obj)
{
  System.out.println(obj);
}
}
结果为什么是true,false,true。我只知道s.equals(a);的原因是字符串对象覆写了equals方法。前两个不知道!给解释解释。

作者: RuntimeError!    时间: 2013-11-8 19:46
String a="aaaaajdsfoi";
String b="aaaaajdsfoi";
a,b指向的是同一个地址,==比较的实际是他们的地址,在堆中
而 String s=new String("aaaaajdsfoi");s在栈中,表示一个对象,他指向的是"aaaaajdsfoi"的地址
就是"aaaaajdsfoi"的地址的地址
所以a==b为true a==s为false
而s.equals(a)就是 s指向的地址和a比较所以相等


作者: 寻丶丶觅    时间: 2013-11-8 19:52
String a="aaaaajdsfoi"; 建立引用 发现字符池没有aaaaajdsfoi,存入aaaaajdsfoi,分配地址,把a引用与该地址关联.
String b="aaaaajdsfoi";建立b引用,发现字符池有aaaaajdsfoi,把该地址与a引用关联。
a==b 地址相同true;
String s=new String("aaaaajdsfoi"); 指向的是对象地址new String("aaaaajdsfoi");

作者: Lucking    时间: 2013-11-8 20:31
这位同学,你干嘛搞那么多乱七八糟的字符啊 实例化一个有规律点的不好么,不嫌看着眼花啊
String s=new String("hello");// 引用s指向字符串对象"hello",hello存在堆内存上,因为是new出来滴东东
String a="hello";//引用a指向字符串常量"hello",hello存在内存的数据区域中,一般存储常量及static变量,
String b="hello";//引用a指向字符串常量"hello",hello内存位置同上
==这玩意指的是两个引用所指对象是不是一样的
So 很显然a兄跟b兄所指对象都是数据区中的"hello"对象,这里只有一个"hello"对象哦,因为她不是new出来滴,所以是true
s兄和a兄所指对象压根不再一个内存区域里更谈不上是同一个对象了,所以是false
That's all. any questions?
作者: 中关村阿旺    时间: 2013-11-8 20:58
String s=new String("aaaaajdsfoi");
根据毕老师的讲解:这句话会在内存中创建两个字符串对象,一个是字符串常量:"aaaaajdsfoi",另一个是是通过new关键字所创建的字符串:"aaaaajdsfoi",
两个字符串虽然内容相同,但是内存地址不同。s变量所指向的是后者;
String a="aaaaajdsfoi";
由于字符串保存在方法区中的字符串常量池中,一旦初始化就不可以被改变。
这句话的意思是:a变量指向字符串"aaaaajdsfoi"。
由于上一句代码已经在字符串常量池中创建了"aaaaajdsfoi"字符串,所以,就把a变量指向了"aaaaajdsfoi"字符串所对应的内存地址。
String b="aaaaajdsfoi";
这句话的意思同上句代码。
sap(a==b);
由于变量a和变量b所指向的地址相同,所以编译执行结果为:true。
sap(s==a);
由于变量s和变量a所指向的地址不相同,a指向的是常量:"aaaaajdsfoi",而s指向的是通过new关键字所创建的字符串的地址,所以结果为false。
sap(s.equals(a));//比较的是字符串的内容
之所以这句代码结果为true,是因为String类复写了Object类中的equals方法,定义了自己独有的比较方法。只要是字符串内容相同,那么结果为true。
作者: 明月几时有    时间: 2013-11-8 23:58
public class StringDemo {
public static void main(String[] args) {
   // TODO Auto-generated method stub
   String s=new String("aaaaajdsfoi");
   String a="aaaaajdsfoi";              
   String b="aaaaajdsfoi";
   sap(a==b);
   sap(s==a);
   sap(s.equals(a));//比较的是字符串的内容
}
public static void sap(Object obj)
{
   System.out.println(obj);
}
}

String a="aaaaajdsfoi";
String b="aaaaajdsfoi";
一个字符串是一个对象,存在于常量池中,如果在创建一个常量池
中已经有了的字符串,那么就不再开辟空间存放个新的字符串,会
直接引用已有的字符串的地址。a,b指向的是同一个地址,==比较的实际是他们的地址
所以a==b 是true
而s则指向了堆内存的new String("aaaaajdsfoi")对象,和a,b当然不是一个引用
所以 s==a 结果是false
而string类的equals方法是重写object类的,比较的是字符串内容
所以 s.equals(a)结果是true





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2