为什么string类不用new 呢?

good02xaut 2002-09-13 01:18:48
字符串类不是java的基本数据类型,而是作为类用的,那么,我们在声明一个String对象时,为什么不用new()呢??
例如:String password="ok";
这里为什么不这样呢?String password=new String("ok");
有这方面的文档说明吗?
...全文
1357 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamhead 2002-09-16
  • 打赏
  • 举报
回复
xiao_yuer(小鱼儿):
多谢你的回答,看看我的理解对不对,==相当于在C里面判断指针是否相同,equals相当于内容上是否相同。是不是因为在Java里没有办法像C里面那样直接比较指针,所以把==默认为比较指针(相当于C的指针)。
另外,我不大同意lanyunfeng(蓝色咖啡) 的观点,String就是Java里的一个类,跟内置类型还是有区别的。
至于colin1022(暗夜要爪哇)说,
String s="dfas";声明的是会被其他相同值的变量代替的,在缓冲里的对象。
我也有一些问题,在《Java核心技术》中所,String的值是不可以改变的,我理解就是如果你给它重新赋值,不是改变它原先指向的那块内存的内容,而是重新拿来一块内存(或像这种直接赋值的,直接找到"dfas"的内存),用它的reference指向这块内存。
good02xaut 2002-09-15
  • 打赏
  • 举报
回复 2
谢谢各位的支持。我现在把各位的认识统一一下,String 类有其特殊性,因此在声明对象的时候,可以不用new()(当然,其他声明对象可不能省得)。然而,虽然说是可以省略,但有和没有new在内存中的的分配是不一样的。String a="ok"和String b=“ok" ,其中a和b是分配了同一块内存,也就是说a和b是相互引用了,a==b 的返回值是true。String a=new String("ok")和String b=new String("ok"),在内存中分别拥有自己的空间,a==b的返回值是false。
这样总结,各位没有什么异议吧。如果大家还有什么高见,请与我分享一下。拜谢!
FROM 2002-09-14
  • 打赏
  • 举报
回复
好帖,收藏!
colin1022 2002-09-13
  • 打赏
  • 举报
回复 1
谢谢各位,我记住了:

String s="dfas";声明的是会被其他相同值的变量代替的,在缓冲里的对象。

String s=new String("fafa");声明的是在内存里完全独立占用一块内存的,不会被其他相同值代替的对象。
BrainA 2002-09-13
  • 打赏
  • 举报
回复
To gentoo(贱兔) :

你的想法错了,在你这个例子中,a就是一个String类的一个instance,都可以调用String的方法。不信的话你可以试一下下面这个例子。

public class Manipulate
{

public static void main(String[] args)
{
String s = "A man of many talents";
String s1 = s.toUpperCase();
int start = s1.indexOf("AL");
int end = s1.lastIndexOf("AL");
String s2 = s1.substring(0, start);
String s3 = s1.substring(end + 2);
String s4 = s2 + s3;
System.out.println(s);
System.out.println(s4);
}
}
gentoo 2002-09-13
  • 打赏
  • 举报
回复
如果用String a ="xx";
那么好象不能用String类的方法,除非是static
如果用String a = new String("xx");
那么a就可以用String类的方法,如a.method(object o);

lanyunfeng 2002-09-13
  • 打赏
  • 举报
回复
好象因为String是JAVA的内置对象,比较特别,所以它的变量可以像JAVA的基本类型一样直接赋值。
xiao_yuer 2002-09-13
  • 打赏
  • 举报
回复
DreamHead(大头):
java里面每个类都继承至java.lang.Object而Object中就有一个public 的方法叫equals(),如果你没有重载这个方法,equals就是判断两个对象是否同一个,是同一个才返回true,这是和==一样的.但绝大多数的类都重载了方法,例如String,它们重载这个方法的目的就是用来判断两个对象的值是否相同,而不再是判断对象本身是否为同一个。至于值相同怎么判断,每个类就都有每个类不同的算法了。。。。。。。
==永远都是判断是否为同一个对象。基本类型除外,因为他们根本不算是对象。
讲的不是很清楚,还有疑问再讨论。
wealth 2002-09-13
  • 打赏
  • 举报
回复
又是在研究内存,那会不会这条问题:

http://www.csdn.net/expert/topic/1021/1021209.xml?temp=.7566187
dreamhead 2002-09-13
  • 打赏
  • 举报
回复
xiao_yuer(小鱼儿) ,顺便问一下,在Java中,==和equals到底有什么区别?
=============
原来一切就是这么简单
junnef 2002-09-13
  • 打赏
  • 举报
回复
完全可以,怎么会不行,jdk4中确实有11中,String型属于复合类型,都有构造器的,就是character等基本类型,也可以用Character char=new Character('a')来初始化。
xiao_yuer 2002-09-13
  • 打赏
  • 举报
回复
呵呵,刚开始进来时还没有人留贴,等自己的留上后才发现,短短几分钟就多了这么多了。所以和BrainA(小包)的基本重复了,:)

不过String对象的构造函数可不止3中,如果包括jdk1.4中已弃用的,总共有11种……
shidu 2002-09-13
  • 打赏
  • 举报
回复
同意楼上
xiao_yuer 2002-09-13
  • 打赏
  • 举报
回复 1
String password=new String("ok");
这样也没有错。
但是String password="ok";利用到了字符串缓冲池,也就是说如果缓冲池中已经存在了相同的字符串,就不会产生新的对象,而直接返回缓冲池中的字符串对象的引用。
如:
String a = "ok";
String b = "ok";
String c = new String("ok");
String d = new String("ok");

System.out.println(a==b);//将输出"true";因为两个变量指向同一个对象。
System.out.println(c==d);//将输出"flase";因为两个变量不指向同一个对象。虽然值相同,只有用c.equals(d)才能返回true.


所以实际中,建议用第一种,可以减少系统资源消耗。
wes109 2002-09-13
  • 打赏
  • 举报
回复
"ok"

本身就是一个String类的对象

String password="ok";

用一个String对象,初始化另一个String 对象password

你觉的有什么不妥吗??
sunlinux 2002-09-13
  • 打赏
  • 举报
回复
这就是java里的特殊之处之一了,

String password="ok";
String password=new String("ok"); 是等价的
BrainA 2002-09-13
  • 打赏
  • 举报
回复
我来解释一下,String作为一个类来说,当然可以用new来构造,String有3个构造函数:

String();
String("xxx");
String(new StringBuffer());


这两条语句的效果是一样的

String password="ok";
String password=new String("ok");

不同的是,第一条现在内存中创建了"ok"这个String,然后将reference赋给password,如果这个时候还有一条语句String pwd = "ok";那么JVM将不再创建"ok",而是直接将第一个"ok"的reference赋给pwd,也就是说,password和pwd是使用同一块内存,而如果加上String pwd = new String("ok");那JVM将在内存中再创建一块区域放上“ok”这个字符串。
namowen 2002-09-13
  • 打赏
  • 举报
回复
这两种写法都可以创建一个String对象。在用赋值运算符进行字符串初始化时,JVM自动为每个字符串生成一个String类的实例。
The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class.
jamsa 2002-09-13
  • 打赏
  • 举报
回复

完全是简单起见,
String str="abcd";
String str=new String(new char[]{'a','b','c','d'});
两个语句对于编译器来说应该是一样的。
gzwrj 2002-09-13
  • 打赏
  • 举报
回复
这样也可以啊!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