Topic: String a = "sss";和String a = new String("sss");有什么区别吗?谢谢

  Print this page

1.String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 Copy to clipboard
Posted by: topirol
Posted on: 2004-02-23 13:31

String a = "sss";和String a = new String("sss");有什么区别吗?谢谢

2.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: ringayumi
Posted on: 2004-02-23 14:04

String a = "sss"; <== it's in "String pool".
String a = new String("sss"); <== it's in "Heap";

3.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: ringayumi] Copy to clipboard
Posted by: hahaha
Posted on: 2004-02-23 16:17

好象是在equals与==操作时是有区别的

4.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: newnewworm
Posted on: 2004-02-23 18:05

经过测试,
假设 Sting a ="sss" 和String b = new String("sss")
两者a==b 是flase的
a.equals(b) 却是true的!

5.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: topirol
Posted on: 2004-02-23 19:07

知道了:ringayumi 说的有道理

不一样的。

前者会检查缓冲池中有没有"sss",如果有就不分配新的系统资源生成对象了,所以有可能引用的是同一个地址。

后者每一次生成新的对象,不可能出现引用同一个地址的情况。

6.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: Starcraft
Posted on: 2004-02-23 21:47

呵呵,我在sun社区回复你了。

7.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: topirol
Posted on: 2004-02-24 08:48

呵呵,原来是楼上的朋友回复(这个问题也是我在一个论坛上看到的,自己也想知道才到处问的)的,真是谢谢,本人初学JAVA,以后请多多指教阿:)

8.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: JavaCodinger
Posted on: 2004-02-24 13:28

地址不同

9.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: newnewworm] Copy to clipboard
Posted by: chenxihua
Posted on: 2004-02-24 22:25

申明:Java初学者

to: newnewworm

newnewworm wrote:
经过测试,
假设 Sting a ="sss" 和String b = new String("sss")
两者a==b 是flase的
a.equals(b) 却是true的!


结果为true应该属于正常, 仅仅比较了String对象的具体内容
String override 了equals方法,
public boolean equals(Object anObject) {
  if (this == anObject) {
   return true;
  }
  if (anObject instanceof String) {
   String anotherString = (String)anObject;
   int n = count;
   if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
     if (v1[i++] != v2[j++])
      return false;
    }
    return true;
   }
  }
  return false;
}

不过这样做是否有误导之嫌,毕竟equals方法很多场合下是用来比较是否同一对象,至少应该起另外的名字吧。

10.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: zgd
Posted on: 2004-02-25 02:42

第一个不一定产生新对象
第二个一定产生新对象

11.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: nowplay
Posted on: 2004-02-26 11:10

一回事。
由于都是常量,所以java会把这个常量的应用+1,然后把这个常量的object赋给返回的对象。
String a="sss";
String b=new String("sss");

a和b完全相等,但是a<>b,的确奇怪,因为a和b都是对象,对象只能equals,不能=。
从C++角度来看,a和b都是指针,是两个地址,怎么相等?

12.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: nowplay
Posted on: 2004-02-26 11:26

怪事
String a=new String("SSS");
String b=new String("SSS");
if(a==b)
System.out.println("a==b");
else
System.out.println("a<>b");
b=a;
if(a==b)
System.out.println("a==b");
else
System.out.println("a<>b");

输出结果是,a<>b,a==b

13.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: topirol
Posted on: 2004-02-26 11:54

我也觉得奇怪,有没有高手解释一下?

14.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: maogua
Posted on: 2004-02-26 20:24

看thinkinjava就明白了

15.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: daminggege
Posted on: 2004-02-26 22:23

老套问题了,好多地方都有上面推荐think in java
要是看看深入java虚拟机是不是更明白

16.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: dingligang
Posted on: 2004-02-27 14:13

//看看 ringayumi 的观点吧;应该是正确的。

//这个对象在常量池中创建,只要是字符串"sss",就只创建一次
String a1 = "sss";
String a2 = "sss";

//等价于
String a = new String("sss");
String a1 = a;
String a2 = a;

