在JAVA中 string的长度为啥是length方法 而不是length 属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JAVA中 string的长度为啥是length方法 而不是length 属性相关的知识,希望对你有一定的参考价值。
其实 tobyliu415 已经说了,我再解释一遍,String 的长度被设计成只能通过方法读取。专门为了防止出现类似 str.length = 5; 之类的语句。因为这是不合理的语句,用户是不应该这样设定字符串的长度的,应该只能读取它。这是封装,是面向对象的三大精髓之一,如果你仍然不理解上面的话,那没办法让你立刻理解,你需要慢慢熟悉面向对象。 参考技术A 我觉得纯粹是java语言的创造者编写String类源码时为了少写代码,给String类定义一个长度属性也没什么不可。String源码中定义了存储字符的成员变量,此处可知String对象本质就是字符数组。
/** The value is used for character storage. */
private final char value[];
其中一个构造方法
public String(char value[])
this.value = Arrays.copyOf(value, value.length);
获取String对象长度的方法
public int length()
return value.length;
从此处可知,获取String对象长度就是获取字符数组的长度属性。没有必要再定义一个长度属性,因为即使定义了,构建对象时用的也是字符数组。而且数组的length属性只读,不可修改。 参考技术B 因为如果直接使用属性,你可以给length赋值,这显然不是所希望的 参考技术C 因为在java中String是一个类, 参考技术D String 在Java是个对象
为啥 String.matchAll() 返回的 Iterable Object 的长度为 1?
【中文标题】为啥 String.matchAll() 返回的 Iterable Object 的长度为 1?【英文标题】:Why does the Iterable Object returned from String.matchAll() have a length of 1?为什么 String.matchAll() 返回的 Iterable Object 的长度为 1? 【发布时间】:2021-01-29 08:45:45 【问题描述】:当使用正则表达式通过 matchAll() 从字符串中提取匹配项时,使用扩展运算符扩展为 Array 对象的结果 Iterable 对象显示具有多个成员的嵌套数组。
const regexUpperCaseTo = /(?<=\x2d|\x5f)[a-zA-Z0-9]/g;
const testVar1 = [...str.matchAll(regexUpperCaseTo)]
当我们打印出 testVar1 时,它显示:
[
[ 's', index: 4, input: 'the-stealth-warrior', groups: undefined ],
[ 'w', index: 12, input: 'the-stealth-warrior', groups: undefined ]
]
同样,作为一个可迭代对象,我们可以使用 for/of 循环来迭代返回数组的每个元素。
[ 's', index: 4, input: 'the-stealth-warrior', groups: undefined ]
[ 'w', index: 12, input: 'the-stealth-warrior', groups: undefined ]
但是,一旦我们测试每个成员的长度,它就会返回 1。
console.log(testVar1.forEach(x => console.log(x.length)))
除此之外,当我们尝试访问每个数组的第 0 个成员之外的成员时,它会返回 undefined。
这是怎么回事,每个返回的成员似乎只包含第一个元素?
【问题讨论】:
你期望的长度是多少? @JaromandaX 那是x[0].length
命名属性不计入数组长度,只计入具有数字索引的属性。
匹配正则表达式返回的数组包含整个匹配的一个元素,然后是所有捕获组的元素。您的正则表达式没有捕获组,因此唯一的元素是完整匹配。
内部数组是长度为 1 的数组(例如,值为“s”),但在该数组上具有组、索引和输入属性,但数组的长度仍为 1 ...例如在你的 forEach 中尝试console.log(x.length, x.input, x.index, x.groups)
【参考方案1】:
这是正常的(与matchAll
返回的迭代器无关)。每个匹配项 - 就像从 .match()
和 .exec()
返回的匹配项一样 - 是一个数组对象,其中包含整个匹配项和捕获的组作为元素。
此外,该数组还有一些特殊属性,例如 .index
、.input
和(自 ES2018 起).groups
。另见Return positions of a regex match() in Javascript? 或Contents of a RegExp match。
【讨论】:
以上是关于在JAVA中 string的长度为啥是length方法 而不是length 属性的主要内容,如果未能解决你的问题,请参考以下文章
为啥 String.matchAll() 返回的 Iterable Object 的长度为 1?
LongestValidParentheses, 求最长合法括号子串长度-----同类问题ValidParentheses,GenerateParentheses