??xml version="1.0" encoding="utf-8" standalone="yes"?> JDK1.6官方下蝲_JDK6官方下蝲地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe
JDK6 API CHM中文参考下?
JDK6API中文参?70114.rar :
http://chinesedocument.com/upimg/soft/JDK6API中文参?70114.rar
Java SE 6 API 中文?CHM 下蝲:http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM Java SE 5 API 中文?CHM 下蝲:http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/JDK_API_1_5_zh_CN.CHM JDK6 API 中文版下?
https://jdk-api-zh-cn.dev.java.net/
ZIP格式Q?a target="_blank">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html_zh_CN.zip CHM格式Q?a >http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/chm/JDK_API_1_6_zh_CN.CHM
一、汉字编码的U类
汉字~码中现在主要用到的有三c,包括GBKQ?span lang="EN-US">GB2312?span lang="EN-US">Big5?/span>
1
?span lang="EN-US">GB2312又称国标码,
由国家标准d发布Q?/span>
1981
q?/span>
5
?/span>
1
日实施,通行于大陆。新加坡{地也用此~码。它是一个简化字的编码规范,当然也包括其他的W号、字母、日文假名等Q共
7445
个图形字W,其中汉字?/span>
6763
个。我们^时说
6768
个汉字,实际上里Ҏ
5
个编码ؓI白Q所以d?/span>
6763
个汉字?/span>
GB2312
规定“对L一个图形字W都采用两个字节表示Q每个字节均采用七位~码表示”,习惯上称W一个字节ؓ“高字节”,W二个字节ؓ“低字节”?/span>
GB2312
中汉字的~码范围为,W一字节0xB0-0xF7(对应十进制ؓ176-247)Q第二个字节0xA0-0xFEQ对应十q制?span lang="EN-US">160-254Q?/span>
GB2312
代码表分ؓ
94
个区Q对应第一字节Q?/span>
0xa1-0xfe
Q;每个?/span>
94
个位Q?/span>
0xa1-0xfe
Q,对应W二字节Q两个字节的值分别ؓ区号值和位号值加
32
Q?/span>
2OH
Q,因此也称为区位码?/span>
01-09
ZؓW号、数字区Q?/span>
16-87
Zؓ汉字区(
0xb0-0xf7
Q,
10-15
区?/span>
88-94
区是有待q一步标准化的空白区?/span>
2
?/span>
Big5
又称大五码,主要为香港与台湾使用Q即是一个繁体字~码?/span>
每个汉字׃个字节构成,W一个字节的范围?/span>
0X81
Q?/span>
0XFE
Q即
129-255
Q,?/span>
126
U。第二个字节的范围不q箋Q分别ؓ
0X40
Q?/span>
0X7E
Q即
64-126
Q,
0XA1
Q?/span>
0XFE
Q即
161-254
Q,?/span>
157
U?/span>
3
?span lang="EN-US">GBK?span lang="EN-US">GB2312的扩展,是向上兼容的Q因?span lang="EN-US">GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含J体字的~码Q它?span lang="EN-US">Big5~码之间的关pLq没有弄明白Q好像是不一致的?span lang="EN-US">GBK中每个汉字仍然包含两个字节,W一个字节的范围?span lang="EN-US">0x81-0xFEQ即129-254Q,W二个字节的范围?span lang="EN-US">0x40-0xFEQ即64-254Q?span lang="EN-US">GBK中有码位23940个,包含汉字21003个?/span>
?span lang="EN-US">1 汉字~码范围
名称
W一字节
W二字节
GB2312
0xB0-0xF7(176-247)
0xA0-0xFE
Q?/span>
160-254
Q?/span>
GBK
0x81-0xFE
Q?/span>
129-254
Q?/span>
0x40-0xFE
Q?/span>
64-254
Q?/span>
Big5
0x81-0xFE
Q?/span>
129-255
Q?/span>
0x40-0x7E
Q?/span>
64-126
Q?/span>
0xA1
Q?/span>
0xFE
Q?/span>
161-254
Q?/span>
二、对汉字q行hash
Z处理汉字的方便,在查找汉字的时候,我们通常会用?span lang="EN-US">hash的方法,那怎么来确定一个汉字位|呢Q这和每种~码的排列有关了Q这里主要给ZU?span lang="EN-US">hash函数的策略?/span>
对于GB2312~码Q设输入的汉字ؓGBwordQ我们可以采用公?span lang="EN-US">(C1-176)*94 + (C2-161)定GBindex。其中,C1表示W一字节Q?span lang="EN-US">C2表示W二字节。具体如下:
GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;
之所以用unsigned charcdQ是因ؓchar是一个字节,如果?span lang="EN-US">unsigend intQ因?span lang="EN-US">int?span lang="EN-US">4个字节的Q所以会造成扩展Q导致错误?/span>
对于GBK~码Q设输入的汉字ؓGBKwordQ则可以采用公式
index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128)
Q其?span lang="EN-US">ch1是第一字节Q?span lang="EN-US">ch2是第二字节?/span>
具体的,
GBKindex = ((unsigned char)GBKword[0]-129)*190 +
((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;
三、怎样判断一个汉字的是什么编?/span>
直接Ҏ汉字的编码范围判断,对于GB2312?span lang="EN-US">GBK可用下面两个E序实现?/span>
1
、判断是否是GB2312
bool isGBCode(const string& strIn)
{
unsigned char ch1;
unsigned char ch2;
if (strIn.size() >= 2)
{
ch1 = (unsigned char)strIn.at(0);
ch2 = (unsigned char)strIn.at(1);
if (ch1>=176 && ch1<=247 && ch2>=160 && ch2<=254)
return true;
else return false;
}
else return false;
}
2
、判断是否是GBK~码
bool isGBKCode(const string& strIn)
{
unsigned char ch1;
unsigned char ch2;
if (strIn.size() >= 2)
{
ch1 = (unsigned char)strIn.at(0);
ch2 = (unsigned char)strIn.at(1);
if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)
return true;
else return false;
}
else return false;
}
3
、对?span lang="EN-US">Big5
它的范围为:高字节从0xA0?span lang="EN-US">0xFEQ低字节?span lang="EN-US">0x40?span lang="EN-US">0x7EQ和0xA1?span lang="EN-US">0xFE两部分。判断一个汉字是否是BIG5~码Q可以如上对字符的编码范围判断即可。如何定位呢Q那么也惌所有编码排列ؓ一个二l坐标,U坐标是高字节,横坐标是低字节。这样一行上的汉字个敎ͼ(0x7E-0x40+1)+(0xFE-0xA1+1)Q?span lang="EN-US">157。那么定位算法分两块Qؓ:
if 0x40<=ch2<=0x7E: #is big5 char
index=((ch1-0xA1)*157+(ch2-0x40))*2
elif 0xA1<=ch2<=0xFE: #is big5 char
index=((ch1-0xA1)*157+(ch2-0xA1+63))*2
对于W二块,计算偏移量时因ؓ有两块数|所以在计算后面一D值时Q不要忘了前面还有一D倹{?span lang="EN-US">0x7E-0x40+1=63?/span>
四、如果判断一个字W是西文字符q是中文字符
大家知道西文字符主要是指
ASCII
码,它用一个字节表C。且q个字符转换成数字之后,该数字是大于0的,而汉字是两个字节的,W一个字节的转化为数字之后应该是于0的,因此可以Ҏ每个字节转化为数字之后是否小?span lang="EN-US">0Q判断它是否是汉字?/span>
例如Q设输入字ؓstrinQ则Q?/span>
If (strin.at(0) < 0)
cout << ?/span>
是汉?span lang="EN-US">?<< endl;
else cout << ?/span>
不是汉字?<< endl;
五、编码表下蝲
GBK~码表,下蝲
GB2312~码表,下蝲
匚w中文字符的正则表辑ּQ?[u4e00-u9fa5] 匚w双字节字W?包括汉字在内)Q[^x00-xff] 匚wI白行的正则表达式:ns*r 匚wHTML标记的正则表辑ּQ?lt; (S*?)[^>]*>.*?|< .*? /> 匚w首尾I白字符的正则表辑ּQ^s*|s*$
匚w|址URL的正则表辑ּQ[a-zA-z]+://[^s]* 匚w帐号是否合法(字母开_允许5-16字节Q允许字母数字下划线)Q^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匚w国内电话LQd{3}-d{8}|d{4}-d{7} 匚w腾讯QQP[1-9][0-9]{4,} 匚w中国邮政~码Q[1-9]d{5}(?!d) 匚ww䆾证:d{15}|d{18} 匚wip地址Qd+.d+.d+.d+ 匚w特定数字Q?br />^[1-9]d*$ //匚w正整?br />^-[1-9]d*$ //匚w负整?br />^-?[1-9]d*$ //匚w整数 匚w特定字符Ԍ 在用RegularExpressionValidator验证控g时的验证功能及其验证表达式介l如? 只能输入数字Q“^[0-9]*$?br />只能输入n位的数字Q“^d{n}$?br />只能输入臛_n位数字:“^d{n,}$?br />只能输入m-n位的数字Q“^d{m,n}$?br />只能输入零和非零开头的数字Q“^(0|[1-9][0-9]*)$?br />只能输入有两位小数的正实敎ͼ“^[0-9]+(.[0-9]{2})?$?br />只能输入?-3位小数的正实敎ͼ“^[0-9]+(.[0-9]{1,3})?$?br />只能输入非零的正整数Q“^+?[1-9][0-9]*$?br />只能输入非零的负整数Q“^-[1-9][0-9]*$?br />只能输入长度?的字W:“^.{3}$?br />只能输入?6个英文字母组成的字符Ԍ“^[A-Za-z]+$?br />只能输入?6个大写英文字母组成的字符Ԍ“^[A-Z]+$?br />只能输入?6个小写英文字母组成的字符Ԍ“^[a-z]+$?br />只能输入由数字和26个英文字母组成的字符Ԍ“^[A-Za-z0-9]+$?br />只能输入由数字?6个英文字母或者下划线l成的字W串Q“^w+$?br />验证用户密码:“^[a-zA-Z]w{5,17}$”正格式ؓQ以字母开_长度?-18之间Q?/p>
只能包含字符、数字和下划Uѝ?br />验证是否含有^%&?;=?$”等字符Q“[^%&',;=?$x22]+?br />只能输入汉字Q“^[u4e00-u9fa5],{0,}$?br />验证Email地址Q“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$?br />验证InternetURLQ“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$?br />验证电话LQ“^((d{3,4})|d{3,4}-)?d{7,8}$?/p>
正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”, “XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”?br />验证w䆾证号Q?5位或18位数字)Q“^d{15}|d{}18$?br />验证一q的12个月Q“^(0?[1-9]|1[0-2])$”正格式ؓQ?1??9”和?”?2?br />验证一个月?1天:“^((0?[1-9])|((1|2)[0-9])|30|31)$?/p>
正确格式为:?1”?9”和?”?1”?/p>
匚w中文字符的正则表辑ּQ?[u4e00-u9fa5] (1)应用Q计字W串的长度(一个双字节字符长度?QASCII字符?Q?br />String.prototype.len=function(){return this.replace([^x00-xff]/g,”aa?.length;} (2)应用Qjavascript中没有像vbscript那样的trim函数Q我们就可以利用q个表达式来实现
一、汉字编码的U类
汉字~码中现在主要用到的有三c,包括GBKQ?span lang="EN-US">GB2312?span lang="EN-US">Big5?/span>
1
?span lang="EN-US">GB2312又称国标码,
由国家标准d发布Q?/span>
1981
q?/span>
5
?/span>
1
日实施,通行于大陆。新加坡{地也用此~码。它是一个简化字的编码规范,当然也包括其他的W号、字母、日文假名等Q共
7445
个图形字W,其中汉字?/span>
6763
个。我们^时说
6768
个汉字,实际上里Ҏ
5
个编码ؓI白Q所以d?/span>
6763
个汉字?/span>
GB2312
规定“对L一个图形字W都采用两个字节表示Q每个字节均采用七位~码表示”,习惯上称W一个字节ؓ“高字节”,W二个字节ؓ“低字节”?/span>
GB2312
中汉字的~码范围为,W一字节0xB0-0xF7(对应十进制ؓ176-247)Q第二个字节0xA0-0xFEQ对应十q制?span lang="EN-US">160-254Q?/span>
GB2312
代码表分ؓ
94
个区Q对应第一字节Q?/span>
0xa1-0xfe
Q;每个?/span>
94
个位Q?/span>
0xa1-0xfe
Q,对应W二字节Q两个字节的值分别ؓ区号值和位号值加
32
Q?/span>
2OH
Q,因此也称为区位码?/span>
01-09
ZؓW号、数字区Q?/span>
16-87
Zؓ汉字区(
0xb0-0xf7
Q,
10-15
区?/span>
88-94
区是有待q一步标准化的空白区?/span>
2
?/span>
Big5
又称大五码,主要为香港与台湾使用Q即是一个繁体字~码?/span>
每个汉字׃个字节构成,W一个字节的范围?/span>
0X81
Q?/span>
0XFE
Q即
129-255
Q,?/span>
126
U。第二个字节的范围不q箋Q分别ؓ
0X40
Q?/span>
0X7E
Q即
64-126
Q,
0XA1
Q?/span>
0XFE
Q即
161-254
Q,?/span>
157
U?/span>
3
?span lang="EN-US">GBK?span lang="EN-US">GB2312的扩展,是向上兼容的Q因?span lang="EN-US">GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含J体字的~码Q它?span lang="EN-US">Big5~码之间的关pLq没有弄明白Q好像是不一致的?span lang="EN-US">GBK中每个汉字仍然包含两个字节,W一个字节的范围?span lang="EN-US">0x81-0xFEQ即129-254Q,W二个字节的范围?span lang="EN-US">0x40-0xFEQ即64-254Q?span lang="EN-US">GBK中有码位23940个,包含汉字21003个?/span>
?span lang="EN-US">1 汉字~码范围
名称
W一字节
W二字节
GB2312
0xB0-0xF7(176-247)
0xA0-0xFE
Q?/span>
160-254
Q?/span>
GBK
0x81-0xFE
Q?/span>
129-254
Q?/span>
0x40-0xFE
Q?/span>
64-254
Q?/span>
Big5
0x81-0xFE
Q?/span>
129-255
Q?/span>
0x40-0x7E
Q?/span>
64-126
Q?/span>
0xA1
Q?/span>
0xFE
Q?/span>
161-254
Q?/span>
二、对汉字q行hash
Z处理汉字的方便,在查找汉字的时候,我们通常会用?span lang="EN-US">hash的方法,那怎么来确定一个汉字位|呢Q这和每种~码的排列有关了Q这里主要给ZU?span lang="EN-US">hash函数的策略?/span>
对于GB2312~码Q设输入的汉字ؓGBwordQ我们可以采用公?span lang="EN-US">(C1-176)*94 + (C2-161)定GBindex。其中,C1表示W一字节Q?span lang="EN-US">C2表示W二字节。具体如下:
GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;
之所以用unsigned charcdQ是因ؓchar是一个字节,如果?span lang="EN-US">unsigend intQ因?span lang="EN-US">int?span lang="EN-US">4个字节的Q所以会造成扩展Q导致错误?/span>
对于GBK~码Q设输入的汉字ؓGBKwordQ则可以采用公式
index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128)
Q其?span lang="EN-US">ch1是第一字节Q?span lang="EN-US">ch2是第二字节?/span>
具体的,
GBKindex = ((unsigned char)GBKword[0]-129)*190 +
((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;
三、怎样判断一个汉字的是什么编?/span>
直接Ҏ汉字的编码范围判断,对于GB2312?span lang="EN-US">GBK可用下面两个E序实现?/span>
1
、判断是否是GB2312
bool isGBCode(const string& strIn)
{
unsigned char ch1;
unsigned char ch2;
if (strIn.size() >= 2)
{
ch1 = (unsigned char)strIn.at(0);
ch2 = (unsigned char)strIn.at(1);
if (ch1>=176 && ch1<=247 && ch2>=160 && ch2<=254)
return true;
else return false;
}
else return false;
}
2
、判断是否是GBK~码
bool isGBKCode(const string& strIn)
{
unsigned char ch1;
unsigned char ch2;
if (strIn.size() >= 2)
{
ch1 = (unsigned char)strIn.at(0);
ch2 = (unsigned char)strIn.at(1);
if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)
return true;
else return false;
}
else return false;
}
3
、对?span lang="EN-US">Big5
它的范围为:高字节从0xA0?span lang="EN-US">0xFEQ低字节?span lang="EN-US">0x40?span lang="EN-US">0x7EQ和0xA1?span lang="EN-US">0xFE两部分。判断一个汉字是否是BIG5~码Q可以如上对字符的编码范围判断即可。如何定位呢Q那么也惌所有编码排列ؓ一个二l坐标,U坐标是高字节,横坐标是低字节。这样一行上的汉字个敎ͼ(0x7E-0x40+1)+(0xFE-0xA1+1)Q?span lang="EN-US">157。那么定位算法分两块Qؓ:
if 0x40<=ch2<=0x7E: #is big5 char
index=((ch1-0xA1)*157+(ch2-0x40))*2
elif 0xA1<=ch2<=0xFE: #is big5 char
index=((ch1-0xA1)*157+(ch2-0xA1+63))*2
对于W二块,计算偏移量时因ؓ有两块数|所以在计算后面一D值时Q不要忘了前面还有一D倹{?span lang="EN-US">0x7E-0x40+1=63?/span>
四、如果判断一个字W是西文字符q是中文字符
大家知道西文字符主要是指
ASCII
码,它用一个字节表C。且q个字符转换成数字之后,该数字是大于0的,而汉字是两个字节的,W一个字节的转化为数字之后应该是于0的,因此可以Ҏ每个字节转化为数字之后是否小?span lang="EN-US">0Q判断它是否是汉字?/span>
例如Q设输入字ؓstrinQ则Q?/span>
If (strin.at(0) < 0)
cout << ?/span>
是汉?span lang="EN-US">?<< endl;
else cout << ?/span>
不是汉字?<< endl;
汉字?Unicode 里面有单独的几块区域Q是中日韩(朝鲜Q共享的?br />以下两段
五、编码表下蝲
GBK~码表,下蝲
GB2312~码表,下蝲
]]>
]]>
]]>
]]>
]]>
]]>
con.setAutoCommit(false);
…… ?//执行你的d
…… ?
con.commit();
con.setAutoCommit(true);
}catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
if (con != null) {
try {
System.err.print("Transaction is being ");
System.err.println("rolled back");
con.rollback();
} catch(SQLException excep) {
System.err.print("SQLException: ");
System.err.println(excep.getMessage());
}
}
}
finaly{
try{
if(con != null){
con.close();
}
setAutoCommit(false)之后Q你必须手工调用commit 或? rollback来确认事务是提交q是回滚
最好再调用setAutoCommit(true)来关闭事务状态再closeq接
]]>
DataSource ds = (DataSource)context.getAttribute("dataSource");
从配|文件中获取数据库连?br />
]]>
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//讄日期格式
System.out.println(df.format(t));
]]>
JDK6 API 中文?HTML 格式在线文档Q?a target="_blank">http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html/zh_CN/api/
JDK6 API 中文版zip 格式下蝲Q?http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html_zh_CN.zip
]]>
]]>
评注Q匹配中文还真是个头疼的事,有了q个表达式就好办?/p>
评注Q可以用来计字W串的长度(一个双字节字符长度?QASCII字符?Q?/p>
评注Q可以用来删除空白行
评注Q网上流传的版本太糟p,上面q个也仅仅能匚w部分Q对于复杂的嵌套标记依旧无能为力
评注Q可以用来删除行首行I白字符(包括I格、制表符、换늬{等)Q非常有用的表达?/p>
匚wEmail地址的正则表辑ּQw+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注Q表单验证时很实?/code>
评注Q网上流传的版本功能很有限,上面q个基本可以满需?/p>
评注Q表单验证时很实?/p>
评注Q匹配Ş式如 0511-4405222 ?021-87888822
评注Q腾讯QQ号从10000开?/p>
评注Q中国邮政编码ؓ6位数?/p>
评注Q中国的w䆾证ؓ15位或18?/p>
评注Q提取ip地址时有?/p>
^[1-9]d*|0$ //匚w非负整数Q正整数 + 0Q?br />^-[1-9]d*|0$ //匚w非正整数Q负整数 + 0Q?br />^[1-9]d*.d*|0.d*[1-9]d*$ //匚w正QҎ
^-([1-9]d*.d*|0.d*[1-9]d*)$ //匚w负QҎ
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匚w点?br />^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匚w非负点敎ͼ正QҎ + 0Q?br />^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匚w非正点敎ͼ负QҎ + 0Q?br />评注Q处理大量数据时有用Q具体应用时注意修正
^[A-Za-z]+$ //匚w?6个英文字母组成的字符?br />^[A-Z]+$ //匚w?6个英文字母的大写l成的字W串
^[a-z]+$ //匚w?6个英文字母的写l成的字W串
^[A-Za-z0-9]+$ //匚w由数字和26个英文字母组成的字符?br />^w+$ //匚w由数字?6个英文字母或者下划线l成的字W串
匚w双字节字W?包括汉字在内)Q[^x00-xff]
匚wI的正则表辑ּQn[s| ]*r
匚wHTML标记的正则表辑ּQ?< (.*)>.*|< (.*) />/
匚w首尾I格的正则表辑ּQ?^s*)|(s*$)
匚wEmail地址的正则表辑ּQw+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匚w|址URL的正则表辑ּQhttp://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
String.prototype.trim = function()
{
return this.replace(/(^s*)|(s*$)/g, “?;
}
(3)应用Q利用正则表辑ּ分解和{换IP地址
function IP2V(ip) //IP地址转换成对应数?br />{
re=/(d+).(d+).(d+).(d+)/g //匚wIP地址的正则表辑ּ
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error(”Not a valid IP address!?
}
}
(4)应用Q从URL地址中提取文件名的javascriptE序
s=”http://www.9499.net/page1.htm?
s=s.replace(/(.*/){0,}([^.]+).*/ig,?2? ; //Page1.htm
(5)应用Q利用正则表辑ּ限制|页表单里的文本框输入内?br />用正则表辑ּ限制只能输入中文Qonkeyup=”value=?blog/value.replace(/["^u4E00-u9FA5]/g,? ?onbeforepaste=”clipboardData.setData(’text?clipboardData.getData(’text?.replace(/[^u4E00-u9FA5]/g,?)?br />用正则表辑ּ限制只能输入全角字符Q?onkeyup=”value=?blog/value.replace(/["^uFF00-uFFFF]/g,? ?onbeforepaste=”clipboardData.setData(’text?clipboardData.getData(’text?.replace(/[^uFF00-uFFFF]/g,?)?br />用正则表辑ּ限制只能输入数字Qonkeyup=”value=?blog/value.replace(/["^d]/g,? “onbeforepaste= “clipboardData.setData(’text?clipboardData.getData(’text?.replace(/[^d]/g,?)?br />用正则表辑ּ限制只能输入数字和英文:onkeyup=”value=?blog/value.replace(/[W]/g,”? “onbeforepaste=”clipboardData.setData(’text?clipboardData.getData(’text?.replace(/[^d]/g,?br />
]]>
U+4e00 ~ U+9FB0 原来 GB2312 ?GBK 中的汉字
U+3400 ~ U+4DB6 包括 GB18030.2000 中那些增加的汉字
]]>
System.out.println(new String(testString.getBytes("UTF8"),"gb2312"));
System.out.println(new String(testString.getBytes("GB2312"),"gb2312"));
System.out.println(new String(testString.getBytes("GBK"),"gb2312"));
System.out.println(new String(testString.getBytes("BIG5"),"gb2312"));
]]> 具体详情参见 http://bugs.adobe.com/jira/browse/FP-67
]]>
out = pageContext.pushBody();
]]>
/** Creates a new instance of ssss */
public ssss() {
}
public static void main(String s[]) throws IOException{
// java.net.URL m=new java.net.URL(" // HttpURLConnection sst=(HttpURLConnection) m.openConnection();
// DataInputStream in = new DataInputStream(connection.getInputStream());
// DataOutputStream out = new DataOutputStream(new FileOutputStream(fileName));
DataInputStream tttt= new DataInputStream((InputStream)new FileInputStream("c://ffffff.java.bak"));
// DataInputStream tttt=new DataInputStream(sst.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream("D://ffffff.java.bak"));
byte[] buffer = new byte[4096];
int count=0;
while ((count = tttt.read(buffer))>0){
out.write(buffer,0,count);
}
out.close();
tttt.close();
}
]]>
http//www.dxiaoshuo.com
http://www.mdianying.com
]]>
2. 生成对象Ӟ分配合理的空间和大小,如StringBuffer,Vector的初始化大小;
3. 优化循环?避免在@环中生成同一个变量或调用同一个函敎ͼ参数变量也一P;
4. 量在用时才创对象; 应该量重复使用一个对象,而不是声明新的同cd?
5. 量使用局部变? 量使用静态变量,从而他所有的实例都共享这个变?
6. 量减少Ҏ的调? 可事先判? 同时用变量替?
7. 量使用JavapȝAPI,如复制大量数据时Q用System.arraycopy();
8. 可能用带有Buffer的类代替没有Buffer的类;
9. 不用保存太多的信息在HttpSession? 同时注意清除Session;
10. 大型数据量处理或批处理数据记?量使用直接讉K数据库的ҎQ用SQL直接存取数据;
11. 在生产环境下,止servlet和jsp的自动重?
12. 插入下述“显式”计时代码,对程序进行评:
long start = System.currentTimeMillis(); // 要计时的q算代码攑֜q儿,q回的时间以千分之一U(1毫秒Qؓ单位 long time = System.currentTimeMillis() - start;
13. 常用q算旉单位: q算 CZ 标准旉本地赋?i=n; 1.0 实例赋?this.i=n; 1.2 int增?i++; 1.5 byte增?b++; 2.0 short增?s++; 2.0 float增?f++; 2.0 double增?d++; 2.0 I@?while(true) n++; 2.0 三元表达?(x<0) ?-x : x 2.2 术调用 Math.abs(x); 2.5 数组赋?a[0] = n; 2.7 long增?l++; 3.5 Ҏ调用 funct(); 5.9 throw或catch异常 try{ throw e; }或catch(e){} 320 同步Ҏ调用 synchMehod(); 570 新徏对象 new Object(); 980 新徏数组 new int[10]; 3100
旉Q?006-08-16 作者:axman 览ơ数Q? 3723 本文关键字:Java, 单线E?/a>, go deep into java |
|
旉Q?006-08-08 作者:axman 览ơ数Q? 5279 本文关键字:Java, 单线E?/a>, go deep into java |
|
[写在前面]
随着计算机技术的发展Q编E模型也来复杂多样化。但多线E编E模型是目前计算机系l架构的最l模型。随着CPU主频的不断攀升,X86架构的硬件已l成为瓶Q在q种架构的CPU主频最高ؓ4G。事实上目前3.6G主频的CPU已经接近了顶峰?/p>
如果不能从根本上更新当前CPU的架?在很长一D|间内q不太可?Q那么l提高CPU性能的方法就是超U程CPU模式。那么,作业pȝ、应用程序要发挥CPU的最大性能Q就是要改变C多线E编E模型ؓȝq行处理pȝ和ƈ发式应用E序?/p>
所以,掌握多线E编E模型,不仅是目前提高应用性能的手D,更是下一代编E模型的核心思想。多U程~程的目的,是"最大限度地利用CPU资源"Q当某一U程的处理不需要占用CPU而只和I/O,OEMBIOS{资源打交道Ӟ让需要占用CPU资源的其它线E有Z获得CPU资源。从Ҏ上说Q这是多线E编E的最l目的?/p>
[W一需要弄清的问题]
如同E序和进E的区别Q要掌握多线E编E,W一要弄清的问题是:U程对象和线E的区别?/p>
U程对象是可以生线E的对象。比如在javaq_中Thread对象QRunnable对象。线E,是指正在执行的一个指点o序列。在javaq_上是指从一个线E对象的start()开始,q行runҎ体中的那一D늛对独立的q程?/p>
鉴于作者的水^Q无法用更确切的词汇来描q它们的定义。但q两个有本质区别的概念请初学者细l体会,随着介绍的深入和例程分析的增加,׃慢慢明白它们所代表的真实含义?/p>
天下难事必始于易Q天下大事必始于l?/p>
让我们先从最单的"单线E?来入手:(1)带引可明只是相对而言的单U程Q?2)Zjava?/p>
class BeginClass{ public static void main(String[] args){ for(int i=0;i<100;i++) System.out.println("Hello,World!"); } }
如果我们成功~译了该java文gQ然后在命o行上敲入Q?/p>
java BeginClass
现在发生了什么呢Q每一个javaE序员,从他开始学习java的第一分钟里都会接触到q个?/p>
题,但是Q你知道它到底发生发什么?
JVMq程被启动,在同一个JVMq程中,有且只有一个进E,是它自己。然后在q个JVM环境中,所有程序的q行都是以线E来q行。JVM最先会产生一个主U程Q由它来q行指定E序的入口点。在q个E序中,是ȝE从mainҎ开始运行。当mainҎl束后,ȝE运行完成。JVMq程也随之退出?
我们看到的是一个主U程在运行mainҎQ这L只有一个线E执行程序逻辑的流E我们称
之ؓ单线E?/strong>。这是JVM提供l我们的单线E环境,事实上,JVM底层q至有垃圾回收q样的后台线E以及其它非javaU程Q但q些U程Ҏ们而言不可讉KQ我们只认ؓ它是单线E的?/p>
ȝE是JVM自己启动的,在这里它不是从线E对象生的。在q个U程中,它运行了mainҎq个指o序列。理解它Q但它没有更多可以研I的内容?/p>
[接触多线E] 执行q个E序QmainҎW一行生了一个线E对象,但ƈ没有U程启动?/p>
mainҎW二行生了一个线E对象,q启动了一个线E?/p>
mainҎW三行,产生q启动一个线E后Q主U程自己也l执行其它语句?/p>
我们先不研究Thread对象的具体内容,E微来回想一下上面的两个概念Q?strong>U程对象 class MyThread extends Thread{
public void run(){
System.out.println("Thread say:Hello,World!");
}
}
public class MoreThreads{
public static void main(String[] args){
new MyThread();
new MyThread().start();
System.out.println("Main say:Hello,World");
}
}
累了吧?Z么不l箋了?
Zq种风格来介l多U程Qƈ不是每个人都喜欢和接受的Q如果你不喜Ƣ,正好不浪费你的时间了Q而如果你接受的话Q那q下一节吧?
转蝲自dev2dev|友axman?a target="_blank">go deep into java专栏?/strong>
一个男?
一个写E序的男?
一个写E序q正在从E序中寻扑ֿ乐的男h.
一个写E序q正在从E序中寻扑ֿ乐ƈ把快乐传递给大家的男?
一个书?
一个寂寞的书生.
一个寂寞的梅香竹媄下敲声写늚书生.
一个寂寞的梅香竹媄下敲声写韉|钟暮鼓中逸气扬剑的书?
那个男h是位书生。没有h知道他的姓名Q居无定所Q行无定t,亦耕变读,或渔或樵?br />所以有人叫他樵?Axman)Q有人叫他渔?fisher)?/p>
板桥里h http://www.jdon.com 2002/01/10
|
1 .多线E中有主内存和工作内存之分, 在JVM中,有一个主内存Q专门负责所有线E共享数据;而每个线E都有他自己U有的工作内存, d存和工作内存分贝在JVM的stack区和heap区?/p>
2.
U程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', ?'Waiting'几个状态,
'Ready' 表示U程正在{待CPU分配允许q行的时间?/p>
3. U程q行ơ序q不是按照我们创Z们时的顺序来q行的,CPU处理U程的顺序是不确定的Q如果需要确定,那么必须手工介入Q用setPriority()Ҏ讄优先U?/p>
4. 我们无从知道一个线E什么时候运行,两个或多个线E在讉K同一个资源时Q需要synchronized
5. 每个U程会注册自己,实际某处存在着对它的引用,因此Q垃圑֛收机制对它就“束手无{”了?/p>
6. DaemonU程区别一般线E之处是Q主E序一旦结束,DaemonU程׃l束?/p>
7. 一个对象中的所有synchronizedҎ都共享一把锁Q这把锁能够防止多个Ҏ寚w用内存同时q行的写操作。synchronized staticҎ可在一个类范围内被怺间锁定v来?/p>
8. 对于讉K某个关键׃n资源的所有方法,都必L它们设ؓsynchronizedQ否则就不能正常工作?/p>
9. 假设已知一个方法不会造成冲突Q最明智的方法是不要使用synchronizedQ能提高些性能?/p>
10 . 如果一?同步"Ҏ修改了一个变量,而我们的Ҏ要用到这个变?可能是只?,最好将自己的这个方法也设ؓ synchronized?/p>
11. synchronized不能l承Q 父类的方法是synchronizedQ那么其子类重蝲Ҏ中就不会l承“同步”?/p>
12. U程堵塞Blocked有几个原因造成Q?/p>
(1)U程在等候一些IO操作
(2)U程试图调用另外一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用?/p>
13.
原子型操?atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着q些操作是线E安全的Q?但是大部分情况下Q我们ƈ不能正确使用Q来看看 i = i + 1 , i是int型,属于原始型变量:
(1)从主内存中读取i值到本地内存.
(2)g本地内存装蝲到线E工作拷贝中.
(3)装蝲变量1.
(4)i ?1.
(5)结果给变量i.
(6)i保存到线E本地工作拷贝中.
(7)写回d?
注意原子型操作只限于W?步到W?步的d以及W?到第7步的? i的D是可能被同时执行i=i+1的多U程中断打扰(在第4??/p>
double 和long 变量是非原子型的(non-atomic)。数l是object 非原子型?br />
14. ׃13条的原因Q我们解军_法是Q?/p>
class xxx extends Thread{
//i会被l常修改
private int i;
public synchronized int read(){ return i;}
public synchronized void update(){ i = i + 1;}
..........
}
15. Volatile变量Q?volatile变量表示保证它必L与主内存保持一_它实际是"变量的同?, 也就是说对于volatile变量的操作是原子型的Q如用在long ?double变量前?br />
16. 使用yield()会自动放弃CPUQ有时比sleep更能提升性能?/p>
17. sleep()和wait()的区别是Qwait()Ҏ被调用时会解除锁定,但是我们能用它的地方只是在一个同步的Ҏ或代码块内?/p>
18. 通过刉羃同步范_可能的实现代码块同步,wait(毫秒?可在指定的毫U数可退出waitQ对于wait()需要被notisfy()或notifyAll()t醒?/p>
19.
构造两个线E之间实旉信的方法分几步Q?br />(1). 创徏一个PipedWriter和一个PipedReader和它们之间的道;
PipedReader in = new PipedReader(new PipedWriter())
(2). 在需要发送信息的U程开始之前,外部的PipedWriter导向l其内部的Writer实例out
(3). 在需要接受信息的U程开始之前,外部的PipedReader导向l其内部的Reader实例in
(4). q样攑օout的所有东西度可从in中提取出来?/p>
20. synchronized带来的问题除性能有所下降外,最大的~点是会带来死锁DeadLockQ只有通过谨慎设计来防止死锁,其他毫无办法Q这也是U程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()Ҏ
21. 在大量线E被堵塞Ӟ最高优先的线E先q行。但是不表示低别线E不会运行,q行概率而已?/p>
22. U程l的主要优点是:使用单个命o可完成对整个U程l的操作。很需要用到线E组?/p>
23. 从以下几个方面提升多U程的性能Q?/p>
查所有可能Block的地方,可能的多的使用sleep或yield()以及wait();
可能g长sleep(毫秒?的时?
q行的线E不用超q?00个,不能太多Q?/p>
不同q_linux或windows以及不同JVMq行性能差别很大?/p>
24. 推荐几篇相关英文文章:
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
contextPath = sc.getRealPath("").replace("\\", "/");
int nInterval=24*60*60*1000;
timer = new Timer(true);
//每天零晨3Ҏ行清理工?br /> Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,3);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND,0);
Date time = calendar.getTime();
timer.scheduleAtFixedRate(new PlatTimerClearTask(), time,nInterval);
}
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
}
public static String getContextPath() {
return contextPath;
}
}