Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串对象是字符数组吗?_Java_Arrays_String_Object_Chars - Fatal编程技术网

Java字符串对象是字符数组吗?

Java字符串对象是字符数组吗?,java,arrays,string,object,chars,Java,Arrays,String,Object,Chars,我是java新手,试图理解java语言的基本要素和基础 指出Java字符串对象本质上是一个定义为不可变字符数组的类是否准确? 我问这个问题是因为与char数组和string类相比,规范让我有点困惑 10.9字符数组不是字符串 在Java编程语言中,与C不同,字符数组不是字符串, 字符串或字符数组均不以“\u0000”(NUL)结尾 字符)。 字符串对象是不可变的,即其内容永远不会更改,而 char具有可变元素。 类字符串中的toCharArray方法返回一个包含 与字符串相同的字符序列。Str

我是java新手,试图理解java语言的基本要素和基础

指出Java字符串对象本质上是一个定义为不可变字符数组的类是否准确?

我问这个问题是因为与char数组和string类相比,规范让我有点困惑

10.9字符数组不是字符串 在Java编程语言中,与C不同,字符数组不是字符串, 字符串或字符数组均不以“\u0000”(NUL)结尾 字符)。 字符串对象是不可变的,即其内容永远不会更改,而 char具有可变元素。 类字符串中的toCharArray方法返回一个包含 与字符串相同的字符序列。StringBuffer类实现了有用的 可变字符数组上的方法

4.3.3类字符串的类字符串实例表示Unicode代码点序列

Java字符串对象本质上是一个定义为不可变字符数组的类,这种说法准确吗

不是。Java字符串对象是(目前-我收集的实现细节可能正在更改)一个包含几个字段的类:

  • 包含实际字符的
    char[]
  • 数组中的起始索引
  • 一段
  • 缓存的哈希代码,延迟计算
索引和长度的原因是多个字符串可以包含对相同
char[]
的引用。这被一些操作使用,例如
子字符串
(无论如何,在许多实现中)

重要的是
String
的API,这与数组的API非常不同。当您考虑JLS定义时,您会想到这个API:
String
表示一系列Unicode代码点。因此,您可以获取子序列(
Substring
),查找给定的子序列(
indexOf
),将其转换为大写序列等


事实上,JLS称之为UTF-16代码单元序列更为准确;完全可以构造不是有效的Unicode代码点序列的字符串,例如,通过包含UTF-16代码单元的“代理项对”的一半,而不是另一半。API的某些部分确实在代码单元方面处理字符串,但坦率地说,大多数开发人员将大部分时间花在处理字符串上,就好像不存在非BMP字符一样。

感谢您提出这个问题。我一直认为,字符串是一个字符数组+1@chaitanya10:关于你关于我现在删除的答案的问题:对象是类的实例。这不是一门课。一个类和一个对象是两个不同的东西。回答得很好。您能否解释一下“字符串表示Unicode代码点序列”以及它与包含实际字符的char[]有何不同?可能是非英语母语人士的困惑吗?+1接受-我认为这清楚地回答了我的问题。谢谢你简洁的回答。