在C++
我可以做这样的事情......
String s = "abc";
char c = s[i]; // works fine...
但是Java
,如果我尝试做同样的事情,它会引发错误。为什么?。
在java
,要实现上述目标,我必须这样做:
s.toCharArray();
字符串的实现与C++
Java 中的实现有何不同?
在java中,要实现上述,我必须这样做: s.toCharArray();
并不真地。您可以charAt
改用:
char c = s.charAt(i);
基本上,C++ 允许用户定义的操作符——Java 不允许。因此String
该类不公开任何类型的“索引”运算符;仅存在于数组中,而 aString
不是数组。(通常使用数组来实现,但那是另一回事。)
编辑:如评论中所述,+
运算符是字符串的特殊情况 - 就在语言规范中。也可以对[]
. (例如,您不能+
为任何其他类提供自定义行为。)
不同之处在于 C++ 具有运算符重载,并使用它来访问字符串内容。
它们都以您无法更改的方式存储字符串字符。
可以写的原因
string s = "abc";
char c = s[i];
在 C++ 中,string
类重载了索引运算符(比如 [] 运算符),它允许程序员访问string
对象的字符,就像访问数组元素一样,尽管string
对象不是数组。
另一方面,Java 不允许任何类型的运算符重载(唯一的例外是+
为字符串重载的运算符),因此,索引运算符不能也不能为String
对象重载。在 Java 中,要访问字符串中的某个字符,需要使用访问器成员方法,例如charAt
. 您还可以调用该类的toCharArray
方法,该方法String
会返回一个字符串对象的字符数组,并且您可以使用带有此返回值的索引运算符:
char c = s.toCharArray()[i];
返回指定索引处的 char 值。索引的范围从 0 到 length() - 1。序列的第一个 char 值在索引 0 处,下一个在索引 1 处,依此类推,与数组索引一样。
如果索引指定的 char 值是代理项,则返回代理项值。
public char charAt(int index)
在 c++ 中,字符串已经被视为字符数组,但在 java 中,String 是一个内置类。它与字符数组不同。
在 C++ 中,字符串通常只是一个字符数组(或一个指针),以 NULL (\0) 字符结尾。您也可以像处理任何数组一样通过索引来处理字符串。
但是在 Java 中,字符串不是数组。Java 字符串是类型的对象,java.lang.String
因此您不能通过索引来处理它们。