.length()与.getText().length()与.getText().toString().length()的区别

19
例如,在下面的代码中,abc是相等的。
EditText editText;
editText = (EditText) findViewById(R.id.edttxt);

editText.setText("1234");

int a, b, c;
a = editText.length();
b = editText.getText().length();
c = editText.getText().toString().length();

length()getText().length()以及getText().toString().length()有什么区别?

3个回答

21

.length()getText().length()它们目前的实现 中是相同的。

.getText().toString().length() 将会把 CharSequence 转化为普通的 String,并计算其长度。我预期在许多情况下它将返回与另外两个相同的值。 然而,如果CharSequence 是类似于 SpannedString 这样的东西,我不能排除某些类型的格式化标记(例如 ImageSpan)对长度计算的影响。


8

这是一个关于性能的问题。 lengthgetText 以及 length 的作用完全相同,只是它可以避免你输入 getText()。 这段代码来自于 EditText 扩展的 TextView 类:

public CharSequence getText() {
    return mText;
}

/**
 * Returns the length, in characters, of the text managed by this TextView
 */
public int length() {
    return mText.length();
}

关于toString,它是一样的,不过,任何转换你做(CharSequence => String),都会在性能方面稍微损失一点点(这点损失很小,你可能察觉不到)。此外,当你转换东西时,你必须注意空指针异常,虽然在这个例子中可能不用,但一般来说还是要注意。回答这个问题,只需使用length()。

1
微小的细节会累积成巨大的时间片。如果这在尚未呈现的数据中完成(例如在后台工作线程中),重复产生字符串并将它们留给垃圾回收器是一个非常愚蠢的想法。我只是想明确一点,即使对于任何平台(对于这些字符数量),单个转换都没问题,但如果您执行太多次转换,它将需要时间。 - Bernardo Sulzbach
您说得完全正确,mafagafogigante。通常情况下并非如此。然而,最佳实践要求我们在不必要的时候不进行转换。 - TacoEater

5
  1. length()length()函数是由EditView继承的方法,该方法被TextView继承,返回由此EditView管理的文本的字符长度。因此,它将返回用户输入到EditView控件中的文本长度。

  2. getText().length():在这个语句中,length()函数不属于EditView类。实际上,这个length()函数属于CharSequence类,因为getText()返回一个CharSequence对象。因此,这个length()函数将返回此序列中的字符数。

  3. .getText().toString().length():这里的toString()方法将CharSequence对象转换为一个普通的不可变String对象。所以,在这里,length()函数属于String类,也返回String对象的长度。


请删除所有单词的奇怪大写。 - user207421
正如您从我的答案中提取的EditText源代码所看到的那样,1和2是相同的,因为它们都使用CharSequence长度。重要的不是它们继承自谁,而是调用的对象长度是什么。 - TacoEater

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