3

我想知道toLowerCase字符串的含义。这里的字符串长度可以变化最多 50 个字符,也可以是小写。

在我们的例子中,我们需要检查用户输入的字符串,然后将该输入以小写形式保存在数据库中,并在大容量上进行检查。

所以我应该先检查大小写不匹配,然后String.toLowerCase直接应用 OR 总是应用String.toLowerCase()在每个字符串上,包括小写字符串。

有没有更好的方法来处理这种类型的情况,同时牢记性能?

提前致谢。

4

5 回答 5

7

Openjdk 在开始构建新字符串之前会在内部执行检查是否有任何非小写字符:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.toLowerCase%28java.util.Locale%29

SUN Java 以类似的方式工作(请参阅下面的评论),因此您无需自己进行额外检查。


==即使没有必要,您应该能够(在一个小型测试程序中)仔细检查您的 Java 版本是否分配了新字符串:

String test = "all lower case";
if (test == test.toLowerCase()) {
  System.out.println("The strings are the same object, " + 
      "so toLowerCase performs a check before allocating a new one.");
} else {
  System.out.println("A new string object is created even when not needed.");
}
于 2013-05-25T06:25:56.717 回答
3

在我的职业生涯中,我不得不解析一些大文件(放气后>1GB)。根据我的经验,直接调用toLowercase()而不是检查然后调用它是一个好主意。

于 2013-05-25T06:27:31.823 回答
2

如果您选择检查上面的那些,您将不得不执行for loop + if condition,这太难看了,所以我认为直接使用toLowercase()所有字符串是很好的 +toLowercase()实际为您执行这些操作

于 2013-05-25T06:26:04.560 回答
2

String.toLowerCase 已优化为仅在必要时创建新字符串,试试这个

    String s = "date";
    System.out.print(s == s.toLowerCase());

输出

true
于 2013-05-25T06:29:56.500 回答
0

我认为允许数据库使用触发器进行转换可能比在 java 中进行字符串操作在性能上更好。我没有对此进行测试,但您可以尝试查看是否存在性能差异。

在表上定义触发器

CREATE TRIGGER lcase_insert BEFORE INSERT ON my_table FOR EACH ROW
SET NEW.language = LOWER(NEW.language);

CREATE TRIGGER lcase_update BEFORE UPDATE ON my_table FOR EACH ROW
SET NEW.language = LOWER(NEW.language);
于 2013-05-25T06:33:25.670 回答