黑马程序员技术交流社区

标题: String问题 [打印本页]

作者: 杨芳    时间: 2013-2-23 09:10
标题: String问题
本帖最后由 杨芳 于 2013-2-23 09:20 编辑

public static void main(string [] arg)
{
   String s1="abc";s1是一个类类形变量,那么s1就不是一个对象?
   
   String s2=new String("abc");s2中有那两个对象?s2是一个对象?new了一个"abc"对象?这句话的意思是对象指向对象吗?

System.out.println(s1==s2);//s1==s2比较的是什么?s1,s2指向同一对象,为什么不相等?在内在中是否有两个“abc”;
System.out.println(s1.equals.s2);
}
作者: 逍林游    时间: 2013-2-23 09:28
String是一个特殊的对象,
String s1="abc";这句会在栈内存的常量池中存储“abc” ,然后s1引用该数据,
String s2=new String("abc");这句话不仅在在栈的常量池中有“abc”,而且在堆内存中分配String对象“abc”,然后s2引用该堆中的对象。
s1==s2 这句比较的内存首地址,根据以上分析s1、s2的内存地址明显不同,所以s1==s2返回false。


作者: 邢义敏    时间: 2013-2-23 09:36

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
     String str = "abc";
等效于:
     char data[] = {'a', 'b', 'c'};     String str = new String(data);






public static void main(string [] arg)
{
   String s1="abc";s1是一个类类形变量,那么s1就不是一个对象?<-------------------s1不是对象,这里的对象是指"abc",
   
   String s2=new String("abc");s2中有那两个对象?s2是一个对象?new了一个"abc"对象?这句话的意思是对象指向对象吗?《----------这里的两个对象是指"abc"是一个对象,new String()是一个对象。s2不是对象,他是一个类类型变量。
     













System.out.println(s1==s2);//s1==s2比较的是什么?s1,s2指向同一对象,为什么不相等?在内在中是否有两个“abc”;《------------因为s1="abc",s2=new String("abc");他俩是两个对象,两个对象不论指向的是否是一个值,他俩都不是一个对象。就和Object o1=new Object();Object o2=new Object();o1!=o2一样
System.out.println(s1.equals.s2);
}

作者: 杨芳    时间: 2013-2-23 09:39
逍林游 发表于 2013-2-23 09:28
String是一个特殊的对象,
String s1="abc";这句会在栈内存的常量池中存储“abc” ,然后s1引用该数据,
St ...

System.out.println(s1.equals.s2);
这个为什么相等?

作者: 陈圳    时间: 2013-2-23 09:42
String是一个类对象,因为java中的String类已经被封闭成了一个类,像int/Integer,char...这些类型一样.都被封闭成了类.用他们创建的对象,就是类对象
String s2=new String("abc");这句前面是String s2时,在栈内存中建立了一个引用,不是一个对象.而new后才会在堆内存中开辟空间,然后初始化.把("abc")的地址赋给s2;
这和其他你自己建立的类对象的赋值是一样的.
==比较的是地址值,所以不相等,
equals比较是的字符串对象.//这个一般要复写,因为根据自己比较属性的不同,要更改.
作者: 逍林游    时间: 2013-2-23 09:42
String类复写了Object类的equals()方法,s1.equals(s2)比较的是s1和s2的内容。

作者: 逍林游    时间: 2013-2-23 09:46
  1.   public boolean equals(Object anObject) {
  2.         if (this == anObject) {
  3.             return true;
  4.         }
  5.         if (anObject instanceof String) {
  6.             String anotherString = (String)anObject;
  7.             int n = count;
  8.             if (n == anotherString.count) {
  9.                 char v1[] = value;
  10.                 char v2[] = anotherString.value;
  11.                 int i = offset;
  12.                 int j = anotherString.offset;
  13.                 while (n-- != 0) {
  14.                     if (v1[i++] != v2[j++])
  15.                         return false;
  16.                 }
  17.                 return true;
  18.             }
  19.         }
  20.         return false;
  21.     }
复制代码

作者: 杨剑    时间: 2013-2-25 14:45
String s1 = "abc";这句话说的意思是在方法区常量池中创建了一个"abc"字符串对象,然后把地址赋给是
s1引用变量。
String s2 = new String("abc");//这句话的意思是首先打算在方法区的常量池中创建一个"abc"对象,但是之前在常量池中有了一个"abc"对象了,为了优化不再常量池中创建"abc"对象了,然后会在堆内存中创建一个"abc"对象,把堆内存中的对象地址赋值给s2引用变量。老师说的创建两个对象的意思是,不考虑上面那句话,或者上面创建的对象不是"abc",new String("abc")就会创建两个对象。一个在常量池中,一个在堆内存中,但是只有堆内存中的地址值会赋值给s2。
s1==s2为false,因为比较的是地址值,s1引用的是常量池中的地址,s2引用的是堆中的地址,显然不等。
s1.equals(s2)为true,因为String类重写了equals()方法,比较的是两个字符串内容是否相等,他们的内容都是"abc"所以为true。





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