14

C++我可以做这样的事情......

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

但是Java,如果我尝试做同样的事情,它会引发错误。为什么?。

java,要实现上述目标,我必须这样做:

s.toCharArray(); 

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

4

6 回答 6

17

在java中,要实现上述,我必须这样做: s.toCharArray();

并不真地。您可以charAt改用:

char c = s.charAt(i);

基本上,C++ 允许用户定义的操作符——Java 不允许。因此String该类不公开任何类型的“索引”运算符;仅存在于数组中,而 aString不是数组。(通常使用数组来实现,但那是另一回事。)

编辑:如评论中所述,+运算符字符串的特殊情况 - 就在语言规范中。也可以[]. (例如,您不能+为任何其他类提供自定义行为。)

于 2013-09-19T07:02:36.837 回答
3

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

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

于 2013-09-19T07:05:04.913 回答
2

可以写的原因

string s = "abc";
char c = s[i]; 

在 C++ 中,string类重载了索引运算符(比如 [] 运算符),它允许程序员访问string对象的字符,就像访问数组元素一样,尽管string对象不是数组。

另一方面,Java 不允许任何类型的运算符重载(唯一的例外是+为字符串重载的运算符),因此,索引运算符不能也不能为String对象重载。在 Java 中,要访问字符串中的某个字符,需要使用访问器成员方法,例如charAt. 您还可以调用该类的toCharArray方法,该方法String会返回一个字符串对象的字符数组,并且您可以使用带有此返回值的索引运算符:

char c = s.toCharArray()[i];
于 2013-09-19T07:24:36.043 回答
1

见方法String#charAt

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

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

public char charAt(int index)
于 2013-09-19T07:02:50.590 回答
0

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

于 2013-09-19T07:05:17.120 回答
0

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

于 2013-09-19T07:16:09.430 回答