//

//这个和一般的对象一样去对待
String b1 = new String("sss");
String b2 = new String("sss");

注意Stirng类对boolean equals(String str)方法的定义

17.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: dearmeiw
Posted on: 2004-02-28 00:53

String缓冲机制的问题

18.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: anders02
Posted on: 2004-03-01 20:24

第一个不一定产生新对象
第二个一定产生新对象
用equals是比较两个对象句柄的内容,和==当然不一样。

19.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: adrop
Posted on: 2004-03-13 19:28

equals是object的函数,比较的是对象的引用,不能比较数值,但是String和外覆类重载了他,是比较的数值。

20.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: iamyourbrother
Posted on: 2004-04-30 10:43

没区别

21.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: dingjunming
Posted on: 2004-04-30 18:53

这不是和c++那个一样,地址和对象的区别

22.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: nowplay] Copy to clipboard
Posted by: lobster
Posted on: 2004-05-18 13:34

nowplay wrote:
怪事
String a=new String("SSS");
String b=new String("SSS");
if(a==b)
System.out.println("a==b");
else
System.out.println("a<>b");
b=a;
if(a==b)
System.out.println("a==b");
else
System.out.println("a<>b");

输出结果是,a<>b,a==b


String不能这样比较的,这样只是比较了他它们当前的内存地址,
应该这样才能实现比较
if(string1.equals(string2))
System.out.println("string1 is the same string2.");
...
......
因为String类型不是Java提供的基本数据类型,不能有逻辑操作符来比较的。

23.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: whirl79
Posted on: 2004-05-19 22:45

一个是String对象,String f = new String(“ff”);
一个是String的类型变量 String f =“ff”;

24.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: kjjx
Posted on: 2004-05-20 10:40

== 比较的是reference
equals 比较的是对象的内容.
String a = new String("sss");
String b = new String("sss");
System.out.println(a==b); // output : false;
System.out.println(a.equalsBeer);//output :true;

25.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: michaelbeyond
Posted on: 2004-05-21 11:51

区别是有的
可以参考喉结翻译的Practical Java的第二章节
前者是保存变量值(此处说的肯定不地道,但是也不知道怎么说比较好),后者生成了String对象,保存对该对象的引用,该引用的内容为sss。

两者要相等,看对equals比较的是什么,需要时得重载equals方法达到你需要比较什么的目的。

茹本人较菜,请参考那个Practical Java很不错的,说非常清楚。

26.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: j2ee_ejb
Posted on: 2004-05-24 14:32

呵呵
在这里==是比较引用是否同一个堆上的“sss”
而equals则是比较应用的东东是否相等

27.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: scottding
Posted on: 2004-05-25 13:07

我只想说一句话,不要用:
String b = new String("sss");

28.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: LH258
Posted on: 2004-05-30 02:25

怪事
String a=new String("SSS");
String b=new String("SSS");
if(a==b)
System.out.println("a==b");
else
System.out.println("a<>b");
b=a;
if(a==b)
System.out.println("a==b");
else
System.out.println("a<>b");

输出结果是,a<>b,a==b

第1句和第2句是定义字符串引用a和b,为什么是a<>b,参见字符串的比较==和equals的区别,
b=a;这句是a和b指向同一个引用,就像同一个事物分别帖上不同的标签,至于为什么是a==b,见字符串的方法==的定义
简言之,字符串的==方法是比较两个对象的引用,而equals方法是两个对象的内容的比较

29.Re:String a = "sss";和String a = new String("sss");有什么区别吗?谢谢 [Re: topirol] Copy to clipboard
Posted by: 风暴冲浪
Posted on: 2004-05-30 14:16

Stirng a="ssss";
String b=new String("sss");
new的功能有三种是:
* 可以创建新的对象;
* 分配内存;
* 调用构造函数;

前者只是生成了一个对象。。。
"=="与“equal",前都比较的是两个地址是不是相同(即指向同一个对象)而用equal是比较两对象的值是不是相等。。。


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923