java.math.BigXXX 最先是 c+jni,后来才 pure java。据说性能提升了不少,
我知道String中间的一个Bug: String.contentEquals(CharSequence) calculates twice for AbstractStringBuilder (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6355654) JDK 7中间已经修正(JDK7b03),据说JDK6及其他更低版本将不会修改 public boolean contentEquals(CharSequence cs) { if (count != cs.length()) return false; // Argument is a StringBuffer, StringBuilder if (cs instanceof AbstractStringBuilder) { char v1[] = value; char v2[] = ((AbstractStringBuilder)cs).getValue(); int i = offset; int j = 0; int n = count; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } ///////////// SINCE ALL CHARACTERS ARE EQUAL, WHY NOT RETURN TRUE HERE? } // Argument is a String if (cs.equals(this)) return true; // Argument is a generic CharSequence char v1[] = value; int i = offset; int j = 0; int n = count; while (n-- != 0) { if (v1[i++] != cs.charAt(j++)) return false; } return true; }
只有在某些具体情况下 性能不如其他的方法
但是它们在自己擅长的地方性能都很好
Java版本的更新会去掉许多方法,Java不断更新里面的方法都是千锤百炼的
(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6355654)
JDK 7中间已经修正(JDK7b03),据说JDK6及其他更低版本将不会修改 public boolean contentEquals(CharSequence cs) {
if (count != cs.length())
return false;
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
char v1[] = value;
char v2[] = ((AbstractStringBuilder)cs).getValue();
int i = offset;
int j = 0;
int n = count;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
///////////// SINCE ALL CHARACTERS ARE EQUAL, WHY NOT RETURN TRUE HERE?
}
// Argument is a String
if (cs.equals(this))
return true;
// Argument is a generic CharSequence
char v1[] = value;
int i = offset;
int j = 0;
int n = count;
while (n-- != 0) {
if (v1[i++] != cs.charAt(j++))
return false;
}
return true;
}
private static class CaseInsensitiveComparator
implements Comparator<String>, java.io.Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8575799808933029326L; public int compare(String s1, String s2) {
int n1=s1.length(), n2=s2.length();
for (int i1=0, i2=0; i1<n1 && i2<n2; i1++, i2++) {
char c1 = s1.charAt(i1);
char c2 = s2.charAt(i2);
if (c1 != c2) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
return c1 - c2;
}
}
}
}
return n1 - n2;
}
}i1 i2永远相等,何必用两个。还有一点,具体地方讲不全,就是代码用到了字符串拼接,但是由于代码很早,当时只有StringBuffer,而实际应用,这个buffer完全是方法内的局部变量,不存在线程安全性问题,用StringBuilder会快那么一点点。
正则之Matcher:
public static String quoteReplacement(String s) {
if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1))
return s;
StringBuffer sb = new StringBuffer(); // 可以使用StringBuilder,而且,最好设置一下初始大小,
// 否则,如果参数s的长度是1000,那么这个StringBuffer/Builder要增长好多次,才能满足大小
// see AbstractStringBuilder.expandCapacity(int)
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
if (c == '\\') {
sb.append('\\'); sb.append('\\');
} else if (c == '$') {
sb.append('\\'); sb.append('$');
} else {
sb.append(c);
}
}
return sb.toString();
}
3 非常容易误导,Iterator方式访问(包括foreach,这个只是代码,编译出来的内容就是Iterator方式)与i,i<size,i++相比,只快不慢,特别是大LinkedList,绝对绝对不能用i,i<size,i++
盖因LinkedList.get(int index)需要执行: /**
* Returns the indexed entry.
*/
private Entry<E> entry(int index) {
if (index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: "+index+
", Size: "+size);
Entry<E> e = header;
if (index < (size >> 1)) {
for (int i = 0; i <= index; i++)
e = e.next;
} else {
for (int i = size; i > index; i--)
e = e.previous;
}
return e;
}