A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯国强 中级黑马   /  2013-11-8 19:37  /  1195 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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方法。前两个不知道!给解释解释。

评分

参与人数 1黑马币 +3 收起 理由
乔兵 + 3

查看全部评分

7 个回复

倒序浏览
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比较所以相等

点评

而s.quals(a)跟地址没有关系啊,就像楼主说的,是重写了方法,比较两个引用变量指向的地址的对象是否为同一个字符串....  发表于 2013-11-8 21:30
说错了吧...a和b指向的是方法区内的常量池,没在堆中...s指向的是一个对象的地址,并不是地址的地址,new String("aaaaajdsfoi")本质上是创建了两个对象..   发表于 2013-11-8 21:28

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
String a="aaaaajdsfoi"; 建立引用 发现字符池没有aaaaajdsfoi,存入aaaaajdsfoi,分配地址,把a引用与该地址关联.
String b="aaaaajdsfoi";建立b引用,发现字符池有aaaaajdsfoi,把该地址与a引用关联。
a==b 地址相同true;
String s=new String("aaaaajdsfoi"); 指向的是对象地址new String("aaaaajdsfoi");

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
这位同学,你干嘛搞那么多乱七八糟的字符啊 实例化一个有规律点的不好么,不嫌看着眼花啊
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?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
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。

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

回复 使用道具 举报
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
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马