您的位置:首页 > 编程语言 > Java开发

最常问到的关于JAVA String的10个问题

2013-12-20 16:53 405 查看
以下是关于Java String的出现频率最高的10个问题:

1. 怎么比较String,用“==”还是equals()

简单来说,“==”是用来比较内存引用是否相等而equals是比较值是不是相等,除非你想看看两个string是不是同一个对象,否则你都应该用equals()。

2. 对于敏感信息来说(比如密码),为什么使用char[]比用String好?

String是不可变长度的,它在被创建之后会一直保持不变,直到被当垃圾回收。但是使用char数组却不一样,你可以随时修改它。所以如果使用char数组的话,敏感信息(如密码)就不太可能出现在系统的其它地方(而String在被回收前,你不知道它在哪)。

3. 可以在switch语句中使用String吗?

在JDK6及之前的版本是不可以的,从JDK7开始可以了:

// java 7 only!
switch (str.toLowerCase()) {
case "a":
value = 1;
break;
case "b":
value = 2;
break;
}


4. 怎么把String转换成int?

int n = Integer.parseInt("10");


很简单且经常用到,但是却有可能有时候会忘掉。

5. 怎么根据空白字符分割String?

可以用正则表达式:“\s”可以表示的空白字符有:“ ”, “\t”,“\r”,“\n” 即空格、TAB、换行、回车。

String[] strArray = aString.split("\\s+");


6. substring究竟做了什么?

在JDK6中,substring()方法返回的是原来的字符串,并没有创建一个新的。如果要创建一个全新的String的话可以这样:

str.substring(m, n) + ""


用上面这种方式通常会使程序更快,因为原来的字符串得以被回收。

在JDK7中,substring()创建了一个全新的字符串,不使用原来的。详细可以查阅:

substring()方法在JDK6和JDK7中的区别

7. String 和StringBuilder 及StringBuffer的区别

String和StringBuilder: StringBuilder是可变长度的,创建以后可以随时修改它。

StringBuilder和StringBuffer: StringBuffer是线程安全的,所以会比StringBuilder更慢,建议多个线程操作时使用。

8. 怎么重复String

可以使用Apache公共语言包(Apache Commons Lang package)中的repeat方法:

String str = "abcd";
String repeated = StringUtils.repeat(str,3);
//abcdabcdabcd


9. 怎么把字符串变成日期?

String str = "Sep 17, 2013";
Date date = new SimpleDateFormat("MMMM d, yy", Locale.ENGLISH).parse(str);
System.out.println(date);
//Tue Sep 17 00:00:00 EDT 2013


10. 怎么计算一个字符在字符串中的出现次数?

使用Apache公共语言包(Apache Commons Lang package)中的StringUtils:

int n = StringUtils.countMatches("11112222", "1");
System.out.println(n);


------------以下是我自己加的,非翻译------------

StringUtils.countMatches原理是这样的:

public static int countMatches(CharSequence str, CharSequence sub) {
if (isEmpty(str) || isEmpty(sub)) {
return 0;
}
int count = 0;
int idx = 0;
while ((idx = CharSequenceUtils.indexOf(str, sub, idx)) != INDEX_NOT_FOUND) {
count++;
idx += sub.length();
}
return count;
}
即循环使用indexOf,累加看有多少个。

StringUtils.repeat原理是这样的:

public static String repeat(String str, int repeat) {
// Performance tuned for 2.0 (JDK1.4)

if (str == null) {
return null;
}
if (repeat <= 0) {
return EMPTY;
}
int inputLength = str.length();
if (repeat == 1 || inputLength == 0) {
return str;
}
if (inputLength == 1 && repeat <= PAD_LIMIT) {
return repeat(str.charAt(0), repeat);
}

int outputLength = inputLength * repeat;
switch (inputLength) {
case 1 :
return repeat(str.charAt(0), repeat);
case 2 :
char ch0 = str.charAt(0);
char ch1 = str.charAt(1);
char[] output2 = new char[outputLength];
for (int i = repeat * 2 - 2; i >= 0; i--, i--) {
output2[i] = ch0;
output2[i + 1] = ch1;
}
return new String(output2);
default :
StringBuilder buf = new StringBuilder(outputLength);
for (int i = 0; i < repeat; i++) {
buf.append(str);
}
return buf.toString();
}
}
先计算总长度,然后用StringBuilder累加。

原文地址:http://www.programcreek.com/2013/09/top-10-faqs-of-java-strings/

原文标题:Top 10 questions of Java Strings
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: