jdk 1.6 中 ""getBytes() 失去系统默认编码性能瓶颈
jdk 1.6 中 "".getBytes() 得到系统默认编码性能瓶颈
"".getBytes() 源码中 用来得到系统默认编码时,
....
public byte[] getBytes() {
return StringCoding.encode(value, offset, count);
}
.......
static byte[] encode(char[] ca, int off, int len) {
String csn = Charset.defaultCharset().name();
try {
return encode(csn, ca, off, len);
} catch (UnsupportedEncodingException x) {
warnUnsupportedCharset(csn);
}
..........
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
java.security.PrivilegedAction pa =
new GetPropertyAction("file.encoding");
String csn = (String)AccessController.doPrivileged(pa);
Charset cs = lookup(csn);
........
得到系统默认编码的缓存用的是 synchronized 当系统多线程并发掉用时,会影响其它线程的运行,应该用这样的方式来代替
"".getBytes(StringUtil.getDefaultEncod())
package com.lin.test;
import java.nio.charset.Charset;
import java.util.concurrent.ConcurrentHashMap;
public class StringUtil {
private static ConcurrentHashMap<String, Charset> charsetHashMap=new ConcurrentHashMap<String, Charset>();
private static String systemDefaultCharsetEncode=System.getProperty("file.encoding");
private static Charset getCharset(String en)
{
if(charsetHashMap.get(en)==null)
{
charsetHashMap.put(en, Charset.forName(en));
}
return charsetHashMap.get(en);
}
public static Charset getDefaultEncod()
{
return getCharset(systemDefaultCharsetEncode);
}
}
"".getBytes() 源码中 用来得到系统默认编码时,
....
public byte[] getBytes() {
return StringCoding.encode(value, offset, count);
}
.......
static byte[] encode(char[] ca, int off, int len) {
String csn = Charset.defaultCharset().name();
try {
return encode(csn, ca, off, len);
} catch (UnsupportedEncodingException x) {
warnUnsupportedCharset(csn);
}
..........
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
java.security.PrivilegedAction pa =
new GetPropertyAction("file.encoding");
String csn = (String)AccessController.doPrivileged(pa);
Charset cs = lookup(csn);
........
得到系统默认编码的缓存用的是 synchronized 当系统多线程并发掉用时,会影响其它线程的运行,应该用这样的方式来代替
"".getBytes(StringUtil.getDefaultEncod())
package com.lin.test;
import java.nio.charset.Charset;
import java.util.concurrent.ConcurrentHashMap;
public class StringUtil {
private static ConcurrentHashMap<String, Charset> charsetHashMap=new ConcurrentHashMap<String, Charset>();
private static String systemDefaultCharsetEncode=System.getProperty("file.encoding");
private static Charset getCharset(String en)
{
if(charsetHashMap.get(en)==null)
{
charsetHashMap.put(en, Charset.forName(en));
}
return charsetHashMap.get(en);
}
public static Charset getDefaultEncod()
{
return getCharset(systemDefaultCharsetEncode);
}
}