C++和Java中的字符串有什么区别?

14

C++中,我可以像这样做...

String s = "abc";
char c = s[i]; // works fine...

但在Java中,如果我尝试做同样的事情,它会抛出一个错误。为什么?

java中,要实现以上功能,我必须执行:

s.toCharArray(); 

C++中字符串的实现与Java中有何不同之处?

6个回答

17
在Java中,要实现上述操作,我需要执行以下操作: s.toCharArray();
实际上并不需要。你可以使用charAt代替:
char c = s.charAt(i);

基本上,C++允许用户定义运算符-而Java不允许。所以String类不公开任何类型的“索引”运算符;那只存在于数组中,而String不是数组。(它通常使用数组来实现,但这是另一回事。)
编辑:如评论中所述,+运算符在字符串中被特殊处理-就在语言规范中。同样的事情也可以发生在[]上,但它没有被处理-由于它不在语言规范中,并且Java不支持重载运算符,因此无法在库代码中执行。(例如,您不能为任何其他类提供自定义行为+。)

1
你的意思是因为运算符重载吗? - TheLostMind
@X86: 是的,确切地说。与其问为什么Java不允许s[i],你应该问自己在C++中什么使它有效。 - Jon Skeet
1
当然,Java也有像C++一样的s + s。如果将String视为特殊情况,则定义s[i]同样合理。 - MSalters
@MSalters:是的,+对于字符串有特殊的含义,但仅限于此。我会在答案中做出说明。 - Jon Skeet
也许这就是最重要的区别:在C++中,std::string没有任何特殊的地位。它只是标准库中的一个类。它使用了运算符重载等语言特性,但这些特性对所有人都是可用的。特别是,你可以自己创建一个完全相同的类。 - MSalters

3

不同之处在于C++具有运算符重载,并使用它来访问字符串内容。

它们都以一种无法更改字符串字符的方式存储字符串字符。


2
可以写出这样的代码的原因是
string s = "abc";
char c = s[i]; 

在C++中,string类重载了下标运算符(即[]运算符),使程序员可以像访问数组元素一样访问string对象的字符,尽管string对象并不是一个数组。
另一方面,在Java中不允许任何类型的运算符重载(唯一的例外是为字符串重载的+运算符),因此,不能为String对象重载下标运算符。在Java中,要访问字符串的字符,需要使用访问器成员方法,例如charAt。还可以调用String类的toCharArray方法,该方法返回字符串对象的字符数组,并且可以对此返回值使用下标运算符:
char c = s.toCharArray()[i];

1

查看方法 String#charAt

返回指定索引处的字符值。索引范围从0到length() - 1。序列的第一个char值位于索引0处,下一个char值位于索引1处,依此类推,就像数组索引一样。

如果由索引指定的char值是代理项,则返回代理项值。

public char charAt(int index)

我的问题是为什么Java不允许str[i]。 - TheLostMind
在Java中,为了实现上述功能,我必须使用toCharArray方法:不需要这样做。这就是我说的。我从未比较过两种语言,最终答案将是因为它们是不同的语言。 - Suresh Atta
1
在我看来,这根本没有回答问题! - Rahul

0

在C++中,字符串已经被视为字符数组,但在Java中,String是一个内置类,它与字符数组不同。


3
在C++中,std::string不是字符数组。例如,它有一个size()成员,而char[]则没有。字符串_字面值_是字符数组。例如,"hello"是一个char[6] - MSalters

0
在C++中,字符串通常只是一个字符数组(或指向字符的指针),以NULL(\0)字符结尾。您可以通过索引处理字符串,就像处理任何数组一样。
但在Java中,字符串不是数组。Java字符串是类型为java.lang.String的对象,因此您无法通过索引处理它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接