<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JavaChen Blog &#187; Java</title>
	<atom:link href="http://www.javachen.com/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.javachen.com</link>
	<description>Just some random thoughts about technology,Java and life</description>
	<lastBuildDate>Tue, 07 Sep 2010 15:26:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://www.javachen.com/wp-includes/js/jquery/jquery.js?ver=1.4.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
jQuery.ajax({type:'GET',url:'http://www.javachen.com/wp-content/plugins/wp-postviews-plus/postviews_plus.php',data:'todowppvp=add&type=tag&id=4_1',cache:false,dataType:'script'});
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>Java中比较两个对象是否相等</title>
		<link>http://www.javachen.com/2010/08/java-lang-equals-method/</link>
		<comments>http://www.javachen.com/2010/08/java-lang-equals-method/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 13:45:42 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[equals]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=1809</guid>
		<description><![CDATA[这段代码来自于Lang包中的一个类，其中的思想可以学习学习！ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [...]]]></description>
			<content:encoded><![CDATA[<p>这段代码来自于Lang包中的一个类，其中的思想可以学习学习！</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
</pre></td><td class="code"><pre class="java" style="font-family:monospace;">         <span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 判断两个对象是否相等。 这个函数用处是:
	 * &lt;ul&gt;
	 * &lt;li&gt;可以容忍 null
	 * &lt;/li&gt;&lt;li&gt;可以容忍不同类型的 Number
	 * &lt;/li&gt;&lt;li&gt;对数组，集合， Map 会深层比较
	 * &lt;/li&gt;&lt;/ul&gt;
	 * 当然，如果你重写的 equals 方法会优先
	 * 
	 * @param a1
	 *            比较对象1
	 * @param a2
	 *            比较对象2
	 * @return 是否相等
	 */</span>
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> equals<span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> a1, <span style="color: #003399;">Object</span> a2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a1 <span style="color: #339933;">==</span> a2<span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a1 <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">||</span> a2 <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a1.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>a2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a1 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">Number</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> a2 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">Number</span> <span style="color: #339933;">&amp;&amp;</span> a1.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>a2.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a1 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">Map</span> <span style="color: #339933;">&amp;&amp;</span> a2 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">Map</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			Map<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?</span>, <span style="color: #339933;">?&gt;</span> m1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Map<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?</span>, <span style="color: #339933;">?&gt;</span><span style="color: #009900;">&#41;</span> a1<span style="color: #339933;">;</span>
			Map<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?</span>, <span style="color: #339933;">?&gt;</span> m2 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Map<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?</span>, <span style="color: #339933;">?&gt;</span><span style="color: #009900;">&#41;</span> a2<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>m1.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> m2.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>Entry<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?</span>, <span style="color: #339933;">?&gt;</span> e <span style="color: #339933;">:</span> m1.<span style="color: #006633;">entrySet</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #003399;">Object</span> key <span style="color: #339933;">=</span> e.<span style="color: #006633;">getKey</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>m2.<span style="color: #006633;">containsKey</span><span style="color: #009900;">&#40;</span>key<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span>equals<span style="color: #009900;">&#40;</span>m1.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>key<span style="color: #009900;">&#41;</span>, m2.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>key<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
					<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a1.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">isArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a2.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">isArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">int</span> len <span style="color: #339933;">=</span> <span style="color: #003399;">Array</span>.<span style="color: #006633;">getLength</span><span style="color: #009900;">&#40;</span>a1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>len <span style="color: #339933;">!=</span> <span style="color: #003399;">Array</span>.<span style="color: #006633;">getLength</span><span style="color: #009900;">&#40;</span>a2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
					<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> len<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>equals<span style="color: #009900;">&#40;</span><span style="color: #003399;">Array</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>a1, i<span style="color: #009900;">&#41;</span>, <span style="color: #003399;">Array</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>a2, i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
						<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a2 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">List</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> equals<span style="color: #009900;">&#40;</span>a1, Lang.<span style="color: #006633;">collection2array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>List<span style="color: #339933;">&lt;</span>Object<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span> a2,
						<span style="color: #003399;">Object</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a1 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">List</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a2 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">List</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				List<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span> l1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>List<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span><span style="color: #009900;">&#41;</span> a1<span style="color: #339933;">;</span>
				List<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span> l2 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>List<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span><span style="color: #009900;">&#41;</span> a2<span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>l1.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> l2.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
					<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>Iterator<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span> it <span style="color: #339933;">=</span> l1.<span style="color: #006633;">iterator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> it.<span style="color: #006633;">hasNext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>equals<span style="color: #009900;">&#40;</span>it.<span style="color: #006633;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, l2.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
						<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a2.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">isArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> equals<span style="color: #009900;">&#40;</span>Lang.<span style="color: #006633;">collection2array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>List<span style="color: #339933;">&lt;</span> object<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span> a1,
						<span style="color: #003399;">Object</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span>, a2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a1 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">Collection</span> <span style="color: #339933;">&amp;&amp;</span> a2 <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">Collection</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			Collection<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span> c1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Collection<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span><span style="color: #009900;">&#41;</span> a1<span style="color: #339933;">;</span>
			Collection<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span> c2 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Collection<span style="color: #339933;">&lt;</span> <span style="color: #339933;">?&gt;</span><span style="color: #009900;">&#41;</span> a2<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>c1.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> c2.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">return</span> c1.<span style="color: #006633;">containsAll</span><span style="color: #009900;">&#40;</span>c2<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> c2.<span style="color: #006633;">containsAll</span><span style="color: #009900;">&#40;</span>c1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/08/java-lang-equals-method/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化java代码效率</title>
		<link>http://www.javachen.com/2010/06/optimize-the-efficiency-of-java-code/</link>
		<comments>http://www.javachen.com/2010/06/optimize-the-efficiency-of-java-code/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 13:09:49 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[efficiency]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=1695</guid>
		<description><![CDATA[最近在数据迁移的工作,代码的运行效率低是个很头疼的问题,遂在网上找了找总结优化java代码效率的一些方法,以提高自己的编码效率,养成良好的编程习惯.可供程序利用的资源（内存、CPU时间、网络带宽等）是有限的，优化的目的就是让程序用尽可能少的资源完成预定的任务。 1、 尽量指定类的final修饰符 带有final修饰符的类是不可派生的。 如果指定一个类为final，则该类所有的方法都是final。Java编译器会寻找机会内联（inline）所有的 final方法（这和具体的编译器实现有关）。此举能够使性能平均提高50% 。 2、 尽量重用对象。 特别是String 对象的使用中，出现字符串连接情况时应用StringBuffer 代替。由于系统不仅要花时间生成对象，以后可能还需花时间对这些对象进行垃圾回收和处理。因此，生成过多的对象将会给程序的性能带来很大的影响。 3、 尽量使用局部变量，调用方法时传递的参数以及在调用中创建的临时变量都保存在栈（Stack）中，速度较快。 其他变量，如静态变量、实例变量等，都在堆（Heap）中创建，速度较慢。另外，依赖于具体的编译器/JVM，局部变量还可能得到进一步优化。请参见《尽 可能使用堆栈变量》。 4、 不要重复初始化变量 默认情况下，调用类的构造函数时， Java会把变量初始化成确定的值：所有的对象被设置成null，整数变量（byte、short、int、long）设置成0，float和 double变量设置成0.0，逻辑值设置成false。当一个类从另一个类派生时，这一点尤其应该注意，因为用new关键词创建一个对象时，构造函数链 中的所有构造函数都会被自动调用。 5、 在JAVA + ORACLE 的应用系统开发中，java中内嵌的SQL语句尽量使用大写的形式，以减轻ORACLE解析器的解析负担。 6、 Java 编程过程中，进行数据库连接、I/O流操作时务必小心，在使用完毕后，即使关闭以释放资源。 因为对这些大对象的操作会造成系统大的开销，稍有不慎，会导致严重的后果。 7、 由于JVM的有其自身的GC机制，不需要程序开发者的过多考虑，从一定程度上减轻了开发者负担，但同时也遗漏了隐患，过分的创建对象会消耗系统的大量内 存，严重时会导致内存泄露，因此，保证过期对象的及时回收具有重要意义。 JVM回收垃圾的条件是：对象不在被引用；然而，JVM的GC并非十分的机智，即使对象满足了垃圾回收的条件也不一定会被立即回收。所以，建议我们在对象 使用完毕，应手动置成null。 8、 在使用同步机制时，应尽量使用方法同步代替代码块同步。 9、 尽量减少对变量的重复计算 10、尽量采用lazy loading 的策略，即在需要的时候才开始创建。 11、慎用异常 异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地 （Native）方法，fillInStackTrace()方法检查堆栈，收集调用跟踪信息。只要有异常被抛出，VM就必须调整调用堆栈，因为在处理过 程中创建了一个新的对象。 异常只能用于错误处理，不应该用来控制程序流程。 12、不要在循环中使用： Try { } catch() { } [...]]]></description>
			<content:encoded><![CDATA[<p>最近在数据迁移的工作,代码的运行效率低是个很头疼的问题,遂在网上找了找总结优化java代码效率的一些方法,以提高自己的编码效率,养成良好的编程习惯.可供程序利用的资源（内存、CPU时间、网络带宽等）是有限的，优化的目的就是让程序用尽可能少的资源完成预定的任务。<span id="more-1695"></span></p>
<p>1、 尽量指定类的final修饰符 带有final修饰符的类是不可派生的。<br />
如果指定一个类为final，则该类所有的方法都是final。Java编译器会寻找机会内联（inline）所有的 final方法（这和具体的编译器实现有关）。此举能够使性能平均提高50% 。</p>
<p>2、 尽量重用对象。<br />
特别是String 对象的使用中，出现字符串连接情况时应用StringBuffer  代替。由于系统不仅要花时间生成对象，以后可能还需花时间对这些对象进行垃圾回收和处理。因此，生成过多的对象将会给程序的性能带来很大的影响。</p>
<p>3、 尽量使用局部变量，调用方法时传递的参数以及在调用中创建的临时变量都保存在栈（Stack）中，速度较快。<br />
其他变量，如静态变量、实例变量等，都在堆（Heap）中创建，速度较慢。另外，依赖于具体的编译器/JVM，局部变量还可能得到进一步优化。请参见《尽 可能使用堆栈变量》。</p>
<p>4、 不要重复初始化变量<br />
默认情况下，调用类的构造函数时，  Java会把变量初始化成确定的值：所有的对象被设置成null，整数变量（byte、short、int、long）设置成0，float和 double变量设置成0.0，逻辑值设置成false。当一个类从另一个类派生时，这一点尤其应该注意，因为用new关键词创建一个对象时，构造函数链 中的所有构造函数都会被自动调用。</p>
<p>5、 在JAVA + ORACLE 的应用系统开发中，java中内嵌的SQL语句尽量使用大写的形式，以减轻ORACLE解析器的解析负担。</p>
<p>6、 Java 编程过程中，进行数据库连接、I/O流操作时务必小心，在使用完毕后，即使关闭以释放资源。<br />
因为对这些大对象的操作会造成系统大的开销，稍有不慎，会导致严重的后果。</p>
<p>7、  由于JVM的有其自身的GC机制，不需要程序开发者的过多考虑，从一定程度上减轻了开发者负担，但同时也遗漏了隐患，过分的创建对象会消耗系统的大量内 存，严重时会导致内存泄露，因此，保证过期对象的及时回收具有重要意义。<br />
JVM回收垃圾的条件是：对象不在被引用；然而，JVM的GC并非十分的机智，即使对象满足了垃圾回收的条件也不一定会被立即回收。所以，建议我们在对象 使用完毕，应手动置成null。</p>
<p>8、 在使用同步机制时，应尽量使用方法同步代替代码块同步。</p>
<p>9、 尽量减少对变量的重复计算</p>
<p>10、尽量采用lazy loading 的策略，即在需要的时候才开始创建。</p>
<p>11、慎用异常<br />
异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地 （Native）方法，fillInStackTrace()方法检查堆栈，收集调用跟踪信息。只要有异常被抛出，VM就必须调整调用堆栈，因为在处理过 程中创建了一个新的对象。 异常只能用于错误处理，不应该用来控制程序流程。</p>
<p>12、不要在循环中使用：<br />
Try {<br />
} catch() {<br />
}<br />
应把其放置在最外层。</p>
<p>13、StringBuffer 的使用：<br />
StringBuffer表示了可变的、可写的字符串。<br />
有三个构造方法 :<br />
StringBuffer (); //默认分配16个字符的空间<br />
StringBuffer (int size); //分配size个字符的空间<br />
StringBuffer (String str); //分配16个字符+str.length()个字符空间<br />
你可以通过StringBuffer的构造函数来设定它的初始化容量，这样可以明显地提升性能。</p>
<p>这里提到的构造函数是StringBuffer(int  length)，length参数表示当前的StringBuffer能保持的字符数量。你也可以使用ensureCapacity(int  minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer的缺省行为，然后再找 出一条更好的提升性能的途径。<br />
StringBuffer在内部维护一个字符数组，当你使用缺省的构造函数来创建StringBuffer对象的时候，因为没有设置初始化字符长 度，StringBuffer的容量被初始化为16个字符，也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候，它会将自身 容量增加到当前的2倍再加2，也就是（2*旧值+2）。如果你使用缺省值，初始化之后接着往里面追加字符，在你追加到第16个字符的时候它会将容量增加到 34（2*16+2），当追加到34个字符的时候就会将容量增加到70（2*34+2）。无论何事只要StringBuffer到达它的最大容量它就不得 不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍――这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了 的，这样会带来立竿见影的性能增益。StringBuffer初始化过程的调整的作用由此可见一斑。所以，使用一个合适的容量值来初始化 StringBuffer永远都是一个最佳的建议。</p>
<p>14、合理的使用Java类 java.util.Vector。<br />
简单地说，一个Vector就是一个java.lang.Object实例的数组。Vector与数组相似，它的元素可以通过整数形式的索引访问。但 是，Vector类型的对象在创建之后，对象的大小能够根据元素的增加或者删除而扩展、缩小。请考虑下面这个向Vector加入元素的例子：<br />
Object bj = new Object();<br />
Vector v = new Vector(100000);<br />
for(int I=0;<br />
I&lt;100000; I++) { v.add(0,obj); }</p>
<p>除非有绝对充足的理由要求每次都把新元素插入到Vector的前面，否则上面的代码对性能不利。在默认构造函数中，Vector的初始存储能力 是10个元素，如果新元素加入时存储能力不足，则以后存储能力每次加倍。Vector类就对象StringBuffer类一样，每次扩展存储能力时，所有 现有的元素都要复制到新的存储空间之中。下面的代码片段要比前面的例子快几个数量级：<br />
Object bj = new Object();<br />
Vector v = new Vector(100000);<br />
for(int I=0; I&lt;100000; I++) { v.add(obj); }</p>
<p>同样的规则也适用于Vector类的remove()方法。由于Vector中各个元素之间不能含有“空隙”，删除除最后一个元素之外的任意其 他元素都导致被删除元素之后的元素向前移动。也就是说，从Vector删除最后一个元素要比删除第一个元素“开销”低好几倍。</p>
<p>假设要从前面的Vector删除所有元素，我们可以使用这种代码：<br />
for(int I=0; I&lt;100000; I++)<br />
{<br />
v.remove(0);<br />
}</p>
<p>但是，与下面的代码相比，前面的代码要慢几个数量级：<br />
for(int I=0; I&lt;100000; I++)<br />
{<br />
v.remove(v.size()-1);<br />
}</p>
<p>从Vector类型的对象v删除所有元素的最好方法是：<br />
v.removeAllElements();</p>
<p>假设Vector类型的对象v包含字符串“Hello”。考虑下面的代码，它要从这个Vector中删除“Hello”字符串：<br />
String s = &#8220;Hello&#8221;;<br />
int i = v.indexOf(s);<br />
if(I != -1) v.remove(s);</p>
<p>这些代码看起来没什么错误，但它同样对性能不利。在这段代码中，indexOf()方法对v进行顺序搜索寻找字符串 “Hello”，remove(s)方法也要进行同样的顺序搜索。改进之后的版本是：<br />
String s = &#8220;Hello&#8221;;<br />
int i = v.indexOf(s);<br />
if(I != -1) v.remove(i);</p>
<p>这个版本中我们直接在remove()方法中给出待删除元素的精确索引位置，从而避免了第二次搜索。一个更好的版本是：<br />
String s = &#8220;Hello&#8221;; v.remove(s);</p>
<p>最后，我们再来看一个有关Vector类的代码片段：<br />
for(int I=0; I++;I &lt; v.length)</p>
<p>如果v包含100,000个元素，这个代码片段将调用v.size()方法100,000次。虽然size方法是一个简单的方法，但它仍旧需要 一次方法调用的开销，至少JVM需要为它配置以及清除堆栈环境。在这里，for循环内部的代码不会以任何方式修改Vector类型对象v的大小，因此上面 的代码最好改写成下面这种形式：<br />
int size = v.size(); for(int I=0; I++;I&lt;size)</p>
<p>虽然这是一个简单的改动，但它仍旧赢得了性能。毕竟，每一个CPU周期都是宝贵的。</p>
<p>15、当复制大量数据时，使用System.arraycopy()命令。</p>
<p>16、代码重构：增强代码的可读性。</p>
<p>17、不用new关键词创建类的实例<br />
用new关键词创建类的实例时，构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口，我们可以调用它的 clone()方法。clone()方法不会调用任何类构造函数。<br />
在使用设计模式（Design  Pattern）的场合，如果用Factory模式创建对象，则改用clone()方法创建新的对象实例非常简单。例如，下面是Factory模式的一个 典型实现：<br />
public static Credit getNewCredit() {<br />
return new Credit();<br />
}<br />
改进后的代码使用clone()方法，如下所示：<br />
private static Credit BaseCredit = new Credit();<br />
public static Credit getNewCredit() {<br />
return (Credit) BaseCredit.clone();<br />
}<br />
上面的思路对于数组处理同样很有用。</p>
<p>18、乘法和除法,用移位操作替代乘法操作可以极大地提高性能。</p>
<p>19、在JSP页面中关闭无用的会话。<br />
一个常见的误解是以为session在有客户端访问时就被创建，然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建，注意如果JSP没有显示的使用 &lt;<a href="mailto:%@pagesession=%22false%22%">%@pagesession=&#8221;false&#8221;%</a>&gt;  关闭session，则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session =  HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。由于session会消耗内 存资源，因此，如果不打算使用session，应该在所有的JSP中关闭它。<br />
对于那些无需跟踪会话状态的页面，关闭自动创建的会话可以节省一些资源。使用如下page指令：&lt;%@ page  session=&#8221;false&#8221;%&gt;</p>
<p>20、JDBC与I/O<br />
如果应用程序需要访问一个规模很大的数据集，则应当考虑使用块提取方式。默认情况下，JDBC每次提取32行数据。举例来说，假设我们要遍历一个5000 行的记录集，JDBC必须调用数据库157次才能提取到全部数据。如果把块大小改成512，则调用数据库的次数将减少到10次。</p>
<p>21、Servlet与内存使用<br />
许多开发者随意地把大量信息保存到用户会话之中。一些时候，保存在会话中的对象没有及时地被垃圾回收机制回收。从性能上看，典型的症状是用户感到系统周期 性地变慢，却又不能把原因归于任何一个具体的组件。如果监视JVM的堆空间，它的表现是内存占用不正常地大起大落。<br />
解决这类内存问题主要有二种办法。第一种办法是，在所有作用范围为会话的Bean中实现HttpSessionBindingListener接口。这 样，只要实现valueUnbound()方法，就可以显式地释放Bean使用的资源。</p>
<p>另外一种办法就是尽快地把会话作废。大多数应用服务器都有设置会话作废间隔时间的选项。另外，也可以用编程的方式调用会话的 setMaxInactiveInterval()方法，该方法用来设定在作废会话之前，Servlet容器允许的客户请求的最大间隔时间，以秒计。</p>
<p>22、使用缓冲标记<br />
一些应用服务器加入了面向JSP的缓冲标记功能。例如，BEA的WebLogic Server从6.0版本开始支持这个功能，Open  Symphony工程也同样支持这个功能。JSP缓冲标记既能够缓冲页面片断，也能够缓冲整个页面。当JSP页面执行时，如果目标片断已经在缓冲之中，则 生成该片断的代码就不用再执行。页面级缓冲捕获对指定URL的请求，并缓冲整个结果页面。对于购物篮、目录以及门户网站的主页来说，这个功能极其有用。对 于这类应用，页面级缓冲能够保存页面执行的结果，供后继请求使用。</p>
<p>23、选择合适的引用机制<br />
在典型的JSP应用系统中，页头、页脚部分往往被抽取出来，然后根据需要引入页头、页脚。当前，在JSP页面中引入外部资源的方法主要有两 种：include指令，以及include动作。<br />
include指令：例如&lt;%@ include file=&#8221;copyright.html&#8221;  %&gt;。该指令在编译时引入指定的资源。在编译之前，带有include指令的页面和指定的资源被合并成一个文件。被引用的外部资源在编译时就确定， 比运行时才确定资源更高效。<br />
include动作：例如&lt;jsp:include page=&#8221;copyright.jsp&#8221;  /&gt;。该动作引入指定页面执行后生成的结果。由于它在运行时完成，因此对输出结果的控制更加灵活。但时，只有当被引用的内容频繁地改变时，或者在对 主页面的请求没有出现之前，被引用的页面无法确定时，使用include动作才合算。</p>
<p>24、及时清除不再需要的会话<br />
为了清除不再活动的会话，许多应用服务器都有默认的会话超时时间，一般为30分钟。当应用服务器需要保存更多会话时，如果内存容量不足，操作系统会把部分 内存数据转移到磁盘，应用服务器也可能根据“最近最频繁使用”（Most Recently  Used）算法把部分不活跃的会话转储到磁盘，甚至可能抛出“内存不足”异常。在大规模系统中，串行化会话的代价是很昂贵的。当会话不再需要时，应当及时 调用HttpSession.invalidate()方法清除会话。HttpSession.invalidate()方法通常可以在应用的退出页面调 用。</p>
<p>25、不要将数组声明为：public static final 。</p>
<p>26、HashMap的遍历效率讨论<br />
经常遇到对HashMap中的key和value值对的遍历操作，有如下两种方法：Map&lt;String, String[]&gt;  paraMap = new</p>
<p>HashMap&lt;String, String[]&gt;();<br />
&#8230;&#8230;&#8230;&#8230;&#8230;.//第一个循环<br />
Set&lt;String&gt; appFieldDefIds = paraMap.keySet();<br />
for (String appFieldDefId : appFieldDefIds) {<br />
String[] values = paraMap.get(appFieldDefId);<br />
&#8230;&#8230;<br />
}</p>
<p>//第二个循环<br />
for(Entry&lt;String, String[]&gt; entry : paraMap.entrySet()){<br />
String appFieldDefId = entry.getKey();<br />
String[] values = entry.getValue();<br />
&#8230;&#8230;.<br />
}</p>
<p>第一种实现明显的效率不如第二种实现。<br />
分析如下 Set&lt;String&gt; appFieldDefIds = paraMap.keySet();  是先从HashMap中取得keySet</p>
<p>代码如下：<br />
public Set&lt;K&gt; keySet() {<br />
Set&lt;K&gt; ks = keySet;<br />
return (ks != null ? ks : (keySet = new KeySet()));<br />
}</p>
<p>private class KeySet extends AbstractSet&lt;K&gt; {<br />
public Iterator&lt;K&gt; iterator() {<br />
return newKeyIterator();<br />
}<br />
public int size() {<br />
return size;<br />
}<br />
public boolean contains(Object o) {<br />
return containsKey(o);<br />
}<br />
public boolean remove(Object o) {<br />
return HashMap.this.removeEntryForKey(o) != null;<br />
}<br />
public void clear() {<br />
HashMap.this.clear();<br />
}<br />
}<br />
其实就是返回一个私有类KeySet, 它是从AbstractSet继承而来，实现了Set接口。</p>
<p>再来看看for/in循环的语法<br />
for(declaration : expression)<br />
statement</p>
<p>在执行阶段被翻译成如下各式<br />
for(Iterator&lt;E&gt; #i = (expression).iterator(); #i.hashNext();){<br />
declaration = #i.next();<br />
statement<br />
}</p>
<p>因此在第一个for语句for (String appFieldDefId : appFieldDefIds)  中调用了HashMap.keySet().iterator()</p>
<p>而这个方法调用了newKeyIterator()</p>
<p>Iterator&lt;K&gt; newKeyIterator() {<br />
return new KeyIterator();<br />
}<br />
private class KeyIterator extends HashIterator&lt;K&gt; {<br />
public K next() {<br />
return nextEntry().getKey();<br />
}<br />
}</p>
<p>所以在for中还是调用了</p>
<p>在第二个循环for(Entry&lt;String, String[]&gt; entry :  paraMap.entrySet())中使用的Iterator是如下的一个内部类</p>
<p>private class EntryIterator extends  HashIterator&lt;Map.Entry&lt;K,V&gt;&gt; {<br />
public Map.Entry&lt;K,V&gt; next() {<br />
return nextEntry();<br />
}<br />
}</p>
<p>此时第一个循环得到key，第二个循环得到HashMap的Entry效率就是从循环里面体现出来的第二个循环此致可以直接取key和value值 而第一个循环还是得再利用HashMap的get(Object key)来取value值现在看看HashMap的get(Object key)方法<br />
public V get(Object key) {<br />
Object k = maskNull(key);<br />
int hash = hash(k);<br />
int i = indexFor(hash, table.length); //Entry[] table<br />
Entry&lt;K,V&gt; e = table;<br />
while (true) {<br />
if (e == null)<br />
return null;<br />
if (e.hash == hash &amp;&amp; eq(k, e.key))<br />
return e.value;<br />
e = e.next;<br />
}<br />
}<br />
其实就是再次利用Hash值取出相应的Entry做比较得到结果，所以使用第一中循环相当于两次进入HashMap的Entry</p>
<p>中而第二个循环取得Entry的值之后直接取key和value，效率比第一个循环高。其实按照Map的概念来看也应该是用第二个循环好一点，它本 来就是key和value的值对，将key和value分开操作在这里不是个好选择。</p>
<p>27、array(数组) 和 ArryList的使用<br />
array（[]）：最高效；但是其容量固定且无法动态改变；<br />
ArrayList：容量可动态增长；但牺牲效率；<br />
基于效率和类型检验，应尽可能使用array，无法确定数组大小时才使用ArrayList！<br />
ArrayList是Array的复杂版本<br />
ArrayList内部封装了一个Object类型的数组，从一般的意义来说，它和数组没有本质的差别，甚至于ArrayList的许多方法，如 Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。<br />
ArrayList存入对象时，抛弃类型信息，所有对象屏蔽为Object，编译时不检查类型，但是运行时会报错。<br />
注：jdk5中加入了对泛型的支持，已经可以在使用ArrayList时进行类型检查。<br />
从这一点上看来，ArrayList与数组的区别主要就是由于动态增容的效率问题了</p>
<p>28、尽量使用HashMap 和ArrayList ,除非必要，否则不推荐使用HashTable和Vector  ，后者由于使用同步机制，而导致了性能的开销。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/06/optimize-the-efficiency-of-java-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MyEclipse 反编译插件jad安装方法</title>
		<link>http://www.javachen.com/2010/05/myeclipse-8-5_jad_installer_method/</link>
		<comments>http://www.javachen.com/2010/05/myeclipse-8-5_jad_installer_method/#comments</comments>
		<pubDate>Fri, 07 May 2010 12:44:14 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jad]]></category>
		<category><![CDATA[MyEclipse]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=1432</guid>
		<description><![CDATA[这是在网上看到的一种方法，我按照下面的方法安装成功并试用，感觉很方便很实用很强大，我用的是MyEclipse 8.5 安装成功，你也可以试试！ 准备工作 1. 下载jad.exe文件：http://www.varaneckas.com/sites/default/files/jad/jad158g.win.zip 2. 下载jadeclipse插件：http://prdownloads.sourceforge.net/jadclipse/net.sf.jadclipse_3.3.0.jar?download 3. JadClipse 官网：http://jadclipse.sourceforge.net/wiki/index.php/Main_Page 安装 1. 将jad.exe解压到指定目录。如:c:\java\jad 2. 将jadeclipse插件net.sf.jadclipse_3.3.0.jar 拷贝到myeclipse安装目录\Genuitec\Common\plugins\目录下。 3. 在myeclipse安装目录下dropins/创建eclipse文件夹，然后在eclipse文件夹中分别创建features、plugins文件夹，将net.sf.jadclipse_3.3.0.jar 分别拷贝到features和plugins文件夹中。 4. 重新启动myeclipse后，配置jadeclipse插件 5. 在eclipse窗口下，点击Window &#62; Preferences &#62; Java &#62; JadClipse &#62; Path to Decompiler。（设置jad的绝对路径，如 C:\java\Jad\jad.exe)。Use Eclipse code formatter(overrides Jad formatting instructions)选项打勾，与格式化出来的代码样式一致。 6. 在eclipse窗口下，点击Window &#62; Preferences &#62; Java &#62; JadClipse &#62; Misc，将Convert Unicode strings into ANSI [...]]]></description>
			<content:encoded><![CDATA[<p>这是在网上看到的一种方法，我按照下面的方法安装成功并试用，感觉很方便很实用很强大，我用的是MyEclipse 8.5 安装成功，你也可以试试！ <img src='http://www.javachen.com/wp-includes/images/QQ/icon_lol.gif' alt=':lol:' class='wp-smiley' />  <span id="more-1432"></span></p>
<h3><span style="color: #0000ff;">准备工作</span></h3>
<p>1. 下载jad.exe文件：http://www.varaneckas.com/sites/default/files/jad/jad158g.win.zip<br />
2. 下载jadeclipse插件：http://prdownloads.sourceforge.net/jadclipse/net.sf.jadclipse_3.3.0.jar?download<br />
3. JadClipse 官网：http://jadclipse.sourceforge.net/wiki/index.php/Main_Page</p>
<h3><span style="color: #0000ff;">安装</span></h3>
<p>1. 将jad.exe解压到指定目录。如:c:\java\jad<br />
2. 将jadeclipse插件net.sf.jadclipse_3.3.0.jar 拷贝到myeclipse安装目录\Genuitec\Common\plugins\目录下。<br />
3. 在myeclipse安装目录下dropins/创建eclipse文件夹，然后在eclipse文件夹中分别创建features、plugins文件夹，将net.sf.jadclipse_3.3.0.jar 分别拷贝到features和plugins文件夹中。<br />
4. 重新启动myeclipse后，配置jadeclipse插件<br />
5. 在eclipse窗口下，点击Window &gt; Preferences &gt; Java &gt; JadClipse &gt; Path to Decompiler。（设置jad的绝对路径，如 C:\java\Jad\jad.exe)。Use Eclipse code formatter(overrides Jad formatting instructions)选项打勾，与格式化出来的代码样式一致。<br />
6. 在eclipse窗口下，点击Window &gt; Preferences &gt; Java &gt; JadClipse &gt; Misc，将Convert Unicode strings into ANSI strings选项打勾，避免反编译后可能出现的中文乱码。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/05/myeclipse-8-5_jad_installer_method/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java within Hypertext Markup Language</title>
		<link>http://www.javachen.com/2010/04/java-within-hypertext-markup-language/</link>
		<comments>http://www.javachen.com/2010/04/java-within-hypertext-markup-language/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 18:08:50 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[JHTML]]></category>
		<category><![CDATA[JSP]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=1306</guid>
		<description><![CDATA[今天在看一个开源blog的代码时候，看到一个jsp页面动态引入了一个jhtml页面，myeclipse8.5提示页面有错误，但一直不知道为何会提示错误，也不知道jhtml是啥东西，百度查阅一下才知道jhtml是超文本标记语言中的Java程序。看在网上找找关于jhtml的例子，可是却没有找到，只找到下面的一段对于它的介绍，为什么网上没有关于它的详细介绍呢？难道这种语言在实际项目中很少用到？最后，在搜索PageCompileServlet 和jhtml这两个关键字的情况下，终于找到了一篇介绍文档：Using WebLogic JHTML For future HTTP servlet projects, we recommend you use JSP instead of the older JHTML standard. 貌似jhtml语言在当今社会已经被jsp替代了！ JHTML (Java within Hypertext Markup Language，超文本标记语言中的Java程序)是在网页(用超文本标记语言HTML写的页面)中把Java程序包括进去使其作为网页一部分的标准。网站开发者可以用Java编程语言写一个小程序并把它插入到网页当中。当用户请求这个页面时，一直注意着带文件后缀.jhtml的请求的网站服务器将把代码传给一个专门的Java程序，它是专门设计用于处理JHTML的。这个叫做PageCompileServlet的程序调用Java编译器，再由Java编译器就快速地编译代码。(如果这个代码在以前就已经由早些的页面请求被编译，这个步骤就可以省略了。)然后这段代码就被执行，它会在被发送给请求者之前以某种方式修改网页的内容。 JHTML与ASP和PHTML在原理上是一样的，它们都是在服务器端将网页内容改变，传送到客户端的内容仍然是HTML语言写成的内容，这与在客户端执行的JavaScript有本本质的不同，在客户端执行时，必须将程序源代码传送到客户端的计算机上，开发者辛苦写成的源代码就这样被用户得到了，而在服务器端执行就不会出现这种问题，因为客户端得到的只是HTML语言写成的网页，舍此无二。JHTML还可以通过Java数据库连接（JDBC）接口访问 Web数据库。如果要使用JHTML，您必须确认在服务器端已经安装了Java编译器，否则无法执行。 JHTML要求在Web服务器端安装Java编译器。JHTML是JavaSoft的Java网络服务器应用程序接口的一部分。]]></description>
			<content:encoded><![CDATA[<p>今天在看一个开源blog的代码时候，看到一个jsp页面动态引入了一个jhtml页面，myeclipse8.5提示页面有错误，但一直不知道为何会提示错误，也不知道<a href="http://jhtml.sourceforge.net/">jhtml</a>是啥东西，百度查阅一下才知道jhtml是超文本标记语言中的Java程序。看在网上找找关于jhtml的例子，可是却没有找到，只找到下面的一段对于它的介绍，为什么网上没有关于它的详细介绍呢？难道这种语言在实际项目中很少用到？最后，在搜索PageCompileServlet 和jhtml这两个关键字的情况下，终于找到了一篇介绍文档：<a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs45/classdocs/API_jhtml.html">Using WebLogic JHTML </a></p>
<blockquote><p>For future HTTP servlet projects, we recommend you use JSP  instead of the older JHTML standard.</p></blockquote>
<p>貌似jhtml语言在当今社会已经被jsp替代了！ <img src='http://www.javachen.com/wp-includes/images/QQ/icon_cry.gif' alt=':cry:' class='wp-smiley' />  </p>
<p><span id="more-1306"></span></p>
<blockquote><p><a href="http://jhtml.sourceforge.net/">JHTML</a> (Java within Hypertext Markup Language，超文本标记语言中的Java程序)是在网页(用超文本标记语言HTML写的页面)中把Java程序包括进去使其作为网页一部分的标准。网站开发者可以用Java编程语言写一个小程序并把它插入到网页当中。当用户请求这个页面时，一直注意着带文件后缀.jhtml的请求的网站服务器将把代码传给一个专门的Java程序，它是专门设计用于处理JHTML的。这个叫做PageCompileServlet的程序调用Java编译器，再由Java编译器就快速地编译代码。(如果这个代码在以前就已经由早些的页面请求被编译，这个步骤就可以省略了。)然后这段代码就被执行，它会在被发送给请求者之前以某种方式修改网页的内容。<br />
JHTML与ASP和PHTML在原理上是一样的，它们都是在服务器端将网页内容改变，传送到客户端的内容仍然是HTML语言写成的内容，这与在客户端执行的JavaScript有本本质的不同，在客户端执行时，必须将程序源代码传送到客户端的计算机上，开发者辛苦写成的源代码就这样被用户得到了，而在服务器端执行就不会出现这种问题，因为客户端得到的只是HTML语言写成的网页，舍此无二。JHTML还可以通过Java数据库连接（JDBC）接口访问 Web数据库。如果要使用JHTML，您必须确认在服务器端已经安装了Java编译器，否则无法执行。<br />
JHTML要求在Web服务器端安装Java编译器。JHTML是JavaSoft的Java网络服务器应用程序接口的一部分。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/04/java-within-hypertext-markup-language/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java中的两类异常</title>
		<link>http://www.javachen.com/2010/04/java_checkedexception_and_runtimeexception/</link>
		<comments>http://www.javachen.com/2010/04/java_checkedexception_and_runtimeexception/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 07:39:27 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Exception]]></category>
		<category><![CDATA[RuntimeException]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=1272</guid>
		<description><![CDATA[Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常，以及SQL异常都是这种异常。对于这种异常，JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以，面对这种异常不管我们是否愿意，只能自己去写一大堆catch块去处理可能的异常。 但是另外一种异常：runtime exception，也称运行时异常，我们可以不处理。当出现这样的异常时，总是由虚拟机接管。比如：我们从来没有人去处理过 NullPointerException异常，它就是运行时异常，并且这种异常还是最常见的异常之一。 关于这两类异常的使用，网上存在着一些辩论：http://www.javaeye.com/topic/2038。合理的使用这两类异常，有利于我们写程序时代码的健壮性和合理性。看完上面的链接里的那些辩论之后，自己总结如下： 1． 当要决定是采用checked exception还是Unchecked exception的时候，你要问自己一个问题，“如果这种异常一旦抛出，客户端会做怎样的补救？” 2． 保护封装性（Preserve encapsulation） 3． 不要创建没有意义的异常（Try not to create new custom exceptions if they do not have useful information for client code.） 4． 总是要做一些清理工作（Always clean up after yourself） 5． 不要使用异常来控制流程（Never use exceptions for flow control） 6． 在异常的底层记录日志（Log exceptions just once ） 另外，网上还有一篇相关的文章：http://amyer.javaeye.com/blog/147509]]></description>
			<content:encoded><![CDATA[<p>     Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常，以及SQL异常都是这种异常。对于这种异常，JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以，面对这种异常不管我们是否愿意，只能自己去写一大堆catch块去处理可能的异常。</p>
<p>     但是另外一种异常：runtime exception，也称运行时异常，我们可以不处理。当出现这样的异常时，总是由虚拟机接管。比如：我们从来没有人去处理过 NullPointerException异常，它就是运行时异常，并且这种异常还是最常见的异常之一。<br />
<span id="more-1272"></span><br />
      关于这两类异常的使用，网上存在着一些辩论：<a href="http://www.javaeye.com/topic/2038">http://www.javaeye.com/topic/2038</a>。合理的使用这两类异常，有利于我们写程序时代码的健壮性和合理性。看完上面的链接里的那些辩论之后，自己总结如下：<br />
     1． 当要决定是采用checked exception还是Unchecked exception的时候，你要问自己一个问题，“如果这种异常一旦抛出，客户端会做怎样的补救？”<br />
     2． 保护封装性（Preserve encapsulation）<br />
     3． 不要创建没有意义的异常（Try not to create new custom exceptions if they do not have useful information for client code.）<br />
     4． 总是要做一些清理工作（Always clean up after yourself）<br />
     5． 不要使用异常来控制流程（Never use exceptions for flow control）<br />
     6． 在异常的底层记录日志（Log exceptions just once ） </p>
<p>另外，网上还有一篇相关的文章：<a href="http://amyer.javaeye.com/blog/147509">http://amyer.javaeye.com/blog/147509 </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/04/java_checkedexception_and_runtimeexception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Enumeration</title>
		<link>http://www.javachen.com/2010/03/java-enumeration/</link>
		<comments>http://www.javachen.com/2010/03/java-enumeration/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 13:05:31 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Enumeration]]></category>
		<category><![CDATA[Hashtable]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=1173</guid>
		<description><![CDATA[Enumeration为接口，位于java.util包中，它生成一系列元素，一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。 例如，要输出 Vector v 的所有元素，可使用以下方法： for &#40;Enumeration e = v.elements&#40;&#41;; e.hasMoreElements&#40;&#41;;&#41;&#123; System.out.println&#40;e.nextElement&#40;&#41;&#41;; &#125; Enumeration这些方法主要通过向量的元素、哈希表的键以及哈希表中的值进行枚举。枚举也用于将输入流指定到 SequenceInputStream 中。 使用Enumeration遍历Hashtable： Hashtable hash=new Hashtable&#40;&#41;; hash.put&#40; &#34;abc&#34;,&#34;1&#34;&#41;; hash.put&#40;&#34;ddd&#34;,&#34;1&#34;&#41;; hash.put&#40; &#34;asdf&#34;,&#34;2&#34;&#41;; Enumeration enumkey = hash.keys&#40;&#41; ; while&#40;enumkey.hasMoreElements&#40;&#41;&#41;&#123; String str=&#40;String&#41;enumkey.nextElement&#40;&#41;; System.out.println&#40;&#34;--------&#34;+str&#41;; System.out.println&#40;&#34;=========&#34;+hash.get&#40; str&#41;&#41;; &#125; enumkey = hash.keys&#40;&#41; ; while&#40;enumkey.hasMoreElements&#40;&#41;&#41;&#123; String str=&#40;String&#41;enumkey.nextElement&#40;&#41;; System.out.println&#40;&#34;--------&#34;+str&#41;; System.out.println&#40;&#34;=========&#34;+hash.get&#40; str&#41;&#41;; &#125; 从上面的代码可以看出遍历一个枚举对象有两种方法，一种是for循环一种是使用while，应该特别注意使用for循环的方法与普通的for循环有点差异。 为了读取枚举值中的内容，还可以使用IO输入流SequenceInputStream 将内容输出。 在Servlet中，通过request.getParameterNames()可以获取到请求中的附加参数的枚举值： Enumeration [...]]]></description>
			<content:encoded><![CDATA[<p>Enumeration为接口，位于java.util包中，它生成一系列元素，一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。</p>
<p>例如，要输出 Vector v 的所有元素，可使用以下方法：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Enumeration</span> e <span style="color: #339933;">=</span> v.<span style="color: #006633;">elements</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> e.<span style="color: #006633;">hasMoreElements</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>	
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">nextElement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><span id="more-1173"></span><br />
Enumeration这些方法主要通过向量的元素、哈希表的键以及哈希表中的值进行枚举。枚举也用于将输入流指定到 SequenceInputStream  中。</p>
<p>使用Enumeration遍历Hashtable：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Hashtable</span> hash<span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Hashtable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
hash.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;abc&quot;</span>,<span style="color: #0000ff;">&quot;1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
hash.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ddd&quot;</span>,<span style="color: #0000ff;">&quot;1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
hash.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;asdf&quot;</span>,<span style="color: #0000ff;">&quot;2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
<span style="color: #003399;">Enumeration</span> enumkey <span style="color: #339933;">=</span> hash.<span style="color: #006633;">keys</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>   
<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>enumkey.<span style="color: #006633;">hasMoreElements</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>    
    <span style="color: #003399;">String</span> str<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span>enumkey.<span style="color: #006633;">nextElement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;--------&quot;</span><span style="color: #339933;">+</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;=========&quot;</span><span style="color: #339933;">+</span>hash.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
<span style="color: #009900;">&#125;</span>
enumkey <span style="color: #339933;">=</span> hash.<span style="color: #006633;">keys</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>   
<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>enumkey.<span style="color: #006633;">hasMoreElements</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>    
     <span style="color: #003399;">String</span> str<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span>enumkey.<span style="color: #006633;">nextElement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;--------&quot;</span><span style="color: #339933;">+</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;=========&quot;</span><span style="color: #339933;">+</span>hash.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span> str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>从上面的代码可以看出遍历一个枚举对象有两种方法，一种是for循环一种是使用while，应该特别注意使用for循环的方法与普通的for循环有点差异。</p>
<p>为了读取枚举值中的内容，还可以使用IO输入流SequenceInputStream 将内容输出。<br />
在Servlet中，通过request.getParameterNames()可以获取到请求中的附加参数的枚举值：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">Enumeration</span> enume <span style="color: #339933;">=</span> request.<span style="color: #006633;">getParameterNames</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
<span style="color: #003399;">PrintWriter</span> out <span style="color: #339933;">=</span> response.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;servlet演示&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;传递的参数信息:&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>enume.<span style="color: #006633;">hasMoreElements</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>		
          <span style="color: #003399;">String</span> paramName <span style="color: #339933;">=</span> enume.<span style="color: #006633;">nextElement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
          out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>paramName <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;=&quot;</span> <span style="color: #339933;">+</span> request.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span>paramName<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
<span style="color: #009900;">&#125;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>注：此接口的功能与 Iterator 接口的功能是重复的。此外，Iterator 接口添加了一个可选的移除操作，并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/7d05d789-3cb1-40bd-81d8-6f98c4048612/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=7d05d789-3cb1-40bd-81d8-6f98c4048612" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/03/java-enumeration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Persistence API</title>
		<link>http://www.javachen.com/2010/03/java-persistence-api/</link>
		<comments>http://www.javachen.com/2010/03/java-persistence-api/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 08:31:52 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=1071</guid>
		<description><![CDATA[今天看了看关于JPA（Java Persistence API）的一些知识，并在myeclipse 8里参照帮助文档里的学习文档写出了第一个JPA工程，初步的了解了在myeclipse 上如何方便利用JPA进行持久化操作的代码开发。很久没有接触持久化操作的代码开发了，决定找些实例回忆一下持久化操作的操作方法与步骤。 在百度百科里可以看到JPA的一些介绍，简单归纳如下： JPA通过JDK 5.0注解或XML描述对象－关系表的映射关系，并将运行期的实体对象持久化到数据库中。JPA ORM规范有SUN引入，主要是因为两个原因：其一，简化现有Java EE和Java SE应用的对象持久化的开发工作；其二，Sun希望整合对ORM技术，实现天下归一。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。 JPA支持XML和JDK 5.0注解两种元数据的形式，元数据描述对象和表之间的映射关系，框架据此将实体对象持久化到数据库表中；JPA通过面向对象而非面向数据库的查询语言查询数据。 JPA 的目标之一是制定一个可以由很多供应商实现的API，并且开发人员可以编码来实现该API，而不是使用私有供应商特有的API。因此开发人员只需使用供应商特有的API来获得JPA规范没有解决但应用程序中需要的功能。尽可能地使用JPA API，但是当需要供应商公开但是规范中没有提供的功能时，则使用供应商特有的API。 JPA是需要Provider来实现其功能的，Hibernate就是JPA Provider中很强的一个，目前来说应该无人能出其右。从功能上来说，JPA现在就是Hibernate功能的一个子集。 JPA提供一种标准的OR映射解决方案，该解决方案完全集成到EJB3。0兼容的容器中，目前，Hibernate、spring、OpenJPA、Toplink、Entitymanager都实现了JPA。 JPA主要通过JDK 5.0注解和XML，来实现对象持久化的操作，通过看JPA代码就可以看到有很多的注解，这再次说明java注解在java 技术中是多么重要。要想理解现在的一些开源框架，完全有必要掌握java的基础知识，只有这样才能知其所以然！有必好好学习java注解和发射等知识！ 网上有传智播客JPA详解视频教程：http://www.itcast.cn/itcast_static/JPAVideo.htm]]></description>
			<content:encoded><![CDATA[<p>今天看了看关于JPA（Java Persistence API）的一些知识，并在myeclipse 8里参照帮助文档里的学习文档写出了第一个JPA工程，初步的了解了在myeclipse 上如何方便利用JPA进行持久化操作的代码开发。很久没有接触持久化操作的代码开发了，决定找些实例回忆一下持久化操作的操作方法与步骤。<span id="more-1071"></span><br />
在百度百科里可以看到JPA的一些介绍，简单归纳如下：</p>
<p><span style="color: #00ff00;">JPA通过JDK 5.0注解或XML描述对象－关系表的映射关系，并将运行期的实体对象持久化到数据库中</span>。JPA ORM规范有SUN引入，主要是因为两个原因：其一，简化现有Java EE和Java SE应用的对象持久化的开发工作；其二，Sun希望整合对ORM技术，实现天下归一。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。</p>
<p><span style="color: #00ff00;">JPA支持XML和JDK 5.0注解两种元数据的形式</span>，元数据描述对象和表之间的映射关系，框架据此将实体对象持久化到数据库表中；JPA通过面向对象而非面向数据库的查询语言查询数据。</p>
<p>JPA 的目标之一是制定一个可以由很多供应商实现的API，并且开发人员可以编码来实现该API，而不是使用私有供应商特有的API。因此开发人员只需使用供应商特有的API来获得JPA规范没有解决但应用程序中需要的功能。尽可能地使用JPA API，但是当需要供应商公开但是规范中没有提供的功能时，则使用供应商特有的API。</p>
<p>JPA是需要Provider来实现其功能的，Hibernate就是JPA Provider中很强的一个，目前来说应该无人能出其右。从功能上来说，JPA现在就是Hibernate功能的一个子集。</p>
<p>JPA提供一种标准的OR映射解决方案，该解决方案完全集成到EJB3。0兼容的容器中，目前，Hibernate、spring、OpenJPA、Toplink、Entitymanager都实现了JPA。</p>
<p>JPA主要通过JDK 5.0注解和XML，来实现对象持久化的操作，通过看JPA代码就可以看到有很多的注解，这再次说明java注解在java 技术中是多么重要。要想理解现在的一些开源框架，完全有必要掌握java的基础知识，只有这样才能知其所以然！有必好好学习java注解和发射等知识！</p>
<p>网上有传智播客JPA详解视频教程：<a href="http://www.itcast.cn/itcast_static/JPAVideo.htm">http://www.itcast.cn/itcast_static/JPAVideo.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/03/java-persistence-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java5中的注释Annotation</title>
		<link>http://www.javachen.com/2010/01/java5-annotation/</link>
		<comments>http://www.javachen.com/2010/01/java5-annotation/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 02:11:43 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Annotation]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=951</guid>
		<description><![CDATA[注释是java5中的新特性，谈到注释，先的谈谈Java元数据（metadata）。元数据，就是“关于数据的数据”。Java元数据有3种基本类型，还有3个Java内置注释类型，另外还有4中元注释类型。你可能用过Javadoc的注释自动生成文档。这就是元数据功能的一种。总的来说，元数据可以用来创建文档，跟踪代码的依赖性，执行编译时格式检查，代替已有的配置文件（如Hibernate也提供了注释配置）。 注释有3中基本类型 a.标记注释 &#8211;没有变量，只有名称标识。例如 @annotation b.单一值注释 &#8211;在标记注释的基础上提供一段数据。如 @annotation（“javachen”） c.完整注释 &#8211;可以包括多个数据成员，每个数据成员由名称和值构成。@annotation(site=&#8221;www.javachen.com&#8221;,author=&#8221;javachen&#8221;) Java中提供3个内置注释类型 a. Override ，只能用于方法（不能用于类，包声明或者其他构造） 作用：可以保证编译时候Override函数的声明正确性 用法： @Override public void fun(){..} b.Deprecated 同样只能作用与方法 作用：对不应再使用的方法进行注解 用法：@Deprecated public void fun{&#8230;} c.SupressWarnings 可以注释一段代码 作用：关闭特定的警告信息，例如你在使用泛型的时候未指定类型 用法： @SupressWarnings(value={&#8220;unchecked&#8221;}) Java中还提供了四种元注释，专门负责注释其他的注释 @Target 表示该注释可以用于什么地方。可用的ElementType参数包括： CONSTRUCTOR : 构造器的声明 FIELD : 域声明（包括enum实例） LOCAL_VARIABLE : 局部变量声明 METHOD : 方法声明 PACKAGE : 包声明 PARAMETER : 参数声明 TYPE : [...]]]></description>
			<content:encoded><![CDATA[<p>注释是java5中的新特性，谈到注释，先的谈谈Java元数据（metadata）。元数据，就是“关于数据的数据”。Java元数据有3种基本类型，还有3个Java内置注释类型，另外还有4中元注释类型。你可能用过Javadoc的注释自动生成文档。这就是元数据功能的一种。总的来说，元数据可以用来创建文档，跟踪代码的依赖性，执行编译时格式检查，代替已有的配置文件（如Hibernate也提供了注释配置）。<br />
<span id="more-951"></span><br />
<strong><span style="color: #0000ff;">注释有3中基本类型</span></strong><br />
a.标记注释      &#8211;没有变量，只有名称标识。例如 @annotation<br />
b.单一值注释    &#8211;在标记注释的基础上提供一段数据。如 @annotation（“javachen”）<br />
c.完整注释      &#8211;可以包括多个数据成员，每个数据成员由名称和值构成。@annotation(site=&#8221;www.javachen.com&#8221;,author=&#8221;javachen&#8221;)</p>
<p><span style="color: #0000ff;"><strong>Java中提供3个内置注释类型</strong></span><br />
a. Override ，只能用于方法（不能用于类，包声明或者其他构造）<br />
作用：可以保证编译时候Override函数的声明正确性<br />
用法：<br />
@Override<br />
public void fun(){..}</p>
<p>b.Deprecated  同样只能作用与方法<br />
作用：对不应再使用的方法进行注解<br />
用法：@Deprecated public void fun{&#8230;}</p>
<p>c.SupressWarnings 可以注释一段代码<br />
作用：关闭特定的警告信息，例如你在使用泛型的时候未指定类型<br />
用法： @SupressWarnings(value={&#8220;unchecked&#8221;})</p>
<p>Java中还提供了四种元注释，专门负责注释其他的注释</p>
<p>@Target   表示该注释可以用于什么地方。可用的ElementType参数包括：<br />
CONSTRUCTOR : 构造器的声明<br />
FIELD : 域声明（包括enum实例）<br />
LOCAL_VARIABLE : 局部变量声明<br />
METHOD : 方法声明<br />
PACKAGE : 包声明<br />
PARAMETER : 参数声明<br />
TYPE : 类、接口 （包括注解类型) 或enum声明</p>
<p>@Retention 表示需要在什么级别保存该注释信息。可选的RetentionPoicy参数包括：<br />
SOURCE : 注释将被编译器丢掉<br />
CLASS : 注释在class文件中可用，但会被VM丢弃<br />
RUNTIME : VM将在运行时也保留注释，因此可以通过反射机制读取注释的信息。</p>
<p>@Documented 将注释包含在JavaDoc中<br />
@Inheried  允许子类继承父类中的注释。</p>
<p><span style="color: #0000ff;"><strong>在Java中定义自己的注释</strong></span></p>
<p>Java语言支持一种新的类型——注释类型（annotation type），跟普通类差不多，在类中以符号（ @ ）的形式注释其他 Java 代码，用@interface 申明自定义注释类型。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.javachen.annotation</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Documented</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.ElementType</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Inherited</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Retention</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.RetentionPolicy</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Target</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * 用户自定义标签,带有成员变量的MyTag
 */</span>
@Documented <span style="color: #666666; font-style: italic;">//将注释包含在JavaDoc中</span>
@Inherited <span style="color: #666666; font-style: italic;">//允许子类继承父类中的注释。</span>
@Target<span style="color: #009900;">&#40;</span>value <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>ElementType.<span style="color: #006633;">METHOD</span>,ElementType.<span style="color: #006633;">CONSTRUCTOR</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//标注这个注释使用的范围</span>
@Retention<span style="color: #009900;">&#40;</span>value <span style="color: #339933;">=</span> RetentionPolicy.<span style="color: #006633;">RUNTIME</span><span style="color: #009900;">&#41;</span><span style="color: #666666; font-style: italic;">//要想使用反射得到注释信息，这个注释必须使用</span>
<span style="color: #000000; font-weight: bold;">public</span> @<span style="color: #000000; font-weight: bold;">interface</span> MyTag <span style="color: #009900;">&#123;</span>
	<span style="color: #003399;">String</span> name<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #0000ff;">&quot;javachen&quot;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//给自定义注释类的成员加上默认值</span>
	<span style="color: #000066; font-weight: bold;">int</span> age<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #cc66cc;">24</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><span style="color: #ff0000;">注意：在自定义注释中只有一个成员时，方法名应该为value</span><br />
使用标签最终是为了帮助开发人员提取注释信息，然后根据不同需求做进一步处理，下面我们来看看如何获取注释信息。</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.javachen.annotation</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.lang.annotation.Annotation</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TagTest <span style="color: #009900;">&#123;</span>
	@MyTag<span style="color: #009900;">&#40;</span>name <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;MyTag&quot;</span>, age <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> test<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override <span style="color: #666666; font-style: italic;">//可以保证编译时候Override函数的声明正确性</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Deprecated <span style="color: #666666; font-style: italic;">//对不应再使用的方法进行注解</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> notToUse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		TagTest tt <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> TagTest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">Annotation</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> annotation <span style="color: #339933;">=</span> tt.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;test&quot;</span><span style="color: #009900;">&#41;</span>
					.<span style="color: #006633;">getAnnotations</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Annotation</span> tag <span style="color: #339933;">:</span> annotation<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Tag is:&quot;</span> <span style="color: #339933;">+</span> tag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;tag.name()&quot;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>MyTag<span style="color: #009900;">&#41;</span> tag<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">name</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;tag.age()&quot;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>MyTag<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>tag<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">age</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">NoSuchMethodException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>需要注意的一点是，在执行这段代码之前我们还有一点小工作要做，还需要给我们的自定义标签MyTag加上一个说明标签，@ Retention, 表明注释信息将可以在运行时刻通过反射机制得到。如果不加入这个标签，上面的代码将没有任何输出。</p>
<p><strong><span style="color: #0000ff;">如何使用反射读取注释</span></strong></p>
<p>在以前的JDK版本中，我们可以使用反射得到类的方法、方法的参数以及其它的类成员等信息。那么在J2SE5.0中同样也可以象方法一样得到注释的各种信息。<br />
在使用反射之前必须使用import java.lang.reflect.* 来导入和反射相关的类。</p>
<p>如果要得到某一个类或接口的注释信息，可以使用如下代码：<br />
Annotation annotation = TestAnnotation.class.getAnnotation(MyAnnotation.class);</p>
<p>如果要得到全部的注释信息可使用如下语句：<br />
Annotation[] annotations = TestAnnotation.class.getAnnotations();<br />
或<br />
Annotation[] annotations = TestAnnotation.class.getDeclaredAnnotations();</p>
<p>getDeclaredAnnotations与getAnnotations类似，但它们不同的是getDeclaredAnnotations 得到的是当前成员所有的注释，不包括继承的。而getAnnotations得到的是包括继承的所有注释。</p>
<p>如果要得到其它成员的注释，可先得到这个成员，然后再得到相应的注释。如得到myMethod的注释。<br />
Method method = TestAnnotation.class.getMethod(&#8220;myMethod&#8221;, null);<br />
Annotation annotation = method.getAnnotation(MyAnnotation.class);</p>
<p>注：要想使用反射得到注释信息，这个注释必须使用<br />
@Retention(value = RetentionPolicy.RUNTIME)进行注释。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/01/java5-annotation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java Native Method</title>
		<link>http://www.javachen.com/2010/01/java-native-method/</link>
		<comments>http://www.javachen.com/2010/01/java-native-method/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 03:03:07 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Native]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=938</guid>
		<description><![CDATA[阅读java.lang.reflect包内的Array类，发现了其类中有一些标注了native的方法，该方法没有方法体并以分号结尾，觉得有点奇怪，于是网上搜了一些关于java中native关键字的用法。 关于java的Native Method使用说明，在网上找到了一篇广为流传转载的文章：http://ghsea.javaeye.com/blog/72543。该文章由英文翻译，讲解的通俗易懂，想看中文的讲解的可以去上面的url观摩。在这里贴出英文原文，由于不知道英文原文出处，所以无法注明英文文章来源，但还是要感谢英文原作者。 下面是原英文文章，呵呵，很久没有读英文读物了，大概还是看得懂的。 CONTENTS What Is a Native Method? Uses for Native Methods Benefits and Trade-Offs How Does This Magic Work? Summary The goal for this chapter is to introduce you to Java&#8217;s native methods. If you are new to Java, you may not know what native methods are, and even if you are [...]]]></description>
			<content:encoded><![CDATA[<p>阅读java.lang.reflect包内的Array类，发现了其类中有一些标注了native的方法，该方法没有方法体并以分号结尾，觉得有点奇怪，于是网上搜了一些关于java中native关键字的用法。<br />
关于java的Native Method使用说明，在网上找到了一篇广为流传转载的文章：<a href="http://ghsea.javaeye.com/blog/72543" target="_blank">http://ghsea.javaeye.com/blog/72543</a>。该文章由英文翻译，讲解的通俗易懂，想看中文的讲解的可以去上面的url观摩。在这里贴出英文原文，由于不知道英文原文出处，所以无法注明英文文章来源，但还是要感谢英文原作者。</p>
<p>下面是原英文文章，呵呵，很久没有读英文读物了，大概还是看得懂的。<span id="more-938"></span></p>
<h3><span style="color: #000000;"><span style="font-size: x-small;">CONTENTS<a name="CONTENTS"></a> </span></span></h3>
<ul>
<li><a href="http://www.javachen.com/2010/01/java-native-method/#WhatIsaNativeMethod">What  Is a Native Method?</a></li>
<li><a href="http://www.javachen.com/2010/01/java-native-method/#UsesforNativeMethods">Uses  for Native Methods</a></li>
<li><a href="http://www.javachen.com/2010/01/java-native-method/#BenefitsandTradeOffs">Benefits  and Trade-Offs</a></li>
<li><a href="http://www.javachen.com/2010/01/java-native-method/#HowDoesThisMagicWork">How  Does This Magic Work?</a></li>
<li><a href="http://www.javachen.com/2010/01/java-native-method/#Summary">Summary</a></li>
</ul>
<hr />The goal for this chapter is to introduce you to Java&#8217;s native  methods. If  you are new to Java, you may not know what native methods  are, and even if you  are an experienced Java developer, you may not  have had a reason to learn more  about native methods. At the conclusion  of this chapter you should have a better  understanding of what native  methods are, when and why you may want to use them,  and the  consequences of using them. You should also have a basic understanding   of how native methods work. You will then be more than ready to tackle  the next  three chapters, which dive into the nitty-gritty details of  Java&#8217;s Native  Methods.</p>
<h2><a name="WhatIsaNativeMethod"><strong><span style="color: #ff0000; font-size: large;">What  Is a Native  Method?</span></strong></a></h2>
<p>Simply put, a native method is the Java interface to non-Java code.  It is  Java&#8217;s link to the &#8220;outside world.&#8221; More specifically, a native  method is a Java  method whose implementation is provided by non-Java  code, most likely C (see  Figure 30.1). This feature is not special to  Java. Most languages provide some  mechanism to call routines written in  another language. In C++, you must use the  <tt>extern "C" </tt><span style="font-family: MCPdigital-I; font-size: xx-small;">stmt</span> to signal that  the C++  compiler is making a call to C functions. It is common to see the   qualifier <tt>pascal</tt> in many C compilers to signal that the calling   convention should be done in a Pascal convention, rather than a C  convention.  FORTRAN and Pascal have similar facilities, as do most  other languages.</p>
<p><strong>Figure 30.1 : </strong><em>A  native method is a Java method  whose implementation is provided by  non-java code.</em></p>
<p>In Java, this is done via native methods. In your Java class, you  mark the  methods you wish to implement outside of Java with the <tt>native</tt> method  modifier-much like you would use the<tt> public</tt> or <tt>static</tt> modifiers. Then, rather than supplying the method&#8217;s body, you simply  place a  semicolon in its place. As an example, the following class  defines a variety of  native methods:</p>
<blockquote><p><tt>public class IHaveNatives<br />
{<br />
</tt> <tt> native  public void  Native1( int x ) ;<br />
native static public long Native2()   ;<br />
</tt> <tt> native synchronized private float Native3( Object o )   ;<br />
native void Native4( int[] ary ) throws Exception ;<br />
}</tt></p></blockquote>
<p>This sample class shows a number of possible native methods. As you  may have  noticed, native methods look much like any other Java method,  except a single  semicolon is in the place of the method body.  Naturally, the body of the method  is implemented outside of Java. What  you basically define is the interface into  this <em>external</em> method.  This method declaration describes the Java view of  some foreign code.</p>
<p>The only thing special about this declaration is that the keyword  <tt>native</tt> is used as a modifier. Every other Java method modifier can be  used  along with <tt>native</tt>, except <tt>abstract</tt>. This is logical,   because the <tt>native</tt> modifier implies that an implementation  exists, and  the <tt>abstract</tt> modifier insists that there is no  implementation. Your  native methods can be static methods, thus not  requiring the creation of an  object (or instance of a class). This is  often convenient when using native  methods to access an existing  C-based library. Naturally, native methods can  limit their visibility  with the <tt>public</tt>, <tt>private</tt>, <tt>private  protected</tt>,  <tt>protected</tt>, or unspecified <em>default </em>access. Native   methods can also be <tt>synchronized</tt> (<a href="http://www.80x86.cn/ch7.htm">see Chapter 7</a>,  &#8220;Concurrency and  Synchronization&#8221;). In the case of a <tt>synchronized</tt> native  method, the Java VM will perform the monitor locking prior to entering   the native method implementation code. So, as in Java, the developer is  not  burdened with doing the actual monitor locking and unlocking.</p>
<p>The example uses a variety (although not all) of types. This is  because a  native method can be passed any Java type. There is no  special procedure within  the Java code to pass data to the native  method. However, the developer of  native methods must be careful that  his native methods behave properly when  manipulating Java datatypes.  Native methods do not undergo the same kinds of  checking as a Java  method, and they can easily corrupt a Java datatype if care  is not  taken (<a href="http://www.80x86.cn/ch31.htm">see Chapter 31</a>, &#8220;The  Native Method  Interface&#8221;).</p>
<p>A native method can accept and return any of the Java types-including  class  types. Of course, the power of exception handling is also  available to native  methods. The implementation of the native method  can create and throw exceptions  similar to a Java method. When a native  method receives complex types, such as  class types (such as <tt>Object</tt> in the example) or array types (such as the  <tt>int[]</tt> in the  example), it has access to the contents of those types.  However, the  method used to access the contents may vary depending on the Java   implementation being used. The major point to remember is that you can  access  all the Java features from your native implementation code, but  it may be  implementation-dependent and will surely not be as convenient  or easy as it can  be done from Java.</p>
<p>The presence of native methods does not affect how other classes call  those  methods. The caller does not even realize it is calling a native  method, so no  special code is generated, and the calling convention is  the same as for any  other method-the calling depends on the method  being virtual or static. The Java  virtual machine will handle all the  details to make the call in the native  method implementation. One minor  exception may be with the methods marked with  the <tt>final</tt> modifier. The Java implementation may take advantage of a  <tt>final</tt> method and choose to inline its code. It would be doubtful that  this  could be achieved with a native <tt>final</tt> method, but this is an   optimization issue, not one of functionality. When a class containing  native  methods is subclassed, the subclass will inherit the native  method and also will  have the capability of overriding the native  method-even with a Java method  (that is, the overridden method can be  implemented in Java). If a native method  is also marked with the <tt>final</tt> modifier, a subclass is still prevented  from overriding it.</p>
<p>Native methods are very powerful, because they effectively extend the  Java  virtual machine. In fact, your Java code already uses native  methods. In the  current implementation from Sun, native methods are  used in many places to  interface to the underlying operating system.  This enables a Java program to go  beyond the confines of the Java  Runtime. With native methods, a Java program can  virtually do any  application level task.</p>
<h2><a name="UsesforNativeMethods"><strong><span style="color: #ff0000; font-size: large;">Uses  for Native  Methods</span></strong></a></h2>
<p>Java is a wonderful language to use. However, there are times when  you either  must interface with existing code, can&#8217;t express the task in  Java, or need the  absolute best performance.</p>
<h3><strong>Accessing Outside the Java Environment</strong></h3>
<p>There are times where a Java application (or applet) <em>must</em> communicate  with the environment outside of Java. This is, perhaps, the  main reason for the  existence of native methods. For starters, the  Java implementation will need to  communicate with the underlying  system. That underlying system may be an  operating system such as  Solaris or Win32, or it may be a Web browser, or it may  be custom  hardware, such as a PDA, Set-top-device, and so forth. Regardless of   what is under Java, there must be a mechanism to communicate with that  system.  At some point in a Java program, there will be that point where  Java meets the  outside world, an interface between Java and non-Java  worlds. Native methods  provide a simple clean approach to providing  this interface without burdening  the rest of the Java application with  special knowledge.</p>
<h4><strong>Accessing the Operating System</strong></h4>
<p>The Java virtual machine describes a system that the Java program can  rely on  to be there. This virtual machine supports the Java Language  and its runtime  library. It may be composed of an interpreter or can be  libraries linked to  native code. Regardless of its form, it is not a  complete system and often  relies on an existing system underneath to  provide a lot of support. More than  likely, a full-fledged operating  system, such as Solaris or Win32, resides  beneath it. The use of native  methods enables the Java Runtime to be written in  Java yet have access  to the underlying operating system, or even the parts of  the Java  virtual machine that may be written in a language such as C. Further,   if a Java feature does not encapsulate an operating system feature  needed by an  application, native methods can be used to access this  feature.</p>
<h4><strong>Embedded Java</strong></h4>
<p>It is conceivable to see a Java virtual machine embedded inside  another  program. Several WWW browsers come to mind. Perhaps this  enclosing program is  not implemented in Java. The Java Runtime may need  to access the enclosing  program for services to support the Java  environment. Once again, native methods  provide a clean interface for  this access to the surrounding program.  Furthermore, the vendor of the  program may wish to expose some features of the  program to a Java  applet. The vendor would simply need to create a set of Java  classes  containing native methods, which provide the interface for the Java   application into the program. The native method implementation would  then be the  &#8220;glue&#8221; between the Java applet and the internals of the  enclosing program.</p>
<h4><strong>Custom Hardware</strong></h4>
<p>Another important possible application of native methods being used  to access  a non-Java world is providing Java programs access to custom  hardware. Perhaps a  Java virtual machine is running within a PDA or  Set-Top-Device. A lot of what  would normally be in an operating system  may exist in hardware or software  embedded in ROM, or other custom chip  sets. Another possibility is that a  computer may be equipped with a  dedicated graphics card. It would be ideal to  have Java make use of the  graphics hardware. A set of Java classes with native  methods defined  would provide the Java program access to these features.</p>
<h4><strong>Sun&#8217;s Java</strong></h4>
<p>In the current implementation from Sun, the Java interpreter is  written in C  and can thus talk to the outside environment as any normal  C program can. A  majority of the Java Runtime is written in Java and  may make calls into the  interpreter or directly to the outside  environment, all via native methods. The  application deals mostly with  the Java Runtime, but it may also talk to the  outside environment via  native methods. For example in the class  <tt>java.lang.Thread</tt> the <tt>setPriority()</tt> method is implemented in  Java but calls the method <tt>setPriority0()</tt>,  which is a native method in  the <tt>Thread</tt> class. This native  method is implemented in C and resides  within the Java virtual machine  itself. On the Windows 95 platform this native  method will then call  (eventually) the Win32 <tt>SetPriority()</tt> API. This is  an example  where the native method implementation was provided by the Java  virtual  machine directly. In most cases the native method implementation  resides  in an external dynamic link library (discussed in a following  section), but the  call still goes through the Java virtual machine.</p>
<h3><strong>Performance</strong></h3>
<p>Another major reason for native methods is performance. The Java  language  trades some performance for features like its dynamic nature,  garbage  collecting, and safety. Some Java implementations, like the  current crop, may be  interpreters, which also add extra overhead. The  lost performance can be small  as the implementation technology for Java  systems improve, but until then and  even after there may always be a  small performance overhead for certain  functionality a Java program may  need. This functionality can be pushed down  into a native method. That  native method can then be implemented efficiently at  the native lower  level of the system on which the Java virtual machine is  running. Once  at the native implementation level, the developer can use the   best-suited language, such as C or even assembler. In this way, maximum   performance can be achieved in those specific areas while the bulk of  the  application is done within the safe and robust Java virtual  machine. One area  where you may choose to implement some parts of an  application in native methods  is time-intensive computations, such as  graphics rendering, simulation models,  and so forth.</p>
<h3><strong>Accessing Existing Libraries</strong></h3>
<p>The fact that Java is targeted at the production of platform-neutral  code  means that the current implementations may not access system  features that you  may need. An example is a database engine. If you  need to, you can use the  native method facility to provide your own  interface to such libraries. Further,  you may want to use Java to write  applications that use existing in-house  libraries. Again, the use of  native methods enables you to make such an  interface. This enables you  to leverage off your existing code base as well as  gradually introduce  Java-based applications among your other applications coded  in an older  language.</p>
<h2><a name="BenefitsandTradeOffs"><strong><span style="color: #ff0000; font-size: large;">Benefits  and  Trade-Offs</span></strong></a></h2>
<p>The presense of native methods offers many benefits, the biggest  being the  extension of Java power. However, there is always a downside  to all good things,  and native methods definitely have their downsides.  Depending on what the goals  of your application are, the downsides may  not be that terrible. Foremost is the  fact that, by definition, the  use of native methods defeats several of Java&#8217;s  main goals: platform  neutrality, system safety, and security.</p>
<p>Some of Java&#8217;s attractive features help minimize the downsides,  however. The  best feature of all is that Java is such a nice language  to develop in you won&#8217;t  want to use native methods unless you have to.</p>
<h3><strong>Platform Neutrality</strong></h3>
<p>Because a native method is implemented in a foreign language, the  platform  neutrality is limited to the language being used. Most likely,  native methods  are implemented in C or C++. Although those languages  have standards, these  standards leave a lot of room for  implementation-defined attributes (even  compilers on the same system  may differ), so your mileage may vary. If the  native method accesses  the underlying system, you are tying your implementation  to that  system. For example, the file systems of UNIX and Win32 have some   differences. There may even be differences between flavors of UNIX and  Win32  (Win95 and WinNT are not identical). Once again, you may  sacrifice your platform  neutrality with your native method. This may  cause you to have to support a  limited number of platforms (rather than  <em>all</em> Java platforms). Further,  for each platform you choose to  support, you may (probably will) have to  implement several flavors of  the native method.</p>
<p>The Java language and runtime provide a number of features that make   applications more robust and safe. Java&#8217;s memory management,  synchronization  features, and lack of address manipulation help prevent  common programming  mistakes from slipping through the development and  testing phases of your  product. However, once you drop out of Java into  a native method, you are, once  again, at the mercy of the language and  system in which you are implementing the  native method. If your native  method implemented in C chooses to manipulate an  address directly, you  risk corrupting some part of memory, perhaps even the Java  virtual  machine itself.</p>
<h3><strong>Security Concerns</strong></h3>
<p>Additionally, the Java Language provides features to aid in the  writing of  secure applications. A Java virtual machine is much more  capable of detecting an  &#8220;evil&#8221; Java program than an application in  other languages. Once you drop into a  native method, the Java virtual  machine can no longer verify, catch, or prevent  the program from  violating the security of the environment in which the Java  virtual  machine is running. This is the reason a Java-enabled Web browser   typically does not allow a nontrusted native method to be called. In  today&#8217;s  browsers, a trusted native method must be present on the local  system in a  certain location to be executed from an <em>arriving</em> applet (in other words,  one loaded from a remote site). For more  information on security, in general,  see Part 6, &#8220;Security.&#8221; For more  information on how security applies to native  methods, see <a href="http://www.80x86.cn/ch33.htm">Chapter 33</a>, &#8220;Securing Your  Native Method  Libraries.&#8221;</p>
<h3><strong>System Safety</strong></h3>
<p>Another potential hazard is the fact that a native method is not  isolated.  When a native method is entered, it not only accesses the  environment outside  the Java virtual machine, it also freely accesses  the Java virtual machine  directly. This is a necessary evil. It gives  the native method quite a bit of  power and flexibility, because it may  need access to information kept within the  virtual machine to do its  job. This flexibility, however, exposes the internals  of the Java  virtual machine to the native method.</p>
<h3><strong>Dependence on the Java Implementation</strong></h3>
<p>It should be obvious that the implementation of native methods is  also  dependent on the Java implementation itself. This means that the  native methods  you write today for use with the Sun implementation of  Java may not work with a  Java implementation from another vendor.</p>
<p>The interface used for the Java virtual machine to call out to native  methods  and the interface that native methods use to access the  internal functions and  data structures of the Java virtual machine are  not, currently, defined by  either the Java Language Specification or  the Java Virtual Machine  Specification. A lot of native methods call  back into the Java virtual machine  for instantiating new objects,  calling Java methods, throwing Java Exceptions,  and so forth. Further,  the method used to lay out Java types is also not  defined. So, although  your native method of today knows how to access the fields  of an  object, this could be different on the Java virtual machine of tomorrow.   This oversight can be greatly helped if a standard API is defined for  both how a  Java program interacts with a native method and how a native  method accesses  data within the Java virtual machine. Even after such  an API,  implementation-defined behavior will likely still be present.</p>
<h3><strong>Java to the Rescue!</strong></h3>
<p>Recall that Java helps to minimize the damage of native methods. When  you  find yourself in the position that you must use native methods,  you can take  advantage of Java&#8217;s features to help isolate the usage and  perhaps maintain a  fair amount of Java&#8217;s advantages.</p>
<h4><strong>The Java Class System</strong></h4>
<p>Because Java narrows the use of native facilities to within the  confines of a  method, it does not affect the design of the program. A  program is still a  collection of classes and all classes still  communicate with each other via  their defined interface-that is, the  classes&#8217; methods. Thus the callers of  native methods do not know they  are calling native methods. Because methods are  discrete operations on  the data of a specific object, they tend to be small  chunks of code.  This implies that native methods tend to be conceptually small,  easily  managed, pieces of code.</p>
<h4><strong>Java Still Works for You</strong></h4>
<p>Java will still perform a variety of duties-such as parameter  checking, stack  checking, synchronization, and so forth-before entering  the actual native code.  It greatly aids the developer in writing  correct native methods. A native method  is capable of creating new  objects and calling Java methods, and it can even  cause exceptions to  be thrown. In the current implementation from Sun, an  exception can be  created by a native method and registered for throwing. When  Java  virtual machine gains control back from the native method, usually  because  of that method returning, the exception will then be thrown.</p>
<p>It&#8217;s a good idea to make your native methods as small as possible and  have  them do a specific task. Do the work that needs to be done and  pass the  information back into the Java method. It&#8217;s also wise to have  your Java classes  make the native methods private, then provide a  public Java method that will  call the private native method. This  enables the Java method to perform error  checks and other data  manipulations, freeing your actual native method  implementation to  focus on its simple task.</p>
<h2><a name="HowDoesThisMagicWork"><strong><span style="color: #ff0000; font-size: large;">How  Does This  Magic Work?</span></strong></a></h2>
<p>Much of the magic of making native methods work is provided in the  next three  chapters. This section provides an introduction, which  neglects many of the  details but should give you a good frame of  reference for understanding the  following chapters. If you don&#8217;t really  want to use native methods, but just  want a basic understanding this  discussion should satisfy your needs.</p>
<h3><strong>Sun&#8217;s Implementation</strong></h3>
<p>Due to the lack of a well-defined interface between a Java  implementation and  its surrounding environment, the details of writing  native methods will most  likely be specific to the implementation of  the Java system you are using. The  next sections are based on the  implementation provided by Sun on the  Solaris-Sparc and Win32-Intel  platforms.</p>
<h4><strong>Using Dynamic Linking</strong></h4>
<p>Sun&#8217;s Java implementation interfaces to native methods by using the  dynamic  linking capabilities of the underlying operation system. The  Java virtual  machine is a complete program, which is already compiled  for its respective  platform. The nature of Java enables it easily to  absorb a Java class and  execute its behavior. However, for a compiled  native method, things are not so  simple. Somehow, the Java virtual  machine must be taught how to call this native  method. This is done by  relying on the implementation of native methods to  reside in a dynamic  link library, which the operating system magically loads and  links into  the process that is running the Java virtual machine. On the Solaris   platform, such a library is often called <em>shared objects</em>, or <em>shared   libraries</em>, or simply <em>dot-so&#8217;s (.so&#8217;s)</em>. On Win32 platforms,  they are  called <em>dynamic link libraries</em> <em>(DLLs)</em>. This  chapter uses DLL to  refer to both.</p>
<p>Both Solaris and Win32 provide the necessary capabilities to achieve  this  dynamic linking. The dynamic linking facilities of both Solaris  and Win32 are  similar in concept, but differ in their details. This  chapter does not attempt  to describe the two in detail; however, if you  wish to do native method  programming, you should understand the  mechanism used by your platform. On  Solaris, you can begin by viewing  the manual page on the <tt>dlopen()</tt> system call, and its  relatives. On Win32, start with the help file on  <tt>LoadLibrary()</tt> and its relatives. Further, you should understand the  calling  conventions and linking convention used by your compiler.</p>
<p>Sometime before a native method is invoked, the Java virtual machine  must be  told to find, load, and link the necessary DLLs, which contain  the native method  implementations. This is conveniently achieved by  using the static method  <tt>java.lang.System.loadLibrary( "mystuff" )</tt>.  It is worth noting here that  the name passed is not the actual  filename of the DLL. Java maps the passed name  into an expected  filename, appropriate for the underlying system, of the DLL. In  the  call described previously, the string <tt>"mystuff"</tt> is mapped to a  DLL  named libmystuff.so on Solaris and mystuff.dll on Win32. If you run  the Java  program under a debugger, Java conveniently maps the same  name  <tt>"mystuff"</tt> to <tt>libmystuff_g.so</tt> and <tt>mystuff_g.dll</tt>.  This  enables you to supply two versions of the DLL-one with debug  symbols, one  without. Java magically finds the right one, dependent on  whether you run under  a debugger or not.</p>
<h4><strong>Defining the Calling Convention</strong></h4>
<p>In, essence, Sun defines the method its Java virtual machine will use  to call  external functions. In order to dynamically link and call the  implementation of  a native method successfully, the Java virtual  machine must know several  details. It must know the name of the  function within the DLL (the  implementation of the native method) to  locate the symbol and its entry point.  It also must know how to call  that function (its return type, number of  parameters, and types of  parameters). The Java virtual machine expects the  functions to be coded  in C using the calling conventions appropriate for the  underlying  architecture (and compiler).</p>
<p>In simple terms, this means the actual function calls Java makes into  the DLL  must be known names; if you are trying to get Java to call  into your existing  library, unless your functions magically match the  names Java expects  (unlikely), you will usually have glue code, which  sits between Java and your  real functions. Java will call the glue  functions<em>,</em> which in turn call in  your functions. Alternatively,  you can modify your functions to use the names  and parameters Java  expects, thus eliminating this extra call; however, in  practice this is  not always feasible, especially when calling existing  libraries.  Figure 30.2 shows the most likely scenarios of how your code will be   segmented.</p>
<p><a href="http://www.80x86.cn/f30-2.gif" class="highslide-image" onclick="return hs.expand(this);"><strong>Figure 30.2 : </strong><em>Java&#8217;s  use of Dynamic Link  Libraries.</em></a></p>
<p>The Sun JDK provides a tool, named <tt>javah</tt>, to help you create  your  native method implementation functions. The developer of native  methods runs  <tt>javah</tt>, passing it the name of a class. <tt>javah</tt> emits both a  header file (.h) and a code file (.c) containing  information about each native  method and relevant type declarations.  The .h file will contain the prototypes  of the functions Java will  call, and thus expect to find in the DLL. The .c file  will contain  stubs for each function. Thus, the developer needs to fill in only  the  details of the functions in the c file and build the DLL appropriately.</p>
<h4><strong>How the Virtual Machine Makes It Work</strong></h4>
<p>When a class is first used by Java, its class descriptor is loaded  into  memory. The <em>class descriptor</em> can be thought of as a  directory for all  services provided by the class-there is only one  class descriptor loaded,  regardless of how many instances of that class  exist. Among its entries is a  list of <em>method descriptors,</em> which  contain information specific to  methods, including where the code is,  what parameters they take, and method  modifiers.</p>
<p>If a method descriptor has its native modifier set, the block will  include a  pointer to the function that implements that native method.  This function  resides in some DLL but will be loaded into the Java  processes address space by  the operating system. At the time the class  descriptor with native methods is  loaded, the associated DLL does not  have to be loaded, and thus the function  pointer will not be set.  Sometime prior to a native method being called, the  associated DLL  should be loaded. This is done via a call to  <tt>java.system.loadLibrary()</tt>.  When this call is made, Java will find and  load the DLL but will still  not resolve symbols; the resolution phase is delayed  until the point  of use. At the time of a call to a native method, Java will  first check  to see whether the native method implementation function has already   been resolved-that is, its pointer is not <tt>null</tt>. If it has been   previously resolved, the call is performed; otherwise, the resolution  of the  symbols is attempted. The resolution is performed by making an  operating system  call to see whether the symbol exists in the caller&#8217;s  address space. This  includes the Java process and any DLLs loaded on  its behalf. On Win32, this is  done via a <tt>GetProcAddress()</tt> and  on Solaris via a <tt>dlsym()</tt> call.</p>
<p>If the symbols are correctly resolved, the call is performed as if  the Java  virtual machine was making a standard C call to its own  internal functions. If  the resolution fails, the exception <tt>java.lang.UnsatisfiedLinkError</tt> will  be thrown at the point of the native method call.</p>
<h2><a name="Summary"><strong><span style="color: #ff0000; font-size: large;">Summary</span></strong></a></h2>
<p>You should now have a basic understanding of how native methods  enable a Java  program to access the outside environment. Whether that  consists of an operating  system, a browser, or your own existing  libraries, your Java code can reach  them. It should now be clear that  native methods do not come without some cost.  You lose a lot of the  benefits of the Java language. When there is no choice,  however, native  methods are there to be used. With the basic understanding of  how  native methods work you should be ready to tackle the next chapters,  which  provide more in-depth examples of native methods in action, as  well as more tips  and tricks to help you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/01/java-native-method/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java 反射机制</title>
		<link>http://www.javachen.com/2010/01/java-reflection/</link>
		<comments>http://www.javachen.com/2010/01/java-reflection/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 02:25:35 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=933</guid>
		<description><![CDATA[反射的概念是由Smith在1982年首次提出的，主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 Java中，反射是一种强大的工具。它使您能够创建灵活的代码，这些代码可以在运行时装配，无需在组件之间进行源代表链接。反射允许我们在编写与执行时，使我们的程序代码能够接入装载到JVM中的类的内部信息，而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是：如果使用不当，反射的成本很高。 java反射所需要的类 1.Class类：它的实例表示正在运行的java应用程序中的类和接口 2.Constructor类：提供 关于类的单个构造方法的信息以及对他的访问权限。 3.Method类：提供有关类或接口的单独的某个方法的信息 4.Array类：提 供动态创建数组或访问数组的静态方法。 5.Field类：提供有关类或接口的属性的信息，以及对他的动态访问权限。 “ Class ” class Class class 十分特殊。它和一般 classes 一样继承自 Object ，其实体用以表达 Java 程序运行时的 classes 和 interfaces ， 也用来表达 enum 、 array 、 primitive Java types （ boolean, byte, char, short, int, long, float, double ）以及关键词 void 。当一个 class 被加载，或当加载器（ class loader ）的 defineClass() 被 JVM [...]]]></description>
			<content:encoded><![CDATA[<p>反射的概念是由Smith在1982年首次提出的，主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。</p>
<p>Java中，反射是一种强大的工具。它使您能够创建灵活的代码，这些代码可以在运行时装配，无需在组件之间进行源代表链接。反射允许我们在编写与执行时，使我们的程序代码能够接入装载到JVM中的类的内部信息，而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是：如果使用不当，反射的成本很高。<span id="more-933"></span></p>
<p>java反射所需要的类<br />
1.Class类：它的实例表示正在运行的java应用程序中的类和接口<br />
2.Constructor类：提供 关于类的单个构造方法的信息以及对他的访问权限。<br />
3.Method类：提供有关类或接口的单独的某个方法的信息<br />
4.Array类：提 供动态创建数组或访问数组的静态方法。<br />
5.Field类：提供有关类或接口的属性的信息，以及对他的动态访问权限。</p>
<p><strong>“ </strong><strong>Class </strong><strong>” </strong><strong>class</strong></p>
<p>Class class 十分特殊。它和一般 classes 一样继承自 Object ，其实体用以表达 Java 程序运行时的 classes 和 interfaces ， 也用来表达 enum 、  array  、 primitive  Java types （ boolean,  byte, char, short, int, long, float, double ）以及关键词 void 。当一个 class 被加载，或当加载器（ class loader ）的 defineClass() 被 JVM 调用， JVM 便自动产生一个 Class object  。如果您想借由 “ 修改 Java 标准库源码 ” 来 观察 Class object 的实际生成时机（例如在 Class 的 constructor 内添加一个 println() ），不能够！因为 Class 并没有 public constructor</p>
<p><strong>“ </strong><strong>Class </strong><strong>” </strong><strong>object </strong><strong>的取得途径 </strong><strong> </strong></p>
<p>Java 允许我们从多种管道为一个 class 生成对应的 Class object 。下图是 一份整理。</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="187" valign="top">Class object 诞生管道</td>
<td width="381" valign="top">示 例</td>
</tr>
<tr>
<td width="187" valign="top">运 用 getClass()<br />
注： 每个 class 都有此函数</td>
<td width="381" valign="top">String str = &#8220;abc&#8221;;<br />
Class c1 = str.getClass();</td>
</tr>
<tr>
<td width="187" valign="top">运 用<br />
Class.getSuperclass() <sup>2 </sup></td>
<td width="381" valign="top">Button b = new Button();<br />
Class c1 = b.getClass();<br />
Class c2 = c1.getSuperclass();</td>
</tr>
<tr>
<td width="187" valign="top">运 用 static method<br />
Class.forName()（最 常被使用）</td>
<td width="381" valign="top">Class c1 = Class.forName (&#8220;java.lang.String&#8221;);<br />
Class c2 = Class.forName (&#8220;java.awt.Button&#8221;);<br />
Class c3 = Class.forName  (&#8220;java.util.LinkedList$Entry&#8221;);<br />
Class c4 = Class.forName (&#8220;I&#8221;);<br />
Class c5 = Class.forName (&#8220;[I");</td>
</tr>
<tr>
<td width="187" valign="top">运 用.class 语法</td>
<td width="381" valign="top">Class c1 = String.class;<br />
Class c2 = java.awt.Button.class;<br />
Class c3 = Main.InnerClass.class;<br />
Class c4 = int.class;<br />
Class c5 = int[].class;</td>
</tr>
<tr>
<td width="187" valign="top">运 用<br />
primitive wrapper classes<br />
的  TYPE 语法</td>
<td width="381" valign="top">Class c1 = Boolean.TYPE;<br />
Class c2 = Byte.TYPE;<br />
Class c3 = Character.TYPE;<br />
Class c4 = Short.TYPE;<br />
Class c5 = Integer.TYPE;<br />
Class c6 = Long.TYPE;<br />
Class c7 = Float.TYPE;<br />
Class c8 = Double.TYPE;<br />
Class c9 = Void.TYPE;</td>
</tr>
</tbody>
</table>
<p><strong>Java classes </strong><strong>各成份所对应的 </strong><strong>Reflection APIs </strong></p>
<p>其中出现的 Package 、 Method 、 Constructor 、Field  等等 classes ，都定义于 java.lang.reflect 。</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="115" valign="top">Java class 内部模块</td>
<td width="168" valign="top">Java class 内部模块说明</td>
<td width="159" valign="top">相 应之 Reflection API ，多半为 Class methods 。</td>
<td width="117" valign="top">返 回值类型 (return type)</td>
</tr>
<tr>
<td width="115" valign="top">(1) package</td>
<td width="168" valign="top">class 隶属哪个 package</td>
<td width="159" valign="top">getPackage()</td>
<td width="117" valign="top">Package</td>
</tr>
<tr>
<td width="115" valign="top">(2) import</td>
<td width="168" valign="top">class 导入哪些 classes</td>
<td width="159" valign="top">无 直接对应之 API 。</td>
<td width="117" valign="top"></td>
</tr>
<tr>
<td width="115" valign="top">(3) modifier</td>
<td width="168" valign="top">class （或 methods, fields ）的属性</td>
<td width="159" valign="top">int getModifiers()<br />
Modifier.toString(int)<br />
Modifier.isInterface(int)</td>
<td width="117" valign="top">int<br />
String<br />
bool</td>
</tr>
<tr>
<td width="115" valign="top">(4) class name or interface name</td>
<td width="168" valign="top">class/interface</td>
<td width="159" valign="top">名 称 getName()</td>
<td width="117" valign="top">String</td>
</tr>
<tr>
<td width="115" valign="top">(5) type parameters</td>
<td width="168" valign="top">参 数化类型的名称</td>
<td width="159" valign="top">getTypeParameters()</td>
<td width="117" valign="top">TypeVariable &lt;Class&gt;[]</td>
</tr>
<tr>
<td width="115" valign="top">(6) base class</td>
<td width="168" valign="top">base class （只可能一个）</td>
<td width="159" valign="top">getSuperClass()</td>
<td width="117" valign="top">Class</td>
</tr>
<tr>
<td width="115" valign="top">(7) implemented interfaces</td>
<td width="168" valign="top">实 现有哪些 interfaces</td>
<td width="159" valign="top">getInterfaces()</td>
<td width="117" valign="top">Class[]</td>
</tr>
<tr>
<td width="115" valign="top">(8) inner classes</td>
<td width="168" valign="top">内 部 classes</td>
<td width="159" valign="top">getDeclaredClasses()</td>
<td width="117" valign="top">Class[]</td>
</tr>
<tr>
<td width="115" valign="top">(8&#8242;) outer class</td>
<td width="168" valign="top">如 果我们观察的 class 本身是  inner  classes ，那么相对它就会有个  outer  class 。</td>
<td width="159" valign="top">getDeclaringClass()</td>
<td width="117" valign="top">Class</td>
</tr>
<tr>
<td width="115" valign="top">(9) constructors</td>
<td width="168" valign="top">构 造函数 getDeclaredConstructors()</td>
<td width="159" valign="top">不 论 public 或  private  或其它 access level  ，皆可获得。另有功能近似之取得函数。</td>
<td width="117" valign="top">Constructor[]</td>
</tr>
<tr>
<td width="115" valign="top">(10) methods</td>
<td width="168" valign="top">操 作函数 getDeclaredMethods()</td>
<td width="159" valign="top">不 论 public 或  private  或其它 access level  ，皆可获得。另有功能近似之取得函数。</td>
<td width="117" valign="top">Method[]</td>
</tr>
<tr>
<td width="115" valign="top">(11) fields</td>
<td width="168" valign="top">字 段（成员变量）</td>
<td width="159" valign="top">getDeclaredFields() 不论 public 或 private 或其它 access level ，皆可获得。另有功能近似之取得函数。</td>
<td width="117" valign="top">Field[]</td>
</tr>
</tbody>
</table>
<p>Reflection 的另三个动态性质： (1) 运行时生成 instances ， (2) 执行 期唤起 methods ，  (3) 运行时改动 fields 。</p>
<p><span style="color: #0000ff;">在网上找了一些关于反射的相关讲解，没有发现用详细代码加以注释说明反射的一些用法，看来还是不得不自己深入理解之后，自己写一些详细的使用方法，那时候 再把代码贴出来。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/01/java-reflection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is MIME？</title>
		<link>http://www.javachen.com/2010/01/what-is-mime%ef%bc%9f/</link>
		<comments>http://www.javachen.com/2010/01/what-is-mime%ef%bc%9f/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 09:44:32 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Base64]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[MIME]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=908</guid>
		<description><![CDATA[这是一篇普及互联网术语的文章。每天呆在互联网上，发现呆的时间越长，发现自己不知道的东西越多。互联网上有太多的知识，虽然我们不可能一下子了解透彻，但是遇到一个就有必要去了解其相关的知识或是原理，这样以后再见到他就不会觉得陌生了。 在维基百科上找到了关于MIME的介绍：http://zh.wikipedia.org/zh-cn/MIME，这里简要的介绍一下相关知识，便于以后查阅。 按照RFC2045的定义，Base64被定义为：Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。（The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.） 多用途互联网邮件扩展（MIME，Multipurpose Internet Mail Extensions）是一个互联网标准，它扩展了电子邮件标准，使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822，规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此，一些非英语字符消息和二进制文件，图像，声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各种各样的数据类型的符号化方法。 此外，在万维网中使用的HTTP协议中也使用了MIME的框架。 IME是通过标准化电子邮件报文的头部的附加领域（fields）而实现的；这些头部的附加领域，描述新的报文类型的内容和组织形式。目前版本是1.0。 内容类型（Content-Type），这个头部领域用于指定消息的类型。一般以下面的形式出现。 Content-Type: [type]/[subtype]; parameter type有下面的形式。 * Text：用于标准化地表示的文本信息，文本消息可以是多种字符集和或者多种格式的； * Multipart：用于连接消息体的多个部分构成一个消息，这些部分可以是不同类型的数据； * Application：用于传输应用程序数据或者二进制数据； * Message：用于包装一个E-mail消息； * Image：用于传输静态图片数据； * Audio：用于传输音频或者音声数据； * Video：用于传输动态影像数据，可以是与音频编辑在一起的视频数据格式。 [...]]]></description>
			<content:encoded><![CDATA[<p>这是一篇普及互联网术语的文章。每天呆在互联网上，发现呆的时间越长，发现自己不知道的东西越多。互联网上有太多的知识，虽然我们不可能一下子了解透彻，但是遇到一个就有必要去了解其相关的知识或是原理，这样以后再见到他就不会觉得陌生了。</p>
<p>在维基百科上找到了关于MIME的介绍：<a href="http://zh.wikipedia.org/zh-cn/MIME" target="_blank">http://zh.wikipedia.org/zh-cn/MIME</a>，这里简要的介绍一下相关知识，便于以后查阅。<span id="more-908"></span></p>
<p>按照RFC2045的定义，Base64被定义为：Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。（The  Base64 Content-Transfer-Encoding is designed to represent arbitrary  sequences of octets in a form that need not be humanly readable.）</p>
<p>多用途互联网邮件扩展（MIME，Multipurpose Internet Mail Extensions）是一个互联网标准，它扩展了电子邮件标准，使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822，规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此，一些非英语字符消息和二进制文件，图像，声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各种各样的数据类型的符号化方法。 此外，在万维网中使用的HTTP协议中也使用了MIME的框架。<br />
IME是通过标准化电子邮件报文的头部的附加领域（fields）而实现的；这些头部的附加领域，描述新的报文类型的内容和组织形式。目前版本是1.0。<br />
内容类型（Content-Type），这个头部领域用于指定消息的类型。一般以下面的形式出现。</p>
<p>Content-Type: [type]/[subtype]; parameter</p>
<p>type有下面的形式。</p>
<p>* Text：用于标准化地表示的文本信息，文本消息可以是多种字符集和或者多种格式的；<br />
* Multipart：用于连接消息体的多个部分构成一个消息，这些部分可以是不同类型的数据；<br />
* Application：用于传输应用程序数据或者二进制数据；<br />
* Message：用于包装一个E-mail消息；<br />
* Image：用于传输静态图片数据；<br />
* Audio：用于传输音频或者音声数据；<br />
* Video：用于传输动态影像数据，可以是与音频编辑在一起的视频数据格式。</p>
<p>subtype用于指定type的详细形式。content-type/subtype配对的集合和与此相关的参数，将随着时间而增长。为了确保这些值在一个有序而且公开的状态下开发，MIME使用Internet Assigned Numbers Authority (IANA)作为中心的注册机制来管理这些值。常用的subtype值如下所示：</p>
<p>* text/plain（纯文本）<br />
* text/html（HTML文档）<br />
* application/xhtml+xml（XHTML文档）<br />
* image/gif（GIF图像）<br />
* image/jpeg（JPEG图像）<br />
* image/png（PNG图像）<br />
* video/mpeg（MPEG动画）<br />
* application/octet-stream（任意的二进制数据）<br />
* application/pdf（PDF文档）<br />
* application/msword（Microsoft Word文件）<br />
* message/rfc822（RFC 822形式）<br />
* multipart/alternative（HTML邮件的HTML形式和纯文本形式，相同内容使用不同形式表示）<br />
* application/x-www-form-urlencoded（使用HTTP的POST方法提交的表单）<br />
* multipart/form-data（同上，但主要用于表单提交时伴随文件上传的场合）</p>
<p>此外，尚未被接受为正式数据类型的subtype，可以使用x-开始的独立名称（例如application/x-gzip）。vnd-开始的固有名称也可以使用（例：application/vnd.ms-excel）。</p>
<p>parameter可以用来指定附加的信息，更多情况下是用于指定text/plain和text/htm等的文字编码方式的charset参数。 MIME根据type制定了默认的subtype，当客户端不能确定消息的subtype的情况下，消息被看作默认的subtype进行处理。Text默认是text/plain，Application默认是application/octet-stream而Multipart默认情况下被看作 multipart/mixed。<br />
内容传输编码（Content-Transfer-Encoding），这个区域使指定ASCII以外的字符编码方式成为可能。形式如下：</p>
<p>Content-Transfer-Encoding: [mechanism]</p>
<p>其中，mechanism的值可以指定为“7bit”，“8bit”，“binary”，“quoted- printable”，“base64”。</p>
<p>详细的介绍，可以参阅：<a href="http://zh.wikipedia.org/zh-cn/MIME" target="_blank">http://zh.wikipedia.org/zh-cn/MIME</a></p>
<p>你还可以观看本网站内的同类文章：</p>
<ol>
<li> <a href="http://www.javachen.com/2010/01/what-is-kpi/" target="_blank">什么是KPI？</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/01/what-is-mime%ef%bc%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Generic Types</title>
		<link>http://www.javachen.com/2010/01/java-generic-types/</link>
		<comments>http://www.javachen.com/2010/01/java-generic-types/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 08:09:48 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Generic]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=901</guid>
		<description><![CDATA[泛型（Generic Types）是java5.0 的新特性，是JAVA 的又一次革命。 它的特点： JVM 不变，JAVA 和 C++不断的融合， 5.0 里有许多和 C++ 类似。留下的只是思想。 程序员的开发工作越来越简单。 泛型增强了java的类型安全，可以在编译期间对容器内的对象进行类型检查，在运行 期不必进行类型的转换。而在j2se5 之前必须在运行期动态进行容器内对象的检 查及转换，泛型是编译时概念，运行时没有泛型。 泛型减少含糊的容器，可以定义什么类型的数据放入容器。 一个例子： ArrayList aList = new ArrayList(); aList.add(new Integer(1)); // &#8230; Integer myInteger = aList.get(0); 我们可以看到，在这个简单的例子中，我们在定义 aList 的时候指明了它是一个 直接受 Integer 类型的 ArrayList，当我们调用 aList.get(0)时，我们已经不再需要 先显式的将结果转换成 Integer，然后再赋值给 myInteger 了。而这一步在早先的 Java 版本中是必须的。也许你在想，在使用 Collection 时节约一些类型转换就是 Java 泛型的全部吗？远不止。单就这个例子而言，泛型至少还有一个更大的好处， 那就是使用了泛型的容器类变得更加健壮：早先，Collection 接口的 get()和 Iterator [...]]]></description>
			<content:encoded><![CDATA[<p>泛型（Generic Types）是java5.0 的新特性，是JAVA 的又一次革命。</p>
<p>它的特点：<br />
JVM 不变，JAVA 和 C++不断的融合， 5.0 里有许多和 C++  类似。留下的只是思想。 程序员的开发工作越来越简单。<br />
泛型增强了java的类型安全，可以在编译期间对容器内的对象进行类型检查，在运行 期不必进行类型的转换。而在j2se5 之前必须在运行期动态进行容器内对象的检 查及转换，<span style="color: #ff0000;">泛型是编译时概念，运行时没有泛型</span>。<br />
泛型减少含糊的容器，可以定义什么类型的数据放入容器。<span id="more-901"></span><br />
一个例子：<br />
ArrayList aList = new ArrayList();<br />
aList.add(new Integer(1));<br />
// &#8230;<br />
Integer myInteger = aList.get(0);</p>
<p>我们可以看到，在这个简单的例子中，我们在定义 aList 的时候指明了它是一个 直接受 Integer 类型的 ArrayList，当我们调用 aList.get(0)时，我们已经不再需要 先显式的将结果转换成 Integer，然后再赋值给 myInteger 了。而这一步在早先的 Java 版本中是必须的。也许你在想，在使用 Collection 时节约一些类型转换就是 Java 泛型的全部吗？远不止。单就这个例子而言，泛型至少还有一个更大的好处， 那就是使用了泛型的容器类变得更加健壮：早先，Collection 接口的 get()和 Iterator 接口的 next()方法都只能返回 Object 类型的结果，我们可以把这个结果强制转换 成任何 Object  的子类，而不会有任何编译期的错误，但这显然很可能带来严重 的运行期错误，因为在代码中确定从某个 Collection 中取出的是什么类型的对象 完全是调用者自己说了算，而调用者也许并不清楚放进 Collection 的对象具体是 什么类的；就算知道放进去的对象“应该”是什么类，也不能保证放到 Collection的对象就一定是那个类的实例。现在有了泛型，只要我们定义的时候指明该Collection 接受哪种类型的对象，编译器可以帮我们避免类似的问题溜到产品中。</p>
<p><strong>声明及实例化泛型类：</strong><br />
HashMap hm = new HashMap(); 编译类型的泛型和运行时类型的泛型一定要一致。没有多态。 不能使用原始类型<br />
GenList nList = new GenList(); //编译错误<br />
J2SE 5.0 目前不支持原始类型作为类型参数(type parameter)<br />
<strong>定义泛型接口：</strong><br />
public interface GenInterface {<br />
void func(T t);<br />
}<br />
<strong>定义泛型类</strong>：<br />
public class ArrayList { &#8230; }<br />
public class GenMap { &#8230; }</p>
<p><strong><span style="color: #ff00ff;">类的静态方法不能使用泛型，因为泛型类是在创建对象的时候产生的。</span></strong></p>
<p><strong>泛型通配符</strong><br />
List&lt;? extends Object&gt; 往下匹配<br />
List&lt;? super Number&gt; 往下上匹配</p>
<p><span style="color: #ff0000;"><strong>泛型的一些局限性</strong></span><br />
<strong>不能实例化泛型</strong><br />
T t = new T(); //error<br />
<strong>不能实例化泛型类型的数组</strong><br />
T[] ts= new T[10];	//编译错误 不能实例化泛型参数数<br />
Pair[] table = new Pair(10); // ERROR<br />
<strong>类的静态变量不能声明为类型参数类型</strong><br />
public class GenClass {<br />
private static T t;	//编译错误</p>
<p>}<br />
<strong>泛型类不能继承自 Throwable 以及其子类</strong><br />
public GenExpection extends Exception{}	//编译错误 不能用于基础类型 int 等<br />
Pair //error<br />
<strong>不同泛型间不能相互赋值，没有多态</strong><strong><br />
泛型类型不可以被“重载”；也就是说，和普通类型一样在一个作用域内，泛型类型必须被唯一地命名。<br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/01/java-generic-types/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java StringUtil</title>
		<link>http://www.javachen.com/2010/01/java-stringutil/</link>
		<comments>http://www.javachen.com/2010/01/java-stringutil/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 05:40:30 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[String]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=892</guid>
		<description><![CDATA[关于字符串的一些常用工具方法： package com.javachen.util.string; &#160; import java.util.regex.Pattern; &#160; /** * * @author javachen * @date 2010.1.26 */ public class StringUtil &#123; public static String escape&#40;String src&#41; &#123; int i; char j; StringBuffer tmp = new StringBuffer&#40;&#41;; tmp.ensureCapacity&#40;src.length&#40;&#41; * 6&#41;; for &#40;i = 0; i &#38;lt; src.length&#40;&#41;; i++&#41; &#123; j = src.charAt&#40;i&#41;; if &#40;Character.isDigit&#40;j&#41; &#124;&#124; Character.isLowerCase&#40;j&#41; &#124;&#124; [...]]]></description>
			<content:encoded><![CDATA[<p>关于字符串的一些常用工具方法：<br />
<span id="more-892"></span></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.javachen.util.string</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.regex.Pattern</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 *
 * @author javachen
 * @date 2010.1.26
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> StringUtil <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> escape<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> src<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">char</span> j<span style="color: #339933;">;</span>
		<span style="color: #003399;">StringBuffer</span> tmp <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringBuffer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		tmp.<span style="color: #006633;">ensureCapacity</span><span style="color: #009900;">&#40;</span>src.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> src.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			j <span style="color: #339933;">=</span> src.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Character</span>.<span style="color: #006633;">isDigit</span><span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #003399;">Character</span>.<span style="color: #006633;">isLowerCase</span><span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span>
					<span style="color: #339933;">||</span> <span style="color: #003399;">Character</span>.<span style="color: #006633;">isUpperCase</span><span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">256</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span>
					tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;0&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span>j, <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
				tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%u&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Integer</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span>j, <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> tmp.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> unescape<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> src<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">StringBuffer</span> tmp <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringBuffer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		tmp.<span style="color: #006633;">ensureCapacity</span><span style="color: #009900;">&#40;</span>src.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> lastPos <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span>, pos <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">char</span> ch<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>lastPos <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> src.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			pos <span style="color: #339933;">=</span> src.<span style="color: #006633;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%&quot;</span>, lastPos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">==</span> lastPos<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>src.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'u'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					ch <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#41;</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>src
							.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span>, pos <span style="color: #339933;">+</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>ch<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					lastPos <span style="color: #339933;">=</span> pos <span style="color: #339933;">+</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
					ch <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#41;</span> <span style="color: #003399;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>src
							.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span>, pos <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span>, <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>ch<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					lastPos <span style="color: #339933;">=</span> pos <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>pos <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>src.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span>lastPos<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					lastPos <span style="color: #339933;">=</span> src.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
					tmp.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>src.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span>lastPos, pos<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					lastPos <span style="color: #339933;">=</span> pos<span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> tmp.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 将字符串 source 中的 oldStr 替换为 newStr, 并以大小写敏感方式进行查找
	 *
	 * @param source
	 *            需要替换的源字符串
	 * @param oldStr
	 *            需要被替换的老字符串
	 * @param newStr
	 *            替换为的新字符串
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> replace<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> source, <span style="color: #003399;">String</span> oldStr, <span style="color: #003399;">String</span> newStr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> replace<span style="color: #009900;">&#40;</span>source, oldStr, newStr, <span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 将字符串 source 中的 oldStr 替换为 newStr, matchCase 为是否设置大小写敏感查找
	 *
	 * @param source
	 *            需要替换的源字符串
	 * @param oldStr
	 *            需要被替换的老字符串
	 * @param newStr
	 *            替换为的新字符串
	 * @param matchCase
	 *            是否需要按照大小写敏感方式查找
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> replace<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> source, <span style="color: #003399;">String</span> oldStr, <span style="color: #003399;">String</span> newStr,
			<span style="color: #000066; font-weight: bold;">boolean</span> matchCase<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>source <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #666666; font-style: italic;">// 首先检查旧字符串是否存在, 不存在就不进行替换</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>source.<span style="color: #006633;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">indexOf</span><span style="color: #009900;">&#40;</span>oldStr.<span style="color: #006633;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> source<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">int</span> findStartPos <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> a <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">int</span> b <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">String</span> str1, str2, str3, str4, strA, strB<span style="color: #339933;">;</span>
			str1 <span style="color: #339933;">=</span> source<span style="color: #339933;">;</span>
			str2 <span style="color: #339933;">=</span> str1.<span style="color: #006633;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			str3 <span style="color: #339933;">=</span> oldStr<span style="color: #339933;">;</span>
			str4 <span style="color: #339933;">=</span> str3.<span style="color: #006633;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>matchCase<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				strA <span style="color: #339933;">=</span> str1<span style="color: #339933;">;</span>
				strB <span style="color: #339933;">=</span> str3<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
				strA <span style="color: #339933;">=</span> str2<span style="color: #339933;">;</span>
				strB <span style="color: #339933;">=</span> str4<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			a <span style="color: #339933;">=</span> strA.<span style="color: #006633;">indexOf</span><span style="color: #009900;">&#40;</span>strB, findStartPos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				b <span style="color: #339933;">=</span> oldStr.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				findStartPos <span style="color: #339933;">=</span> a <span style="color: #339933;">+</span> b<span style="color: #339933;">;</span>
				<span style="color: #003399;">StringBuffer</span> bbuf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringBuffer</span><span style="color: #009900;">&#40;</span>source<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				source <span style="color: #339933;">=</span> bbuf.<span style="color: #006633;">replace</span><span style="color: #009900;">&#40;</span>a, a <span style="color: #339933;">+</span> b, newStr<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
				<span style="color: #666666; font-style: italic;">// 新的查找开始点位于替换后的字符串的结尾</span>
				findStartPos <span style="color: #339933;">=</span> findStartPos <span style="color: #339933;">+</span> newStr.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> b<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> source<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 清除字符串结尾的空格.
	 *
	 * @param input
	 *            String 输入的字符串
	 * @return 转换结果
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> trimTailSpaces<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isEmpty<span style="color: #009900;">&#40;</span>input<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #003399;">String</span> trimedString <span style="color: #339933;">=</span> input.<span style="color: #006633;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>trimedString.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> input.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> input<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> input.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, input.<span style="color: #006633;">indexOf</span><span style="color: #009900;">&#40;</span>trimedString<span style="color: #009900;">&#41;</span>
				<span style="color: #339933;">+</span> trimedString.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Change the null string value to &quot;&quot;, if not null, then return it self, use
	 * this to avoid display a null string to &quot;null&quot;.
	 *
	 * @param input
	 *            the string to clear
	 * @return the result
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> clearNull<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> isEmpty<span style="color: #009900;">&#40;</span>input<span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #339933;">:</span> input<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Return the limited length string of the input string (added at:April 10,
	 * 2004).
	 *
	 * @param input
	 *            String
	 * @param maxLength
	 *            int
	 * @return String processed result
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> limitStringLength<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input, <span style="color: #000066; font-weight: bold;">int</span> maxLength<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isEmpty<span style="color: #009900;">&#40;</span>input<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>input.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #339933;">=</span> maxLength<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> input<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> input.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, maxLength <span style="color: #339933;">-</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;...&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 判断字符串是否全是数字字符.
	 *
	 * @param input
	 *            输入的字符串
	 * @return 判断结果, true 为全数字, false 为还有非数字字符
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isNumeric<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isEmpty<span style="color: #009900;">&#40;</span>input<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> input.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">char</span> charAt <span style="color: #339933;">=</span> input.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #003399;">Character</span>.<span style="color: #006633;">isDigit</span><span style="color: #009900;">&#40;</span>charAt<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 转换由表单读取的数据的内码(从 ISO8859 转换到 gb2312).
	 *
	 * @param input
	 *            输入的字符串
	 * @return 转换结果, 如果有错误发生, 则返回原来的值
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> ISO2GBK<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes <span style="color: #339933;">=</span> input.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ISO8859-1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>bytes, <span style="color: #0000ff;">&quot;GBK&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> input<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 转换由表单读取的数据的内码到 ISO(从 GBK 转换到ISO8859-1).
	 *
	 * @param input
	 *            输入的字符串
	 * @return 转换结果, 如果有错误发生, 则返回原来的值
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> GBK2ISO<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> changeEncoding<span style="color: #009900;">&#40;</span>input, <span style="color: #0000ff;">&quot;GBK&quot;</span>, <span style="color: #0000ff;">&quot;ISO8859-1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 转换字符串的内码.
	 *
	 * @param input
	 *            输入的字符串
	 * @param sourceEncoding
	 *            源字符集名称
	 * @param targetEncoding
	 *            目标字符集名称
	 * @return 转换结果, 如果有错误发生, 则返回原来的值
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> changeEncoding<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input, <span style="color: #003399;">String</span> sourceEncoding,
			<span style="color: #003399;">String</span> targetEncoding<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>input <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">||</span> input.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> input<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes <span style="color: #339933;">=</span> input.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span>sourceEncoding<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>bytes, targetEncoding<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> input<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 将单个的 ' 换成 ''; SQL 规则:如果单引号中的字符串包含一个嵌入的引号,可以使用两个单引号表示嵌入的单引号.
	 */</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> replaceSql<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> replace<span style="color: #009900;">&#40;</span>input, <span style="color: #0000ff;">&quot;'&quot;</span>, <span style="color: #0000ff;">&quot;''&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 对给定字符进行 URL 编码
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> encode<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isEmpty<span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			value <span style="color: #339933;">=</span> java.<span style="color: #006633;">net</span>.<span style="color: #003399;">URLEncoder</span>.<span style="color: #006633;">encode</span><span style="color: #009900;">&#40;</span>value, <span style="color: #0000ff;">&quot;GB2312&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			ex.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> value<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 对给定字符进行 URL 解码
	 *
	 * @param value
	 *            解码前的字符串
	 * @return 解码后的字符串
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> decode<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isEmpty<span style="color: #009900;">&#40;</span>value<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> java.<span style="color: #006633;">net</span>.<span style="color: #003399;">URLDecoder</span>.<span style="color: #006633;">decode</span><span style="color: #009900;">&#40;</span>value, <span style="color: #0000ff;">&quot;GB2312&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			ex.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> value<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 判断字符串是否未空, 如果为 null 或者长度为0, 均返回 true.
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isEmpty<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>input <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">||</span> input.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 获得输入字符串的字节长度(即二进制字节数), 用于发送短信时判断是否超出长度.
	 *
	 * @param input
	 *            输入字符串
	 * @return 字符串的字节长度(不是 Unicode 长度)
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> getBytesLength<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>input <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span> bytesLength <span style="color: #339933;">=</span> input.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">length</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> bytesLength<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 检验字符串是否未空, 如果是, 则返回给定的出错信息.
	 *
	 * @param input
	 *            输入的字符串
	 * @param errorMsg
	 *            出错信息
	 * @return 空串返回出错信息
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> isEmpty<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> input, <span style="color: #003399;">String</span> errorMsg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isEmpty<span style="color: #009900;">&#40;</span>input<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> errorMsg<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 判断是否为质数
	 *
	 * @param x
	 * @return
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isPrime<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> x<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">==</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">||</span> x <span style="color: #339933;">==</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">||</span> x <span style="color: #339933;">==</span> <span style="color: #cc66cc;">5</span> <span style="color: #339933;">||</span> x <span style="color: #339933;">==</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">int</span> c <span style="color: #339933;">=</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> <span style="color: #cc66cc;">5</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> end <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #003399;">Math</span>.<span style="color: #006633;">sqrt</span><span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>c <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span> end<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> c <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			c <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> c <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			c <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> c <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			c <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> c <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			c <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> c <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			c <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> c <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			c <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> c <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			c <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">%</span> c <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			c <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 返回指定字节长度的字符串
	 *
	 * @param str
	 *            String 字符串
	 * @param length
	 *            int 指定长度
	 * @return String 返回的字符串
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> toLength<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> str, <span style="color: #000066; font-weight: bold;">int</span> length<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>str <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>length <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>str.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;GBK&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">length</span> <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span> length<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> str<span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #003399;">StringBuffer</span> buff <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringBuffer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span> index <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">char</span> c<span style="color: #339933;">;</span>
		length <span style="color: #339933;">-=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>length <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			c <span style="color: #339933;">=</span> str.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span>index<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>c <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				length<span style="color: #339933;">--;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
				length<span style="color: #339933;">--;</span>
				length<span style="color: #339933;">--;</span>
			<span style="color: #009900;">&#125;</span>
			buff.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			index<span style="color: #339933;">++;</span>
		<span style="color: #009900;">&#125;</span>
		buff.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> buff.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 判断是否为整数
	 *
	 * @param str
	 *            传入的字符串
	 * @return 是整数返回true,否则返回false
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isInteger<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> str<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Pattern pattern <span style="color: #339933;">=</span> Pattern.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;^[-<span style="color: #000099; font-weight: bold;">\\</span>+]?[<span style="color: #000099; font-weight: bold;">\\</span>d]*$&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> pattern.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">matches</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 判断是否为浮点数，包括double和float
	 *
	 * @param str
	 *            传入的字符串
	 * @return 是浮点数返回true,否则返回false
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isDouble<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> str<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Pattern pattern <span style="color: #339933;">=</span> Pattern.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;^[-<span style="color: #000099; font-weight: bold;">\\</span>+]?[.<span style="color: #000099; font-weight: bold;">\\</span>d]*$&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> pattern.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">matches</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 判断输入的字符串是否符合Email样式.
	 *
	 * @param str
	 *            传入的字符串
	 * @return 是Email样式返回true,否则返回false
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isEmail<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> str<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Pattern pattern <span style="color: #339933;">=</span> Pattern
				.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;^<span style="color: #000099; font-weight: bold;">\\</span>w+([-+.]<span style="color: #000099; font-weight: bold;">\\</span>w+)*@<span style="color: #000099; font-weight: bold;">\\</span>w+([-.]<span style="color: #000099; font-weight: bold;">\\</span>w+)*<span style="color: #000099; font-weight: bold;">\\</span>.<span style="color: #000099; font-weight: bold;">\\</span>w+([-.]<span style="color: #000099; font-weight: bold;">\\</span>w+)*$&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> pattern.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">matches</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 判断输入的字符串是否为纯汉字
	 *
	 * @param str
	 *            传入的字符窜
	 * @return 如果是纯汉字返回true,否则返回false
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isChinese<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> str<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Pattern pattern <span style="color: #339933;">=</span> Pattern.<span style="color: #006633;">compile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;[<span style="color: #000099; font-weight: bold;">\u</span>0391-<span style="color: #000099; font-weight: bold;">\u</span>FFE5]+$&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> pattern.<span style="color: #006633;">matcher</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">matches</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Big5字与Unicode的互换:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> big5ToUnicode<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>s.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ISO8859_1&quot;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&quot;Big5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">UnsupportedEncodingException</span> uee<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> s<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> UnicodeTobig5<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span>s.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Big5&quot;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&quot;ISO8859_1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">UnsupportedEncodingException</span> uee<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> s<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> toHexString<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> s<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">String</span> str<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i</pre></div></div>

<p>转译特殊符号标签:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> filter<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> value<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>value <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">||</span> value.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
                <span style="color: #000000; font-weight: bold;">return</span> value<span style="color: #339933;">;</span>
            <span style="color: #003399;">StringBuffer</span> result <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">String</span> filtered <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> value.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                filtered <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">switch</span><span style="color: #009900;">&#40;</span>value.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">60</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// '&amp;lt;'</span>
                    filtered <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&amp;lt;&quot;</span><span style="color: #339933;">;</span>
                    <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">62</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// '&amp;gt;'</span>
                    filtered <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&amp;gt;&quot;</span><span style="color: #339933;">;</span>
                    <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">38</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// '&amp;amp;'</span>
                    filtered <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&amp;amp;&quot;</span><span style="color: #339933;">;</span>
                    <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #cc66cc;">34</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">// '&quot;'</span>
                    filtered <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #0000ff;">&quot;;
                    break;
&nbsp;
                case 39: // '<span style="color: #000099; font-weight: bold;">\'</span>'
                    filtered = &quot;</span><span style="color: #0000ff;">'&quot;;
                    break;
                }
                if(result == null)
                {
                    if(filtered != null)
                    {
                        result = new StringBuffer(value.length() + 50);
                        if(i &amp;gt; 0)
                            result.append(value.substring(0, i));
                        result.append(filtered);
                    }
                } else
                if(filtered == null)
                    result.append(value.charAt(i));
                else
                    result.append(filtered);
            }
&nbsp;
            return result != null ? result.toString() : value;
        }</span></pre></div></div>

<p>判断字符是否属于中文 :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//  GENERAL_PUNCTUATION 判断中文的“号</span>
 <span style="color: #666666; font-style: italic;">//  CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号</span>
 <span style="color: #666666; font-style: italic;">//  HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的，号</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isChinese<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">char</span> c<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003399;">Character.<span style="color: #006633;">UnicodeBlock</span></span> ub <span style="color: #339933;">=</span> <span style="color: #003399;">Character.<span style="color: #006633;">UnicodeBlock</span></span>.<span style="color: #006633;">of</span><span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ub <span style="color: #339933;">==</span> <span style="color: #003399;">Character.<span style="color: #006633;">UnicodeBlock</span></span>.<span style="color: #006633;">CJK_UNIFIED_IDEOGRAPHS</span>
        <span style="color: #339933;">||</span> ub <span style="color: #339933;">==</span> <span style="color: #003399;">Character.<span style="color: #006633;">UnicodeBlock</span></span>.<span style="color: #006633;">CJK_COMPATIBILITY_IDEOGRAPHS</span>
        <span style="color: #339933;">||</span> ub <span style="color: #339933;">==</span> <span style="color: #003399;">Character.<span style="color: #006633;">UnicodeBlock</span></span>.<span style="color: #006633;">CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A</span>
        <span style="color: #339933;">||</span> ub <span style="color: #339933;">==</span> <span style="color: #003399;">Character.<span style="color: #006633;">UnicodeBlock</span></span>.<span style="color: #006633;">GENERAL_PUNCTUATION</span>
        <span style="color: #339933;">||</span> ub <span style="color: #339933;">==</span> <span style="color: #003399;">Character.<span style="color: #006633;">UnicodeBlock</span></span>.<span style="color: #006633;">CJK_SYMBOLS_AND_PUNCTUATION</span>
        <span style="color: #339933;">||</span> ub <span style="color: #339933;">==</span> <span style="color: #003399;">Character.<span style="color: #006633;">UnicodeBlock</span></span>.<span style="color: #006633;">HALFWIDTH_AND_FULLWIDTH_FORMS</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> isChinese<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> strName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> ch <span style="color: #339933;">=</span> strName.<span style="color: #006633;">toCharArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> ch.<span style="color: #006633;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">char</span> c <span style="color: #339933;">=</span> ch<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>isChinese<span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>isChinese<span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
     <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>isChinese<span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span></pre></div></div>

<p>人民币转成大写 :</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * 人民币转成大写
     *
     * @param value
     * @return String
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399;">String</span> hangeToBig<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span> value<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> hunit <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">'拾'</span>, <span style="color: #0000ff;">'佰'</span>, <span style="color: #0000ff;">'仟'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 段内位置表示</span>
        <span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> vunit <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">'万'</span>, <span style="color: #0000ff;">'亿'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 段名表示</span>
        <span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> digit <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">'零'</span>, <span style="color: #0000ff;">'壹'</span>, <span style="color: #0000ff;">'贰'</span>, <span style="color: #0000ff;">'叁'</span>, <span style="color: #0000ff;">'肆'</span>, <span style="color: #0000ff;">'伍'</span>, <span style="color: #0000ff;">'陆'</span>, <span style="color: #0000ff;">'柒'</span>, <span style="color: #0000ff;">'捌'</span>, <span style="color: #0000ff;">'玖'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 数字表示</span>
        <span style="color: #000066; font-weight: bold;">long</span> midVal <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">long</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span>value <span style="color: #339933;">*</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 转化成整形</span>
        <span style="color: #003399;">String</span> valStr <span style="color: #339933;">=</span> <span style="color: #003399;">String</span>.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>midVal<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 转化成字符串</span>
&nbsp;
        <span style="color: #003399;">String</span> head <span style="color: #339933;">=</span> valStr.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, valStr.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 取整数部分</span>
        <span style="color: #003399;">String</span> rail <span style="color: #339933;">=</span> valStr.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span>valStr.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 取小数部分</span>
&nbsp;
        <span style="color: #003399;">String</span> prefix <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 整数部分转化的结果</span>
        <span style="color: #003399;">String</span> suffix <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 小数部分转化的结果</span>
        <span style="color: #666666; font-style: italic;">// 处理小数点后面的数</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>rail.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;00&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// 如果小数部分为0</span>
            suffix <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;整&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">else</span>
        <span style="color: #009900;">&#123;</span>
            suffix <span style="color: #339933;">=</span> digit<span style="color: #009900;">&#91;</span>rail.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;角&quot;</span> <span style="color: #339933;">+</span> digit<span style="color: #009900;">&#91;</span>rail.<span style="color: #006633;">charAt</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;分&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 否则把角分转化出来</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// 处理小数点前面的数</span>
        <span style="color: #000066; font-weight: bold;">char</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> chDig <span style="color: #339933;">=</span> head.<span style="color: #006633;">toCharArray</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 把整数部分转化成字符数组</span>
        <span style="color: #000066; font-weight: bold;">char</span> zero <span style="color: #339933;">=</span> <span style="color: #0000ff;">'0'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 标志'0'表示出现过0</span>
        <span style="color: #000066; font-weight: bold;">byte</span> zeroSerNum <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 连续出现0的次数</span>
        <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> chDig.<span style="color: #006633;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// 循环处理每个数字</span>
            <span style="color: #000066; font-weight: bold;">int</span> idx <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>chDig.<span style="color: #006633;">length</span> <span style="color: #339933;">-</span> i <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 取段内位置</span>
            <span style="color: #000066; font-weight: bold;">int</span> vidx <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>chDig.<span style="color: #006633;">length</span> <span style="color: #339933;">-</span> i <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 取段位置</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>chDig<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// 如果当前字符是0</span>
                zeroSerNum<span style="color: #339933;">++;</span> <span style="color: #666666; font-style: italic;">// 连续0次数递增</span>
                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>zero <span style="color: #339933;">==</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// 标志</span>
                    zero <span style="color: #339933;">=</span> digit<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idx <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> vidx <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> zeroSerNum <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    prefix <span style="color: #339933;">+=</span> vunit<span style="color: #009900;">&#91;</span>vidx <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                    zero <span style="color: #339933;">=</span> <span style="color: #0000ff;">'0'</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            zeroSerNum <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 连续0次数清零</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>zero <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// 如果标志不为0,则加上,例如万,亿什么的</span>
                prefix <span style="color: #339933;">+=</span> zero<span style="color: #339933;">;</span>
                zero <span style="color: #339933;">=</span> <span style="color: #0000ff;">'0'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            prefix <span style="color: #339933;">+=</span> digit<span style="color: #009900;">&#91;</span>chDig<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 转化该数字表示</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idx <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
                prefix <span style="color: #339933;">+=</span> hunit<span style="color: #009900;">&#91;</span>idx <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>idx <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> vidx <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                prefix <span style="color: #339933;">+=</span> vunit<span style="color: #009900;">&#91;</span>vidx <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 段结束位置应该加上段名如万,亿</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>prefix.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
            prefix <span style="color: #339933;">+=</span> <span style="color: #0000ff;">'圆'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 如果整数部分存在,则有圆的字样</span>
        <span style="color: #000000; font-weight: bold;">return</span> prefix <span style="color: #339933;">+</span> suffix<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 返回正确表示</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/01/java-stringutil/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>java 读取图片的 Exif 数据</title>
		<link>http://www.javachen.com/2010/01/java-read-picture-exif-data/</link>
		<comments>http://www.javachen.com/2010/01/java-read-picture-exif-data/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 07:00:22 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Image]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=842</guid>
		<description><![CDATA[首先了解什么是 EXIF Exif是英文Exchangeable Image File(可交换图像文件)的缩写，最初由日本电子工业发展协会(JEIDA &#8211;Japan Electronic Industry Development Association) 制订，目前的最新版本是发表于2002年04月的2.21 版。 Exif 文件实际是JPEG文件的一种，遵从JPEG标准，只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看或修改Exif文件，但，打开时可能看不到Exif信息，一旦修改，Exif信息可能丢失。简单来说，EXIF 信息就是由数码相机在拍摄过程中采集一系列的信息，然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部，也就是说 EXIF 信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数，主要包括摄影时的光圈、快门、ISO、时间等各种与当时摄影条件相关的讯息，相机品牌型号，色彩编码，拍摄时录制的声音以及全球定位系统（GPS）等信息。简单的说，它就好像是傻瓜相机的日期打印功能一样，只不过 EXIF 信息所记录的资讯更为详尽和完备。 Exif 文件包含的信息 Image Description 图像描述、来源. 指生成图像的工具 Artist作者 有些相机可以输入使用者的名字 Make 生产者 指产品生产厂家 Model 型号 指设备型号 Orientation方向 有的相机支持，有的不支持 XResolution/YResolution X/Y方向分辨率 本栏目已有专门条目解释此问题。 ResolutionUnit分辨率单位 一般为PPI Software软件 显示固件Firmware版本 DateTime日期和时间 YCbCrPositioning 色相定位 ExifOffsetExif信息位置，定义Exif在信息在文件中的写入，有些软件不显示。 ExposureTime 曝光时间 即快门速度 FNumber光圈系数 ExposureProgram曝光程序 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;"><strong>首先了解什么是 EXIF</strong></span></p>
<p>Exif是英文Exchangeable Image File(可交换图像文件)的缩写，最初由日本电子工业发展协会(JEIDA &#8211;Japan Electronic</p>
<p>Industry Development Association) 制订，目前的最新版本是发表于2002年04月的2.21 版。<br />
Exif 文件实际是JPEG文件的一种，遵从JPEG标准，只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看或修改Exif文件，但，打开时可能看不到Exif信息，一旦修改，Exif信息可能丢失。简单来说，EXIF 信息就是由数码相机在拍摄过程中采集一系列的信息，然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部，也就是说 EXIF 信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数，主要包括摄影时的光圈、快门、ISO、时间等各种与当时摄影条件相关的讯息，相机品牌型号，色彩编码，拍摄时录制的声音以及全球定位系统（GPS）等信息。简单的说，它就好像是傻瓜相机的日期打印功能一样，只不过 EXIF 信息所记录的资讯更为详尽和完备。<span id="more-842"></span></p>
<p><span style="color: #0000ff;"><strong>Exif 文件包含的信息</strong></span></p>
<p>Image Description 图像描述、来源. 指生成图像的工具<br />
Artist作者 有些相机可以输入使用者的名字<br />
Make 生产者 指产品生产厂家<br />
Model 型号 指设备型号<br />
Orientation方向 有的相机支持，有的不支持<br />
XResolution/YResolution X/Y方向分辨率 本栏目已有专门条目解释此问题。<br />
ResolutionUnit分辨率单位 一般为PPI<br />
Software软件 显示固件Firmware版本<br />
DateTime日期和时间<br />
YCbCrPositioning 色相定位<br />
ExifOffsetExif信息位置，定义Exif在信息在文件中的写入，有些软件不显示。<br />
ExposureTime 曝光时间 即快门速度<br />
FNumber光圈系数<br />
ExposureProgram曝光程序 指程序式自动曝光的设置，各相机不同,可能是Sutter Priority（快门优先）、Aperture Priority（快门优先）等等。<br />
ISO speed ratings感光度<br />
ExifVersionExif版本<br />
DateTimeOriginal创建时间<br />
DateTimeDigitized数字化时间<br />
ComponentsConfiguration图像构造（多指色彩组合方案）<br />
CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度<br />
ExposureBiasValue曝光补偿。<br />
MaxApertureValue最大光圈<br />
MeteringMode测光方式， 平均式测光、中央重点测光、点测光等。<br />
Lightsource光源 指白平衡设置<br />
Flash是否使用闪光灯。<br />
FocalLength焦距，一般显示镜头物理焦距，有些软件可以定义一个系数，从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录<br />
FlashPixVersionFlashPix版本 （个别机型支持）<br />
ColorSpace色域、色彩空间<br />
ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数<br />
ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数<br />
Interoperability IFD通用性扩展项定义指针 和TIFF文件相关，具体含义不详<br />
FileSource源文件 Compression压缩比。</p>
<p><span style="color: #0000ff;"><strong>java 读取图片的 Exif 数据代码 </strong></span><br />
<span style="color: #000000;">package</span> <span style="color: #000000;">image</span><span style="color: #000000;">.</span><span style="color: #ff0000;">read</span>;<br />
<span style="color: #000000;">import</span> <span style="color: #000000;">com.drew.metadata.*</span>;<br />
<span style="color: #000000;">import</span> <span style="color: #000000;">com.drew.metadata.exif.*</span>;<br />
<span style="color: #000000;">import</span> <span style="color: #000000;">com.drew.imaging.jpeg.JpegProcessingException</span>;<br />
<span style="color: #000000;">import</span> <span style="color: #000000;">java.io.*</span>;<br />
<span style="color: #000000;">import</span> <span style="color: #000000;">java.util.Iterator</span>;</p>
<p><span style="color: #000080; font-weight: bold;">public</span> <span style="color: #000080; font-weight: bold;">class</span> <span style="color: #000000;">EXIFReader</span> <span style="color: #000000;">{</span></p>
<p><span style="color: #000080; font-weight: bold;">public</span> <span style="color: #000080; font-weight: bold;">static</span> <span style="color: #000080; font-weight: bold;">void</span> <span style="color: #000000;">main</span>(<span style="color: #000000;">String</span> <span style="color: #000000;">args</span><span style="color: #000000;">[])</span> <span style="color: #000080; font-weight: bold;">throws</span> <span style="color: #000000;">FileNotFoundException</span> <span style="color: #000000;">{</span><br />
<span style="color: #000000;">File</span> <span style="color: #000000;">f</span> <span style="color: #000000;">=</span> <span style="color: #000080; font-weight: bold;">new</span> <span style="color: #000000;">File</span>(<span style="color: #0000ff;">&#8220;c:\\b.jpg&#8221;</span>);<br />
<span style="color: #000080; font-weight: bold;">try</span> <span style="color: #000000;">{</span><br />
<span style="color: #000000;">ExifReader</span> <span style="color: #000000;">er</span> <span style="color: #000000;">=</span> <span style="color: #000080; font-weight: bold;">new</span> <span style="color: #000000;">ExifReader</span>(<span style="color: #000000;">f</span>);<br />
<span style="color: #000000;">Metadata</span> <span style="color: #000000;">exif</span> <span style="color: #000000;">=</span> <span style="color: #000000;">er</span><span style="color: #000000;">.</span><span style="color: #ff0000;">extract</span>();<br />
<span style="color: #000000;">Iterator</span> <span style="color: #000000;">itr</span> <span style="color: #000000;">=</span> <span style="color: #000000;">exif</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getDirectoryIterator</span>();<br />
<span style="color: #000080; font-weight: bold;">while</span> (<span style="color: #000000;">itr</span><span style="color: #000000;">.</span><span style="color: #ff0000;">hasNext</span>()) <span style="color: #000000;">{</span><br />
<span style="color: #000000;">Directory</span> <span style="color: #000000;">directory</span> <span style="color: #000000;">=</span> (<span style="color: #000000;">Directory</span>) <span style="color: #000000;">itr</span><span style="color: #000000;">.</span><span style="color: #ff0000;">next</span>();</p>
<p><span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;EXIF版本：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_EXIF_VERSION</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;相机品牌：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_MAKE</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;相机型号：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_MODEL</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;光 圈 值：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_FNUMBER</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;快    門：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_EXPOSURE_TIME</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;感 光 度：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_ISO_EQUIVALENT</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;软    件：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_SOFTWARE</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;原始拍摄时间：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_DATETIME_ORIGINAL</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;数字化时间：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_DATETIME_DIGITIZED</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;方    向：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_ORIENTATION</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;图片宽度：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_EXIF_IMAGE_WIDTH</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;图片高度：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_EXIF_IMAGE_HEIGHT</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;水平分辨率：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_X_RESOLUTION</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;垂直分辨率：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_Y_RESOLUTION</span>));<br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">out</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;垂直分辨率：&#8221;</span><span style="color: #000000;">+</span> <span style="color: #000000;">directory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">getString</span>(<span style="color: #000000;">ExifDirectory</span><span style="color: #000000;">.</span><span style="color: #ff0000;">TAG_EXPOSURE_BIAS</span>));<br />
<span style="color: #000080; font-weight: bold;">break</span>;</p>
<p><span style="color: #008800; font-style: italic;">// 获得全部metadata</span><br />
<span style="color: #008800; font-style: italic;">/*</span><br />
<span style="color: #008800; font-style: italic;">* Iterator tags = directory.getTagIterator(); while</span><br />
<span style="color: #008800; font-style: italic;">* (tags.hasNext()) { Tag tag = (Tag) tags.next();</span><br />
<span style="color: #008800; font-style: italic;">* System.out.println(tag); } if (directory.hasErrors()) {</span><br />
<span style="color: #008800; font-style: italic;">* Iterator errors = directory.getErrors(); while</span><br />
<span style="color: #008800; font-style: italic;">* (errors.hasNext()) { System.out.println(&#8220;ERROR:   &#8221; +</span><br />
<span style="color: #008800; font-style: italic;">* errors.next()); } }</span><br />
<span style="color: #008800; font-style: italic;">*/</span><br />
<span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span> <span style="color: #000080; font-weight: bold;">catch</span> (<span style="color: #000000;">JpegProcessingException</span> <span style="color: #000000;">e</span>) <span style="color: #000000;">{</span><br />
<span style="color: #000000;">System</span><span style="color: #000000;">.</span><span style="color: #ff0000;">err</span><span style="color: #000000;">.</span><span style="color: #ff0000;">println</span>(<span style="color: #0000ff;">&#8220;not   jpeg   file&#8221;</span>);<br />
<span style="color: #000000;">}</span><br />
<span style="color: #000000;">}</span></p>
<p><span style="color: #000000;">}</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2010/01/java-read-picture-exif-data/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>java中关于时间日期操作的常用函数</title>
		<link>http://www.javachen.com/2009/12/java-date-operation-function/</link>
		<comments>http://www.javachen.com/2009/12/java-date-operation-function/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 08:15:42 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Date]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=749</guid>
		<description><![CDATA[JAVA中日期格式化 分类:java 基础时间格式化 一、JAVA中日期的获取、设置和格式化 1）JAVA提供了3个日期类：Date、Calendar和DateFormat。 Date()方法主要用于创建日期对象并获取日期； Calendar()方法主要用于获取和设置日期； DateFormat()方法主要用于创建日期格式化器，然后再由格式化器将日期转换为各种日期格式串输出。 2）JAVA语言规定的基准日期为格林尼治标准时间1970.1.1.00:00:00，当前日期是由基准日期开始所经历的毫秒数转换出来的。 3）DateFomat类在java.text包中，Date和Calendar类在java.util包中。 4）实例如下： import java.util.*; import java.text.*; public class DisplayDate { public static void main(String[] args){ Date today; Calendar now; DateFormat f1,f2; String s1,s2; System.out.println(&#8220;\n显示Date类的相关用法&#8221;); today = new Date(); System.out.println(&#8220;new Date()= \t&#8221;+ today); System.out.println(&#8220;\n用DateFormat类显示各种日期格式&#8221;); //显示各种日期格式 f1 = DateFormat.getDateInstance(); s1 = f1.format(today); System.out.println(&#8220;DateFormat.getDateInstance()= \t&#8221;+s1); f1 = DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA); s1 [...]]]></description>
			<content:encoded><![CDATA[<p>JAVA中日期格式化 分类:java 基础时间格式化<br />
一、JAVA中日期的获取、设置和格式化<br />
1）JAVA提供了3个日期类：Date、Calendar和DateFormat。<br />
Date()方法主要用于创建日期对象并获取日期；<br />
Calendar()方法主要用于获取和设置日期；<br />
DateFormat()方法主要用于创建日期格式化器，然后再由格式化器将日期转换为各种日期格式串输出。<span id="more-749"></span><br />
2）JAVA语言规定的基准日期为格林尼治标准时间1970.1.1.00:00:00，当前日期是由基准日期开始所经历的毫秒数转换出来的。<br />
3）DateFomat类在java.text包中，Date和Calendar类在java.util包中。<br />
4）实例如下：<br />
import java.util.*;<br />
import java.text.*;</p>
<p>public class DisplayDate {<br />
public static void main(String[] args){<br />
Date today;<br />
Calendar now;<br />
DateFormat f1,f2;<br />
String s1,s2;</p>
<p>System.out.println(&#8220;\n显示Date类的相关用法&#8221;);</p>
<p>today = new Date();<br />
System.out.println(&#8220;new Date()= \t&#8221;+ today);</p>
<p>System.out.println(&#8220;\n用DateFormat类显示各种日期格式&#8221;);</p>
<p>//显示各种日期格式<br />
f1 = DateFormat.getDateInstance();<br />
s1 = f1.format(today);<br />
System.out.println(&#8220;DateFormat.getDateInstance()= \t&#8221;+s1);</p>
<p>f1 = DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA);<br />
s1 = f1.format(today);<br />
System.out.println(&#8220;DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA)= \t&#8221;+ s1);</p>
<p>f1 = DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA);<br />
s1 = f1.format(today);<br />
System.out.println(&#8220;DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA)= \t&#8221;+ s1);</p>
<p>f1 = DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA);<br />
s1 = f1.format(today);<br />
System.out.println(&#8220;DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA)= \t&#8221; + s1);</p>
<p>System.out.println(&#8220;\n用DateFormat类显示各种时间格式&#8221;);</p>
<p>//显示各种时间格式<br />
f1 = DateFormat.getTimeInstance();<br />
s1 = f1.format(today);<br />
System.out.println(&#8220;DateFormat.getTimeInstance()= \t&#8221;+s1);</p>
<p>f1 = DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA);<br />
s1 = f1.format(today);<br />
System.out.println(&#8220;DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA)= \t&#8221;+s1);</p>
<p>f1 = DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA);<br />
s1 = f1.format(today);<br />
System.out.println(&#8220;DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA)= \t&#8221;+s1);</p>
<p>f1 = DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA);<br />
s1 = f1.format(today);<br />
System.out.println(&#8220;DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA)= \t&#8221;+s1);</p>
<p>System.out.println(&#8220;\n显示Calendar的相关时间用法&#8221;);</p>
<p>now = Calendar.getInstance();<br />
today = now.getTime();<br />
System.out.println(&#8220;Calendar.getInstance().getTime()= \t&#8221;+ today.toString());</p>
<p>}<br />
}</p>
<p>程序运行结果显示如下：</p>
<p>显示Date类的相关用法<br />
new Date()= Fri May 02 13:29:32 CST 2003</p>
<p>用DateFormat类显示各种日期格式<br />
DateFormat.getDateInstance()= 2003-5-2<br />
DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA)= 2003年5月2日<br />
DateFormat.getDateInstance(DateFormat.MEDIUM,Locale.CHINA)= 2003-5-2<br />
DateFormat.getDateInstance(DateFormat.SHORT,Locale.CHINA)= 03-5-2</p>
<p>用DateFormat类显示各种时间格式<br />
DateFormat.getTimeInstance()= 13:29:32<br />
DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA)= 下午01时29分32秒<br />
DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA)= 13:29:32<br />
DateFormat.getTimeInstance(DateFormat.SHORT,Locale.CHINA)= 下午1:29</p>
<p>显示Calendar的相关时间用法<br />
Calendar.getInstance().getTime()= Fri May 02 13:29:33 CST 2003<br />
java中关于时间日期操作的常用函数<br />
1.计算某一月份的最大天数<br />
Calendar time=Calendar.getInstance();<br />
time.clear();<br />
time.set(Calendar.YEAR,year);<br />
time.set(Calendar.MONTH,i-1);//注意,Calendar对象默认一月为0<br />
int day=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天数<br />
注：在使用set方法之前，必须先clear一下，否则很多信息会继承自系统当前时间<br />
2.Calendar和Date的转化<br />
(1) Calendar转化为Date<br />
Calendar cal=Calendar.getInstance();<br />
Date date=cal.getTime();<br />
(2) Date转化为Calendar<br />
Date date=new Date();<br />
Calendar cal=Calendar.getInstance();<br />
cal.setTime(date);<br />
3.格式化输出日期时间<br />
Date date=new Date();<br />
SimpleDateFormat df=new SimpleDateFormat(&#8220;yyyy-MM-dd hh:mm:ss&#8221;);<br />
System.out.println(df.format(date));<br />
4.计算一年中的第几星期<br />
(1)计算某一天是一年中的第几星期<br />
Calendar cal=Calendar.getInstance();<br />
cal.set(Calendar.YEAR, 2006);<br />
cal.set(Calendar.MONTH, 8);<br />
cal.set(Calendar.DAY_OF_MONTH, 3);<br />
int weekno=cal.get(Calendar.WEEK_OF_YEAR);<br />
(2)计算一年中的第几星期是几号<br />
SimpleDateFormat df=new SimpleDateFormat(&#8220;yyyy-MM-dd&#8221;);<br />
Calendar cal=Calendar.getInstance();<br />
cal.set(Calendar.YEAR, 2006);<br />
cal.set(Calendar.WEEK_OF_YEAR, 1);<br />
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);<br />
System.out.println(df.format(cal.getTime()));<br />
输出:<br />
2006-01-02<br />
5.add()和roll()的用法<br />
(1)add()方法<br />
SimpleDateFormat df=new SimpleDateFormat(&#8220;yyyy-MM-dd&#8221;);<br />
Calendar cal=Calendar.getInstance();<br />
cal.set(Calendar.YEAR, 2006);<br />
cal.set(Calendar.MONTH, 8);<br />
cal.set(Calendar.DAY_OF_MONTH, 3);<br />
cal.add(Calendar.DATE, -4);<br />
Date date=cal.getTime();<br />
System.out.println(df.format(date));<br />
cal.add(Calendar.DATE, 4);<br />
date=cal.getTime();<br />
System.out.println(df.format(date));<br />
输出：<br />
2006-08-30<br />
2006-09-03<br />
(2)roll方法<br />
cal.set(Calendar.YEAR, 2006);<br />
cal.set(Calendar.MONTH, 8);<br />
cal.set(Calendar.DAY_OF_MONTH, 3);<br />
cal.roll(Calendar.DATE, -4);<br />
date=cal.getTime();<br />
System.out.println(df.format(date));<br />
cal.roll(Calendar.DATE, 4);<br />
date=cal.getTime();<br />
System.out.println(df.format(date));<br />
输出：<br />
2006-09-29<br />
2006-09-03<br />
可见，roll()方法在本月内循环，一般使用add()方法；<br />
6.计算两个任意时间中间的间隔天数<br />
(1)传进Calendar对象</p>
<p>/** *//**计算两个时间之间相隔天数<br />
* @param startday 开始时间<br />
* @param endday 结束时间<br />
* @return<br />
*/<br />
public int getIntervalDays(Calendar startday,Calendar endday)&#8230;{<br />
//确保startday在endday之前<br />
if(startday.after(endday))&#8230;{<br />
Calendar cal=startday;<br />
startday=endday;<br />
endday=cal;<br />
}<br />
//分别得到两个时间的毫秒数<br />
long sl=startday.getTimeInMillis();<br />
long el=endday.getTimeInMillis();</p>
<p>long ei=el-sl;<br />
//根据毫秒数计算间隔天数<br />
return (int)(ei/(1000*60*60*24));<br />
}</p>
<p>(2)传进Date对象<br />
/** *//**计算两个时间之间相隔天数<br />
* @param startday 开始时间<br />
* @param endday 结束时间<br />
* @return<br />
*/<br />
public int getIntervalDays(Date startday,Date endday)&#8230;{<br />
//确保startday在endday之前<br />
if(startday.after(endday))&#8230;{<br />
Date cal=startday;<br />
startday=endday;<br />
endday=cal;<br />
}<br />
//分别得到两个时间的毫秒数<br />
long sl=startday.getTime();<br />
long el=endday.getTime();</p>
<p>long ei=el-sl;<br />
//根据毫秒数计算间隔天数<br />
return (int)(ei/(1000*60*60*24));<br />
}同理，可以用相同的方法计算出任意两个时间相隔的小时数，分钟数，秒钟数等<br />
注：以上方法是完全按时间计算，有时并不能令人满意，如：<br />
startday=&#8221;2006-10-11 20:00:00&#8243;<br />
endday=&#8221;2006-10-12 8:00:00&#8243;<br />
计算结果为0，但是我们也许相让计算结果变为1，此时可以用如下方法实现：<br />
在传参之前，先设定endday的时间，如：<br />
endday.set(Calendar.HOUR_OF_DAY, 23);<br />
endday.set(Calendar.MINUTE, 59);<br />
endday.set(Calendar.SECOND, 59);<br />
endday.set(Calendar.MILLISECOND, 59);<br />
这样再传进去startday,endday，则结果就如我们所愿了。不过，如果嫌以上方法麻烦，可以参考以下方法：<br />
(3)改进精确计算相隔天数的方法<br />
public int getDaysBetween (Calendar d1, Calendar d2) &#8230;{<br />
if (d1.after(d2)) &#8230;{ // swap dates so that d1 is start and d2 is end<br />
java.util.Calendar swap = d1;<br />
d1 = d2;<br />
d2 = swap;<br />
}<br />
int days = d2.get(Calendar.DAY_OF_YEAR) &#8211; d1.get(Calendar.DAY_OF_YEAR);<br />
int y2 = d2.get(Calendar.YEAR);<br />
if (d1.get(Calendar.YEAR) != y2) &#8230;{<br />
d1 = (Calendar) d1.clone();<br />
do &#8230;{<br />
days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天数<br />
d1.add(Calendar.YEAR, 1);<br />
} while (d1.get(Calendar.YEAR) != y2);<br />
}<br />
return days;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/12/java-date-operation-function/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java中的字符串截取</title>
		<link>http://www.javachen.com/2009/12/java-string-split/</link>
		<comments>http://www.javachen.com/2009/12/java-string-split/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 11:57:50 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[String]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=746</guid>
		<description><![CDATA[编写一个截取字符串的函数，输入为一个字符串和字节数，输出为按字节截取的字符串。 但是要保证汉字不被截半个，如“我ABC”4，应该截为“我AB”，输入“我ABC汉DEF”，6，应该输出为“我ABC”而不是“我ABC+汉的半个”。 这是我面试时候遇到的问题，刚开始的时候，思维就陷入了定势：用String的getBytes（）方法将字符串转化为byte数组，然后在遍历数组，每次遍历的时候要判断当前字符是字母还是汉字，面试的时候想着用正则判断汉字，却忘了正则表达式是怎样的。结果思路对了，就差不知道判断中文的正则怎样写了！ 现在，想了想怎样实现上门的要求。找到实现的方法如下： package stringTest; import java.io.UnsupportedEncodingException; public class SplitString { /** * 按字节截取字符串 * * @param orignal *            原始字符串 * @param count *            截取位数 * @return 截取后的字符串 * @throws UnsupportedEncodingException *             使用了JAVA不支持的编码格式 */ public String substring(String orignal, int count) throws UnsupportedEncodingException { // 原始字符不为null，也不是空字符串 if (orignal != null &#38;&#38; !&#8221;".equals(orignal)) { // 将原始字符串转换为GBK编码格式 [...]]]></description>
			<content:encoded><![CDATA[<p>编写一个截取字符串的函数，输入为一个字符串和字节数，输出为按字节截取的字符串。 但是要保证汉字不被截半个，如“我ABC”4，应该截为“我AB”，输入“我ABC汉DEF”，6，应该输出为“我ABC”而不是“我ABC+汉的半个”。</p>
<p>这是我面试时候遇到的问题，刚开始的时候，思维就陷入了定势：用String的getBytes（）方法将字符串转化为byte数组，然后在遍历数组，每次遍历的时候要判断当前字符是字母还是汉字，面试的时候想着用正则判断汉字，却忘了正则表达式是怎样的。结果思路对了，就差不知道判断中文的正则怎样写了！ <img src='http://www.javachen.com/wp-includes/images/QQ/icon_arrow.gif' alt=':arrow:' class='wp-smiley' /> </p>
<p>现在，想了想怎样实现上门的要求。找到实现的方法如下：</p>
<p><span id="more-746"></span></p>
<p>package stringTest;</p>
<p>import java.io.UnsupportedEncodingException;</p>
<p>public class SplitString {<br />
/**<br />
* 按字节截取字符串<br />
*<br />
* @param orignal<br />
*            原始字符串<br />
* @param count<br />
*            截取位数<br />
* @return 截取后的字符串<br />
* @throws UnsupportedEncodingException<br />
*             使用了JAVA不支持的编码格式<br />
*/<br />
public String substring(String orignal, int count)<br />
throws UnsupportedEncodingException {<br />
// 原始字符不为null，也不是空字符串<br />
if (orignal != null &amp;&amp; !&#8221;".equals(orignal)) {<br />
// 将原始字符串转换为GBK编码格式<br />
orignal = new String(orignal.getBytes(), &#8220;GBK&#8221;);<br />
// 要截取的字节数大于0，且小于原始字符串的字节数<br />
if (count &gt; 0 &amp;&amp; count &lt; orignal.getBytes(&#8220;GBK&#8221;).length) {<br />
StringBuffer buff = new StringBuffer();<br />
char c;<br />
for (int i = 0; i &lt; count; i++) {<br />
// charAt(int index)也是按照字符来分解字符串的<br />
c = orignal.charAt(i);<br />
buff.append(c);<br />
if (isChineseChar(c)) {<br />
// 遇到中文汉字，截取字节总数减1<br />
&#8211;count;<br />
}<br />
}<br />
return buff.toString();<br />
}<br />
}<br />
return orignal;<br />
}</p>
<p>/**<br />
* 判断是否是一个中文汉字<br />
*<br />
* @param c<br />
*            字符<br />
* @return true表示是中文汉字，false表示是英文字母<br />
* @throws UnsupportedEncodingException<br />
*             使用了JAVA不支持的编码格式<br />
*/<br />
public boolean isChineseChar(char c) throws UnsupportedEncodingException {<br />
// 如果字节数大于1，是汉字<br />
// 以这种方式区别英文字母和中文汉字并不是十分严谨，但在这个题目中，这样判断已经足够了<br />
return String.valueOf(c).getBytes(&#8220;GBK&#8221;).length &gt; 1;<br />
}</p>
<p>public static void main(String[] args) {<br />
String st = &#8220;test中dd文dsaf中男大3443n中国43中国人0ewldfls=103&#8243;;<br />
SplitString ss = new SplitString();</p>
<p>try {<br />
System.out.println(&#8220;使用重写的subString截取：&#8221;+ss.substring(st, 5));<br />
} catch (UnsupportedEncodingException e) {<br />
e.printStackTrace();<br />
}<br />
}<br />
}<br />
这里区别英文字母和中文汉字并不是十分严谨，使用的方法是：</p>
<p>return String.valueOf(c).getBytes(&#8220;GBK&#8221;).length &gt; 1;</p>
<p>当然，还有其他的办法可以判别。这只u是解决办法之一，后来看了看String的其他方法，发现还有一种更简单的解决办法：</p>
<p>package stringTest;</p>
<p>import java.io.UnsupportedEncodingException;</p>
<p>public class SplitString {<br />
String SplitStr;<br />
int SplitByte;<br />
public SplitString(String str, int bytes) {<br />
SplitStr = str;<br />
SplitByte = bytes;<br />
System.out.println(&#8220;The String is:&#8217;&#8221; + SplitStr + &#8220;&#8216;;SplitBytes=&#8221;<br />
+ SplitByte + &#8220;;The String length:&#8221; + SplitStr.length());<br />
}<br />
public void SplitIt() {<br />
int loopCount;</p>
<p>loopCount = (SplitStr.length() % SplitByte == 0)<br />
? (SplitStr.length() / SplitByte)<br />
: (SplitStr.length() / SplitByte + 1);<br />
System.out.println(&#8220;Will Split into &#8221; + loopCount);<br />
for (int i = 1; i &lt;= loopCount; i++) {<br />
if (i == loopCount) {</p>
<p>System.out.println(SplitStr.substring((i &#8211; 1) * SplitByte,<br />
SplitStr.length()));<br />
} else {</p>
<p>System.out.println(SplitStr.substring((i &#8211; 1) * SplitByte,<br />
(i * SplitByte)));<br />
}<br />
}<br />
}</p>
<p>public static void main(String[] args) {<br />
String st = &#8220;test中dd文dsaf中男大3443n中国43中国人0ewldfls=103&#8243;;<br />
SplitString ss = new SplitString(st, 4);<br />
ss.SplitIt();<br />
}<br />
}<br />
这种方法使用的是String的subString方法，好处是不用关注当前的字符是字母还是汉字了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/12/java-string-split/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>架构师的修炼</title>
		<link>http://www.javachen.com/2009/10/jiagoushi/</link>
		<comments>http://www.javachen.com/2009/10/jiagoushi/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 14:12:07 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[soft]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=567</guid>
		<description><![CDATA[       架构师是软件行业中一种新兴职业，工作职责是在一个软件项目开发过程中，将客户的需求转换为规范的开发计划及文本，并制定这个项目的总体架构，指导整个开发团队完成这个计划。架构师的主要任务不是从事具体的软件程序的编写，而是从事更高层次的开发构架工作。他必须对开发技术非常了解，并且需要有良好的组织管理能力。可以这样说，一个架构师工作的好坏决定了整个软件开发项目的成败。 　　架构师实际上就是软件的总体设计师。首席设计师就是总设计师，打个通俗的比方：邓小平是中国改革开放的总设计师，我们用现在的说法可以讲，邓小平是中国改革开放的首席架构师。架构师的形成一定是在实践中积累起来的，而并非上了几次培训班，读了几本书就可以成功的，架构师是在工程实践中培养出来的! 　　架构师也并非是万能的。架构师是客户需求和开发者之间的桥梁。在软件行业中，一般提到的架构师是技术架构师，而忽略了领域架构师或者讲是领域工程师的概念。一个好的领域专家一定是业务领域的架构师，他能够给出某一个业务领域的架构，我们可以称为业务架构，只有技术架构和业务架构紧密结合才有可能真正创造出一个好的系统! 　　近年来，软件领域也渐渐地流行起架构师的角色，特别是对一些大型软件产品或项目的开发，这一角色显得很关键，因为缺乏好的软件架构师而导致项目失败的例子不胜枚举，一个没有经验和能力的架构师也会使项目失败的速度加快。 　　软件架构师的重要作用 　　软件架构师在整个软件开发过程中都起着重要的作用，并随着开发进程的推进而其职责或关注点不断地变化，在需求阶段，软件架构师主要负责理解和管理非功能性系统需求，比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等等，此外，架构师还要经常审查和客户及市场人员所提出的需求，确认开发团队所提出的设计;在需求越来越明确后，架构师的关注点开始转移到组织开发团队成员和开发过程定义上;在软件设计阶段，架构师负责对整个软件体系结构、关键构件、接口和开发政策的设计;在编码阶段，架构师则成为详细设计者和代码编写者的顾问，并且经常性地要举行一些技术研讨会、技术培训班等;随着软件开始测试、集成和交付，集成和测试支持将成为软件架构师的工作重点;在软件维护开始时，软件架构师就开始为下一版本的产品是否应该增加新的功能模块进行决策。 　　如何成为优秀的软件架构师 　　显而易见，在软件开发过程中，一个优秀软件架构师的重要性是不应低估的。那么如何成为优秀的软件架构师呢? 　　首先必须具有丰富的软件设计与开发经验，这有助于理解并解释所进行的设计是如何映射到实现中去。 　　其次要具有领导能力与团队协作技能，软件架构师必须是一个得到承认的技术领导，能在关键时候对技术的选择作出及时、有效的决定。 　　第三是具有很强的沟通能力，呵呵，其时这一点好象什么鬼角色都最好具备，软件架构师需要与各路人马经常打交道，客户、市场人员、开发人员、测试人员、项目经理、网络管理员、数据库工程师等等，而且在很多角色之间还要起沟通者的作用。在技术能力方面，软件架构师最重要也是最需求掌握的知识是构件通信机制方面的知识，比如远程过程调用、JAVARMI、CORBA、COM/DCOM、各种标准的通信协议、网络服务、面对对象数据库、关系数据库等等，另外，架构师应时刻注意新软件设计和开发方面的发展情况，并不断探索更有效的新方法。开发语言、设计模式和开发平台不断很快地升级，软件架构师需要吸收这些新技术新知识，并将它们用于软件系统开发工作中。当然，行业的业务知识对软件架构师也是很重要的，有助于设计出一个满足客户需求的体系结构，优秀的软件架构师常常因为要尽快获得对行业业务的理解而必须快速学习并且进行敏锐的观察。 上面的描述是枯燥乏味的，但作为一个架构师，在整个软件系统的开发过程中是乐趣无穷的，因为这个角色很具有挑战性，有时需要左右逢源八面玲珑，有时又需要果断坚定不留情面。在国内，较少软件企业拥有独立的架构师，通常一个软件高手身兼数职，既是项目经理，又是软件架构师，还是软件开发者，有时还要客串一个测试人员，这对软件的开发周期和产品质量是不利的，有时一个人的观点立场是很片面的，而且繁重的工作、沉重的压力会影响一个人的情绪，情绪会影响决策，决策影响结果，所以值得我们三思而后行。 　　构架师自我培养过程 　　构架师不是通过理论学习可以搞出来的，不过不学习相关知识那肯定是不行的。总结构架师自我培养过程大致如下，仅供参考。 　　1、构架师胚胎(程序员) 　　学习的知识是语言基础、设计基础、通信基础等，应该在大学完成，内容包括java、c、c++、uml、RUP、XML、socket通信(通信协议)——学习搭建应用系统所必须的原材料。 　　2、构架师萌芽(高级程序员) 　　学习分布式系统、组建等内容，可以在大学或第一年工作时间接触，包括分布式系统原理、ejb、corba、com/com+、webservice(研究生可以研究网络计算机、高性能并发处理等内容) 　　3、构架师幼苗(设计师) 　　应该在掌握上述基础之上，结合实际项目经验，透彻领会应用设计模式，内容包括设计模式(c++版本、java版本)、ejb设计模式、J2EE构架、UDDI、软件设计模式等。在此期间，最好能够了解软件工程在实际项目中的应用以及小组开发、团队管理。 　　4、软件构架师的正是成型在于机遇、个人努力和天赋软件构架师其实是一种职位，但一个程序员在充分掌握软构架师所需的基本技能后，如何得到这样的机会、如何利用所掌握的技能进行应用的合理构架、如何不断的抽象和归纳自己的构架模式、如何深入行业成为能够胜任分析、构架为一体的精英人才这可不是每个人都能够遇上的馅饼…… JAVA系统架构师应该看的几本书 Thinking in Java Effective Java UML基础、案例与应用 UML入门提高 软件工匠 设计模式——可复用面向对象软件的基础 重构-改善既有代码的设计 敏捷软件开发-原则、模式、实践 企业应用架构模式 Expert One-on-One J2EE Development without EJB   软件工程——实践者的研究方法 软件领导－－成功开发软件的指导准则 后面的两本书，其实已经有点属于项目经理的范畴了，不过还不是很深入，看看对做成功的系统架构师是很有好处。 企业应用的系统架构师应该关注的几个方面 数据持久层的设计  在Spring和Hibernate，ibatis出来以前，几乎每家公司都有自己的一套方法和架构，而架构师的50％的精力也会集中到这上面，EJB只是增加架构师的负担。在Spring出来以后，基本上，大多数的架构师都从重复设计这个轮子的无用功中解脱出来了。Rod的轮子太好用了，基本上，大家只要套上去就行了，或者，剩下最重要的事情，是选择一个合适的数据库连接池的开源项目吧 MVC架构的具体设计  MVC只是个概要的概念，具体如何实现的具体技术很多，根据项目设计最恰当的架构 大并发性访问  使用缓存，在数据量达到一定程度时，使用集群技术，优先考虑利用服务器的集群，其次是硬件集群，最后才是应用本身加入集群功能 超大数据量返回结果  尽量使用分页，优化SQL语句，循环处理数据时尽可能共用对象，只保留关键数据，及时释放内存占用 超大文件的读取和生成 [...]]]></description>
			<content:encoded><![CDATA[<p>       架构师是软件行业中一种新兴职业，工作职责是在一个软件项目开发过程中，将客户的需求转换为规范的开发计划及文本，并制定这个项目的总体架构，指导整个开发团队完成这个计划。架构师的主要任务不是从事具体的软件程序的编写，而是从事更高层次的开发构架工作。他必须对开发技术非常了解，并且需要有良好的组织管理能力。可以这样说，一个架构师工作的好坏决定了整个软件开发项目的成败。</p>
<p>　　架构师实际上就是软件的总体设计师。首席设计师就是总设计师，打个通俗的比方：邓小平是中国改革开放的总设计师，我们用现在的说法可以讲，邓小平是中国改革开放的首席架构师。架构师的形成一定是在实践中积累起来的，而并非上了几次培训班，读了几本书就可以成功的，架构师是在工程实践中培养出来的!</p>
<p>　　架构师也并非是万能的。架构师是客户需求和开发者之间的桥梁。在软件行业中，一般提到的架构师是技术架构师，而忽略了领域架构师或者讲是领域工程师的概念。一个好的领域专家一定是业务领域的架构师，他能够给出某一个业务领域的架构，我们可以称为业务架构，只有技术架构和业务架构紧密结合才有可能真正创造出一个好的系统!</p>
<p>　　近年来，软件领域也渐渐地流行起架构师的角色，特别是对一些大型软件产品或项目的开发，这一角色显得很关键，因为缺乏好的软件架构师而导致项目失败的例子不胜枚举，一个没有经验和能力的架构师也会使项目失败的速度加快。<span id="more-567"></span></p>
<p>　<strong>　<span style="color: #3366ff;">软件架构师的重要作用</span></strong></p>
<p>　　软件架构师在整个软件开发过程中都起着重要的作用，并随着开发进程的推进而其职责或关注点不断地变化，在需求阶段，软件架构师主要负责理解和管理非功能性系统需求，比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等等，此外，架构师还要经常审查和客户及市场人员所提出的需求，确认开发团队所提出的设计;在需求越来越明确后，架构师的关注点开始转移到组织开发团队成员和开发过程定义上;在软件设计阶段，架构师负责对整个软件体系结构、关键构件、接口和开发政策的设计;在编码阶段，架构师则成为详细设计者和代码编写者的顾问，并且经常性地要举行一些技术研讨会、技术培训班等;随着软件开始测试、集成和交付，集成和测试支持将成为软件架构师的工作重点;在软件维护开始时，软件架构师就开始为下一版本的产品是否应该增加新的功能模块进行决策。</p>
<p>　　<strong><span style="color: #3366ff;">如何成为优秀的软件架构师</span></strong></p>
<p>　　显而易见，在软件开发过程中，一个优秀软件架构师的重要性是不应低估的。那么如何成为优秀的软件架构师呢?</p>
<p>　　首先必须具有丰富的软件设计与开发经验，这有助于理解并解释所进行的设计是如何映射到实现中去。</p>
<p>　　其次要具有领导能力与团队协作技能，软件架构师必须是一个得到承认的技术领导，能在关键时候对技术的选择作出及时、有效的决定。</p>
<p>　　第三是具有很强的沟通能力，呵呵，其时这一点好象什么鬼角色都最好具备，软件架构师需要与各路人马经常打交道，客户、市场人员、开发人员、测试人员、项目经理、网络管理员、数据库工程师等等，而且在很多角色之间还要起沟通者的作用。在技术能力方面，软件架构师最重要也是最需求掌握的知识是构件通信机制方面的知识，比如远程过程调用、JAVARMI、CORBA、COM/DCOM、各种标准的通信协议、网络服务、面对对象数据库、关系数据库等等，另外，架构师应时刻注意新软件设计和开发方面的发展情况，并不断探索更有效的新方法。开发语言、设计模式和开发平台不断很快地升级，软件架构师需要吸收这些新技术新知识，并将它们用于软件系统开发工作中。当然，行业的业务知识对软件架构师也是很重要的，有助于设计出一个满足客户需求的体系结构，优秀的软件架构师常常因为要尽快获得对行业业务的理解而必须快速学习并且进行敏锐的观察。</p>
<p>上面的描述是枯燥乏味的，但作为一个架构师，在整个软件系统的开发过程中是乐趣无穷的，因为这个角色很具有挑战性，有时需要左右逢源八面玲珑，有时又需要果断坚定不留情面。在国内，较少软件企业拥有独立的架构师，通常一个软件高手身兼数职，既是项目经理，又是软件架构师，还是软件开发者，有时还要客串一个测试人员，这对软件的开发周期和产品质量是不利的，有时一个人的观点立场是很片面的，而且繁重的工作、沉重的压力会影响一个人的情绪，情绪会影响决策，决策影响结果，所以值得我们三思而后行。</p>
<p>　<strong>　<span style="color: #3366ff;">构架师自我培养过程</span></strong></p>
<p><strong></strong>　　构架师不是通过理论学习可以搞出来的，不过不学习相关知识那肯定是不行的。总结构架师自我培养过程大致如下，仅供参考。</p>
<p>　<strong>　1、构架师胚胎(程序员)</strong></p>
<p>　　学习的知识是语言基础、设计基础、通信基础等，应该在大学完成，内容包括java、c、c++、uml、RUP、XML、socket通信(通信协议)——学习搭建应用系统所必须的原材料。</p>
<p>　　<strong>2、构架师萌芽(高级程序员)</strong></p>
<p>　　学习分布式系统、组建等内容，可以在大学或第一年工作时间接触，包括分布式系统原理、ejb、corba、com/com+、webservice(研究生可以研究网络计算机、高性能并发处理等内容)</p>
<p>　<strong>　3、构架师幼苗(设计师)</strong></p>
<p>　　应该在掌握上述基础之上，结合实际项目经验，透彻领会应用设计模式，内容包括设计模式(c++版本、java版本)、ejb设计模式、J2EE构架、UDDI、软件设计模式等。在此期间，最好能够了解软件工程在实际项目中的应用以及小组开发、团队管理。</p>
<p>　　4、软件构架师的正是成型在于机遇、个人努力和天赋软件构架师其实是一种职位，但一个程序员在充分掌握软构架师所需的基本技能后，如何得到这样的机会、如何利用所掌握的技能进行应用的合理构架、如何不断的抽象和归纳自己的构架模式、如何深入行业成为能够胜任分析、构架为一体的精英人才这可不是每个人都能够遇上的馅饼……</p>
<p>JAVA系统架构师应该看的几本书</p>
<p>Thinking in Java<br />
Effective Java</p>
<p>UML基础、案例与应用<br />
UML入门提高</p>
<p>软件工匠<br />
设计模式——可复用面向对象软件的基础</p>
<p>重构-改善既有代码的设计<br />
敏捷软件开发-原则、模式、实践</p>
<p>企业应用架构模式<br />
Expert One-on-One J2EE Development without EJB<br />
 <br />
软件工程——实践者的研究方法<br />
软件领导－－成功开发软件的指导准则</p>
<p>后面的两本书，其实已经有点属于项目经理的范畴了，不过还不是很深入，看看对做成功的系统架构师是很有好处。</p>
<h3><span style="color: #3366ff;">企业应用的系统架构师应该关注的几个方面</span></h3>
<p>数据持久层的设计<br />
 在Spring和Hibernate，ibatis出来以前，几乎每家公司都有自己的一套方法和架构，而架构师的50％的精力也会集中到这上面，EJB只是增加架构师的负担。在Spring出来以后，基本上，大多数的架构师都从重复设计这个轮子的无用功中解脱出来了。Rod的轮子太好用了，基本上，大家只要套上去就行了，或者，剩下最重要的事情，是选择一个合适的数据库连接池的开源项目吧</p>
<p>MVC架构的具体设计<br />
 MVC只是个概要的概念，具体如何实现的具体技术很多，根据项目设计最恰当的架构</p>
<p>大并发性访问<br />
 使用缓存，在数据量达到一定程度时，使用集群技术，优先考虑利用服务器的集群，其次是硬件集群，最后才是应用本身加入集群功能</p>
<p>超大数据量返回结果<br />
 尽量使用分页，优化SQL语句，循环处理数据时尽可能共用对象，只保留关键数据，及时释放内存占用</p>
<p>超大文件的读取和生成<br />
 尽可能快的读取大文件，并进行分析。写入大文件时，如何及时释放内存。学会适当利用操作系统的命令行资源来更快完成任务。<br />
 <br />
多线程的应用和管理<br />
 线程池的管理和监控，线程的启动（包括定时启动），结束，回收，线程资源的释放<br />
 <br />
用户界面可用性设计<br />
 平衡速度和可用性，恰当的使用异步和同步技术，展现关键数据为重点</p>
<p>分布式的数据交流和集成<br />
 选择恰当的数据交互方式，从最泛滥低效的Web Service到最实用的文件共享</p>
<p>群集系统的管理<br />
 如何确保缓存的同步？如何确保对象唯一性？如何保证各台机器的同步？<br />
 是否采用EJB?如何利用J2EE的特性（例如JNDI)</p>
<p>复杂的业务规则<br />
 规则引擎和工作流引擎场景和应用<br />
 <br />
其实，作为一个真正的系统架构师，不应该局限于企业应用的系统，这种系统往往有数据库的局限性，有时候，应该考虑是否可以横向跨越，直接对其它系统做一些架构考虑，在没有丰富的实战经验的前提下，而只是看了其它人的系统和代码，就能够给出有效的设计指导。<br />
上面的描述是枯燥乏味的，但作为一个架构师，在整个软件系统的开发过程中是乐趣无穷的，因为这个角色很具有挑战性，有时需要左右逢源八面玲珑，有时又需要果断坚定不留情面。在国内，较少软件企业拥有独立的架构师，通常一个软件高手身兼数职，既是项目经理，又是软件架构师，还是软件开发者，有时还要客串一个测试人员，这对软件的开发周期和产品质量是不利的，有时一个人的观点立场是很片面的，而且繁重的工作、沉重的压力会影响一个人的情绪，情绪会影响决策，决策影响结果，所以值得我们三思而后行。</p>
<p>　</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/10/jiagoushi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化 myeclipse7.5</title>
		<link>http://www.javachen.com/2009/10/myeclipse7-0_option/</link>
		<comments>http://www.javachen.com/2009/10/myeclipse7-0_option/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 12:25:19 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[MyEclipse]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=565</guid>
		<description><![CDATA[一、加大JVM的非堆内存 打开 eclipse.ini -showsplash com.genuitec.myeclipse.product –launcher.XXMaxPermSize 256M -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms128m -Xmx512m -Dosgi.splashLocation=e:MyEclipse 6.0eclipseMyEclipseSplash.bmp -Duser.language=en -XX:PermSize=128M -XX:MaxPermSize=256M 把下面的那个 -XX:MaxPermSize 调大，比如 -XX:MaxPermSize=512M，再把 -XX:PermSize 调成跟 -XX:MaxPermSize一样大 几乎每次 eclipse 卡到当都是因为这个 非堆内存 不足造成的，把最大跟最小调成一样是因为不让 myeclipse 频繁的换内存区域大小 注意：XX:MaxPermSize 和 Xmx 的大小之和不能超过你的电脑内存大小！ 二、增强MyEclipse的代码自动提示功能 1. 打开MyEclipse ，然后“window”→“Preferences” 2. 选择“java”，展开，“Editor”，选择“Content Assist”。 3. 选择“Content Assist”，然后看到右边，右边的“Auto-Activation”下面的“Auto Activation triggers for java”这个选项。其实就是指触发代码提示的就是“.”这个符号。 4. “Auto Activation triggers for java”这个选项，在“.”后加“.abcdefghijklmnopqrstuvwxyz(,&#60;”，方便后面的查找 修改。然后“apply”，点击“OK”。 收集了一些关于解决 MyEclipse 的耗内存的办法，经测试非常有效，整理出来，希望可以方便更多的朋友。 1、老是弹出Quick update error 、关闭myeclipse的Quick Update自动更新功能 这个问题的解决办法是关闭自动更新 Windows &#62; Preferences &#62; MyEclipse Enterprise Workbench &#62; [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #00ccff;">一、加大JVM的非堆内存 </span><br />
打开 eclipse.ini<br />
-showsplash<br />
com.genuitec.myeclipse.product<br />
–launcher.XXMaxPermSize<br />
256M<br />
-vmargs<br />
-Dosgi.requiredJavaVersion=1.5<br />
-Xms128m<br />
-Xmx512m<br />
-Dosgi.splashLocation=e:MyEclipse 6.0eclipseMyEclipseSplash.bmp<br />
-Duser.language=en<br />
-XX:PermSize=128M<br />
-XX:MaxPermSize=256M<br />
把下面的那个 -XX:MaxPermSize 调大，比如 -XX:MaxPermSize=512M，再把 -XX:PermSize 调成跟 -XX:MaxPermSize一样大<br />
几乎每次 eclipse 卡到当都是因为这个 非堆内存 不足造成的，把最大跟最小调成一样是因为不让 myeclipse 频繁的换内存区域大小<br />
注意：XX:MaxPermSize 和 Xmx 的大小之和不能超过你的电脑内存大小！<br />
<span id="more-565"></span></p>
<h4><strong><span style="color: #00ccff;">二、增强MyEclipse的代码自动提示功能</span></strong></h4>
<p>1. 打开MyEclipse ，然后“window”→“Preferences”</p>
<p>2. 选择“java”，展开，“Editor”，选择“Content  Assist”。</p>
<p>3.  选择“Content Assist”，然后看到右边，右边的“Auto-Activation”下面的“Auto Activation  triggers for java”这个选项。其实就是指触发代码提示的就是“.”这个符号。</p>
<p>4. “Auto Activation triggers for  java”这个选项，在“.”后加“.abcdefghijklmnopqrstuvwxyz(,&lt;”，方便后面的查找 修改。然后“apply”，点击“OK”。</p>
<p>收集了一些关于解决 MyEclipse 的耗内存的办法，经测试非常有效，整理出来，希望可以方便更多的朋友。</p>
<p>1、老是弹出Quick update error 、关闭myeclipse的Quick Update自动更新功能<br />
这个问题的解决办法是关闭自动更新<br />
Windows &gt; Preferences &gt; MyEclipse Enterprise Workbench &gt; Community Essentials,<br />
把选项 &#8220;Search for new features on startup&#8221;的前勾去掉即可。</p>
<p>2 、关闭updating indexes<br />
Window &gt; Preferences &gt; Myeclipse Enterprise Workbench &gt; Maven4Myeclipse &gt; Maven&gt;<br />
禁用Download repository index updates on startup 。<br />
如果是myeclipse7.5：<br />
（1）关掉maven自动更新：<br />
window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven,<br />
关闭所有Download和Update开头的选项，共四项（去掉前面的勾）<br />
（2）关闭更新调度：window –&gt; preferences –&gt; General –&gt; Startup and Shutdown –&gt; Automatic Updates Scheduler（去掉前面的勾）<br />
（3）window –&gt; preferences –&gt;Myeclipse Dashboard,关闭Show……on start</p>
<p>3 、关闭MyEclipse的自动validation<br />
validation有一堆，什么xml、jsp、jsf、js等等，我们没有必要全部都去自动校验一下，<br />
只是需要的时候才会手工校验一 下，速度立马提升好几个档次<br />
windows &gt; perferences &gt; myeclipse &gt; validation<br />
将Build下全部勾取消<br />
如果你需要验证某个文件的时候，我们可以单独去验证它。方法是：<br />
在需要验证的文件上( 右键 -&gt; MyEclipse -&gt; Run   Validation 。</p>
<p>4、 启动优化，关闭不需要使用的模块<br />
一个系统20%的功能往往能够满足80%的需求，MyEclipse也不例外，我们在大多数时候只需要20%的系统功能，<br />
所以可以将一些不使用的模块禁止 加载启动。<br />
Window &gt; Preferences &gt; General &gt; Startup andy Shutdown 在这里列出的是MyEclipse启动时加载的模块<br />
我这里只让它加载tomcat5 勾选 MyEclipse EASIE Tomcat 5 。<br />
怎样才能知道哪些启动项有用呢？我现在把我知道的启动项用处说一下，还有很多不懂的，<br />
希望大家懂的回复在下面    啊：<br />
WTP ：一个跟myeclipse差不多的东西，主要差别是 WTP 是免费的，如果使用myeclipse，这个可以取消<br />
Mylyn：组队任务管理工具，类似于 CVS ，以任务为单位管理项目进度，没用到的可以取消<br />
Derby：一种保存成 jar 形式的数据库，我没用到，取消<br />
一大排以 MyEclipse EASIE 打头的启动项：myeclipse 支持的服务器，只选自己用的，其他取消，<br />
比如我只选了    tomcat 。</p>
<p>5 、去掉MyEclipse的拼写检查（如果你觉的有用可以不去）<br />
拼写检查会给我们带来不少的麻烦，我们的方法命名都会是单词的缩写，他也会提示有错，<br />
所以最好去掉，没有多大的用处<br />
Window &gt; perferences &gt; General &gt; Editors &gt; Text Editors &gt; Spelling &gt; 将Enable spell checking复选框的勾选去掉。</p>
<p>6 、去掉MyEclipse繁杂的自带插件自动加载项<br />
Window &gt; perferences &gt; General &gt; Startup and Shutdown &gt; 将Plug-ins activated on startup<br />
中的复选框有选择性的勾   选去掉。</p>
<p>7 、修改MyEclipse编辑JSP页面时的编辑工具<br />
Window &gt; perferences &gt; General &gt; Editors &gt; File Associations &gt;<br />
在File types 中选择 *.jsp &gt; 在Associated editors 中将&#8221;MyEclipse JSP Editor&#8221;设置为默认。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/10/myeclipse7-0_option/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>23中设计模式&#8212;&#8212;-轻松的比喻语言</title>
		<link>http://www.javachen.com/2009/09/23_patterns/</link>
		<comments>http://www.javachen.com/2009/09/23_patterns/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 06:25:19 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Pattern]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=494</guid>
		<description><![CDATA[创建型模式 1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。 2、BUILDER—MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每 种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱 你”builder。（这一定比美军在伊拉克用的翻译机好卖） 建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。 工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。 4、PROTOTYPE—跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要） 原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加 或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事) 单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 结构型模式 6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我) 适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。 7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了 桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。 8、COMPOSITE—Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好 看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起 来。”“……”，MM都会用Composite模式了，你会了没有？ 合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背 面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子 装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？ 装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 10、FACADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸 好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。 门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。 11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加 上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。 享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和 外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以 共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创 建被共享的对象。享元模式大幅度的降低内存中对象的数量。 12、PROXY—跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀？”“你多大了？”“身高多少呀？”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。 代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某 些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式 可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。 行为模式 13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友 吗？如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑! 责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接 起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端 的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。 14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给 我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：“我同时给我姐姐三个男朋友送COMMAND，就数你最小 气，才请我吃面。” 命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一 方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。 [...]]]></description>
			<content:encoded><![CDATA[<div>
<p><span style="color: red;"><strong>创建型模式</strong></span><br />
1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory<br />
工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。<br />
2、BUILDER—MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每 种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱 你”builder。（这一定比美军在伊拉克用的翻译机好卖）<br />
建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 <span id="more-494"></span><br />
3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。<br />
工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。<br />
4、PROTOTYPE—跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要）<br />
原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加 或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。<br />
5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事)<br />
单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。<br />
<span style="color: red;"><strong>结构型模式</strong></span></p>
<p>6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我)</p>
<p>适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。<br />
7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了<br />
桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。<br />
8、COMPOSITE—Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好 看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起 来。”“……”，MM都会用Composite模式了，你会了没有？<br />
合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。<br />
9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背 面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子 装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？<br />
装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。<br />
10、FACADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸 好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。<br />
门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。<br />
11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加 上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。<br />
享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和 外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以 共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创 建被共享的对象。享元模式大幅度的降低内存中对象的数量。<br />
12、PROXY—跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀？”“你多大了？”“身高多少呀？”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。<br />
代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某 些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式 可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。<br />
<span style="color: red;"><strong>行为模式</strong></span><br />
13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友 吗？如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑!<br />
责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接<br />
起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端 的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。<br />
14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给 我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：“我同时给我姐姐三个男朋友送COMMAND，就数你最小 气，才请我吃面。”<br />
命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一 方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。 系统支持命令的撤消。<br />
15、INTERPRETER—俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。<br />
解释器模式：给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释 器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中 需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象 的任何排列组合都是一个语言。<br />
16、ITERATOR—我爱上了Mary，不顾一切的向她求婚。<br />
Mary：“想要我跟你结婚，得答应我的条件”<br />
我：“什么条件我都答应，你说吧”<br />
Mary：“我看上了那个一克拉的钻石”<br />
我：“我买，我买，还有吗？”<br />
Mary：“我看上了湖边的那栋别墅”<br />
我：“我买，我买，还有吗？”<br />
……<br />
迭代子模式：迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集，聚集对象是能够包容一组对象 的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的 迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。<br />
17、MEDIATOR—四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。</p>
<p>调停者模式：调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改 变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象 的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。<br />
18、MEMENTO—同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。<br />
备忘录模式：备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。<br />
19、OBSERVER—想知道咱们公司最新MM情报吗？加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者（观察者）就可以及时收到情报啦<br />
观察者模式：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。<br />
20、STATE—跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会说“有 事情啦”，对你不讨厌但还没喜欢上的MM就会说“好啊，不过可以带上我同事么？”，已经喜欢上你的MM就会说“几点钟？看完电影再去泡吧怎么样？”，当然 你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。<br />
状态模式：状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状 态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。状态模式需要对每一个 系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。<br />
21、STRATEGY—跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。<br />
策略模式：策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的 情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由于算法和环境独立开来，算法的增减，修改都不 会影响到环境和客户端。<br />
22、TEMPLATE METHOD——将执行步骤称为(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现)；<br />
模板方法模式：模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的 子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。<br />
23、VISITOR—情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点来挑， 我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张卡，这样 就轻松多了；<br />
访问者模式：访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数据结构可以保持不变。访问者 模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变 的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多 的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/09/23_patterns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>面试神舟航天软件的一个上机考试题</title>
		<link>http://www.javachen.com/2009/09/interview_in_bjsasc/</link>
		<comments>http://www.javachen.com/2009/09/interview_in_bjsasc/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 06:14:45 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Interview]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=490</guid>
		<description><![CDATA[1.创建3个表 student表 student_id vchar(36) primary key name vchar(128) not null 学生名称 memo vchar(256)    备注 class表 class_id vchar(36) primary key name vchar(128) not null 班级名称 memo vchar(256) 备注 该表预先插入两条记录 （ stu_to_class表 (表明学生属于哪个班级） student_id    primary key class_id    primary key 2.创建应用，完成下面页面 （1）student的增加、删除、修改页面（要求添加的时候，同时选定该学生所属的班级,主键guid） （2）查询页面，输入搜索关键字，列出学生表中（名称，备注字段中含有该关键字）所有的学生信息，并且导出excel格式的学生清单(选做)。]]></description>
			<content:encoded><![CDATA[<p>1.创建3个表</p>
<p>student表<br />
student_id vchar(36) primary key<br />
name vchar(128) not null 学生名称<br />
memo vchar(256)    备注</p>
<p>class表<br />
class_id vchar(36) primary key<br />
name vchar(128) not null 班级名称<br />
memo vchar(256) 备注</p>
<p>该表预先插入两条记录 （</p>
<p>stu_to_class表 (表明学生属于哪个班级）<br />
student_id    primary key<br />
class_id    primary key</p>
<p>2.创建应用，完成下面页面</p>
<p>（1）student的增加、删除、修改页面（要求添加的时候，同时选定该学生所属的班级,主键guid）<br />
（2）查询页面，输入搜索关键字，列出学生表中（名称，备注字段中含有该关键字）所有的学生信息，并且导出excel格式的学生清单(选做)。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/09/interview_in_bjsasc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript和Java的区别</title>
		<link>http://www.javachen.com/2009/09/javascript_compareto_java/</link>
		<comments>http://www.javachen.com/2009/09/javascript_compareto_java/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 04:57:26 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=488</guid>
		<description><![CDATA[JavaScript和Java的区别 虽 然JavaScript与Java有紧密的联系，但却是两个公司开发的不同的两个产品。Java是SUN公司推出的新一代面向对象的程序设计语言，特别适 合于Internet应用程序开发；而JavaScript是Netscape公司的产品，其目的是为了扩展Netscape Navigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言, 它的前身是Live Script；而Java的前身是Oak语言。下面对两种语言间的异同作如下比较： 基于对象和面向对象 Java是一种真正的面向对象的语言，即使是开发简单的程序，必须设计对象。 JavaScript是种脚本语言，它可以用来制作与网络无关的，与用户交互作用的复杂软件。它是一种基于对象（Object Based）和事件驱动（Event Driver）的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用。 解释和编译 两种语言在其浏览器中所执行的方式不一样。Java的源代码在传递到客户端执行之前，必须经过编译，因而客户端上必须具有相应平台上的仿真器或解释器，它可以通过编译器或解释器实现独立于某个特定的平台编译代码的束缚。 JavaScript是一种解释性编程语言，其源代码在发往客户端执行之前不需经过编译，而是将文本格式的字符代码发送给客户编由浏览器解释执行。 强变量和弱变量 两种语言所采取的变量是不一样的。 Java采用强类型变量检查，即所有变量在编译之前必须作声明。如: Integer x; String y; x=1234; x=4321; 其中X=1234说明是一个整数，Y=4321说明是一个字符串。 JavaScript中变量声明，采用其弱类型。即变量在使用前不需作声明，而是解释器在运行时检查其数据类型，如： x=1234; y＝&#8221;4321&#8243;; 前者说明x为其数值型变量，而后者说明y为字符型变量。 代码格式不一样 Java是一种与HTML无关的格式，必须通过像HTML中引用外媒体那么进行装载，其代码以字节代码的形式保存在独立的文档中。 JavaScript的代码是一种文本字符格式，可以直接嵌入HTML文档中，并且可动态装载。编写HTML文档就像编辑文本文件一样方便。 嵌入方式不一样 在HTML文档中，两种编程语言的标识不同，JavaScript使用&#60;Script&#62;&#8230;&#60;/Script&#62;来标识，而Java使用&#60;applet&#62;&#8230;&#60;/applet&#62;来标识。 静态联编和动态联编 Java采用静态联编，即Java的对象引用必须在编译时的进行，以使编译器能够实现强类型检查。 JavaScript采用动态联编，即JavaScript的对象引用在运行时进行检查，如不经编译则就无法实现对象引用的检查。]]></description>
			<content:encoded><![CDATA[<p><span style="color: #7d7d7d;"><span style="color: #009933;">JavaScript和Java的区别</span></span></p>
<p><span style="color: #7d7d7d;">虽 然JavaScript与Java有紧密的联系，但却是两个公司开发的不同的两个产品。Java是SUN公司推出的新一代面向对象的程序设计语言，特别适 合于Internet应用程序开发；而JavaScript是Netscape公司的产品，其目的是为了扩展Netscape Navigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言, 它的前身是Live Script；而Java的前身是Oak语言。下面对两种语言间的异同作如下比较：<span id="more-488"></span></span></p>
<p><span style="color: #7d7d7d;">基于对象和面向对象<br />
Java是一种真正的面向对象的语言，即使是开发简单的程序，必须设计对象。<br />
JavaScript是种脚本语言，它可以用来制作与网络无关的，与用户交互作用的复杂软件。它是一种基于对象（Object      Based）和事件驱动（Event Driver）的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用。<br />
解释和编译<br />
两种语言在其浏览器中所执行的方式不一样。Java的源代码在传递到客户端执行之前，必须经过编译，因而客户端上必须具有相应平台上的仿真器或解释器，它可以通过编译器或解释器实现独立于某个特定的平台编译代码的束缚。<br />
JavaScript是一种解释性编程语言，其源代码在发往客户端执行之前不需经过编译，而是将文本格式的字符代码发送给客户编由浏览器解释执行。<br />
强变量和弱变量<br />
两种语言所采取的变量是不一样的。<br />
Java采用强类型变量检查，即所有变量在编译之前必须作声明。如:<br />
Integer x;<br />
String y;<br />
x=1234;<br />
x=4321;</span></p>
<p><span style="color: #7d7d7d;">其中X=1234说明是一个整数，Y=4321说明是一个字符串。<br />
JavaScript中变量声明，采用其弱类型。即变量在使用前不需作声明，而是解释器在运行时检查其数据类型，如：</span></p>
<p><span style="color: #7d7d7d;">x=1234;</span></p>
<p><span style="color: #7d7d7d;">y＝&#8221;4321&#8243;;</span></p>
<p><span style="color: #7d7d7d;">前者说明x为其数值型变量，而后者说明y为字符型变量。</span></p>
<p><span style="color: #7d7d7d;">代码格式不一样<br />
Java是一种与HTML无关的格式，必须通过像HTML中引用外媒体那么进行装载，其代码以字节代码的形式保存在独立的文档中。<br />
JavaScript的代码是一种文本字符格式，可以直接嵌入HTML文档中，并且可动态装载。编写HTML文档就像编辑文本文件一样方便。<br />
嵌入方式不一样<br />
在HTML文档中，两种编程语言的标识不同，JavaScript使用&lt;Script&gt;&#8230;&lt;/Script&gt;来标识，而Java使用&lt;applet&gt;&#8230;&lt;/applet&gt;来标识。<br />
静态联编和动态联编<br />
Java采用静态联编，即Java的对象引用必须在编译时的进行，以使编译器能够实现强类型检查。<br />
JavaScript采用动态联编，即JavaScript的对象引用在运行时进行检查，如不经编译则就无法实现对象引用的检查。 </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/09/javascript_compareto_java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java中的集合类</title>
		<link>http://www.javachen.com/2009/09/java_collection/</link>
		<comments>http://www.javachen.com/2009/09/java_collection/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 04:50:57 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[collection]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[Set]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=486</guid>
		<description><![CDATA[集合类存放于java.util包中。存放的都是对象的引用，而非对象本身，出于表达上的便利，我们称集合中的对象就是指集合中对象的引用（reference)。 集合类型主要有3种：set(集）、list(列表）和map(映射)。 3种类型都是接口，是不能被NEW 的，要想初始化一个对象，只能NEW它的实现类。 1）set集 集（set）是最简单的一种集合，它的对象不按特定方式排序，只是简单地把对象加入集合中，就像往口袋里放东西。对集中成员的访问和操作是通过集中对象的引用进行的，所以集中不能有重复对象。（set）集也有多种变体，可以实现排序等功能，如TreeSet（在（set）集中实现排序功能），它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口，也就是加入了对象比较的方法。通过对集中的对象迭代，我们可以得到一个升序的对象集合。 Set的功能方法 Set(interface): 存入Set的每个元素必须是唯一的，因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。 HashSet: 为快速查找而设计的Set。存入HashSet的对象必须定义hashCode()。 TreeSet: 保持次序的Set，底层为树结构。使用它可以从Set中提取有序的序列。 LinkedHashSet: 具有HashSet的查询速度，且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时，结果会按元素插入的次序显示。 HashSet采用散列函数对元素进行排序，这是专门为快速查询而设计的；TreeSet采用红黑树的数据结构进行排序元 素；LinkedHashSet内部使用散列以加快查询速度，同时使用链表维护元素的次序，使得看起来元素是以插入的顺序保存的。需要注意的是，生成自己 的类时，Set需要维护元素的存储顺序，因此要实现Comparable接口并定义compareTo()方法 2）list列表 列表的主要特征是其对象以线性方式存储，没有特定顺序，只有一个开头和一个结尾，当然，它与根本没有顺序的集是不同的。 列表在数据结构中分别表现为：数组和向量、链表、堆栈、队列。 关于实现列表的集合类，是我们日常工作中经常用到的。 List的功能方法 List(interface): 次序是List最重要的特点；它确保维护元素特定的顺序。List为Collection添加了许多方法，使得能够向List中间插入与移除元素(只推荐 LinkedList使用)。一个List可以生成ListIterator，使用它可以从两个方向遍历List，也可以从List中间插入和删除元素。 ArrayList: 由数组实现的List。它允许对元素进行快速随机访问，但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList，而不是用来插入和删除元素，因为这比LinkedList开销要大很多。 LinkedList: 对顺序访问进行了优化，向List中间插入与删除得开销不大，随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、 addLast()、getFirst()、getLast()、removeFirst()、removeLast()，这些方法(没有在任何接口或基 类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。 Vector类 Vector非常类似ArrayList，但是Vector是同 步的。由Vector创建的Iterator，虽然和ArrayList创建的Iterator是同一接口，但是，因为Vector是同步的，当一个 Iterator被创建而且正在被使用，另一个线程改变了Vector的状态（例如，添加或删除了一些元素），这时调用Iterator的方法时将抛出 ConcurrentModificationException，因此必须捕获该异常。 Stack 类 Stack继承自 Vector，实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法，还有peek方 法得到栈顶的元素，empty方法测试堆栈是否为空，search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 3）map映射 映射与集或列表有明显区别，映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字（Key）对象，关键字决定了对象在映射中的存储位置，检索对象时必须提供相应的关键字，就像在字典中查单词一样。关键字应该是唯一的。map没有继承Collection接口，Map提供key到value的映射。一个Map中 不能包含相同的key，每个key只能映射一个value。Map接口提供3种集合的视图，Map的内容可以被当作一组key集合，一组value集合， 或者一组key-value映射。 Hashtable类 Hashtable继承Map接口，实现一个key-value映射的哈希表。任何非空（non-null）的对象都可作为key或者value。 添加数据使用put(key, value)，取出数据使用get(key)，这两个基本操作的时间开销为常数。 Hashtable 通过initial capacity和load factor两个参数调整性能。通常缺省的load factor [...]]]></description>
			<content:encoded><![CDATA[<p>集合类存放于java.util包中。存放的都是对象的引用，而非对象本身，出于表达上的便利，我们称集合中的对象就是指集合中对象的引用（reference)。<br />
集合类型主要有3种：set(集）、list(列表）和map(映射)。<br />
3种类型都是接口，是不能被NEW 的，要想初始化一个对象，只能NEW它的实现类。<br />
1）set集<br />
集（set）是最简单的一种集合，它的对象不按特定方式排序，只是简单地把对象加入集合中，就像往口袋里放东西。对集中成员的访问和操作是通过集中对象的引用进行的，所以集中不能有重复对象。（set）集也有多种变体，可以实现排序等功能，如TreeSet（在（set）集中实现排序功能），它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口，也就是加入了对象比较的方法。通过对集中的对象迭代，我们可以得到一个升序的对象集合。<br />
Set的功能方法<br />
Set(interface): 存入Set的每个元素必须是唯一的，因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。<br />
HashSet: 为快速查找而设计的Set。存入HashSet的对象必须定义hashCode()。<br />
TreeSet: 保持次序的Set，底层为树结构。使用它可以从Set中提取有序的序列。<br />
LinkedHashSet: 具有HashSet的查询速度，且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时，结果会按元素插入的次序显示。<br />
HashSet采用散列函数对元素进行排序，这是专门为快速查询而设计的；TreeSet采用红黑树的数据结构进行排序元 素；LinkedHashSet内部使用散列以加快查询速度，同时使用链表维护元素的次序，使得看起来元素是以插入的顺序保存的。需要注意的是，生成自己 的类时，Set需要维护元素的存储顺序，因此要实现Comparable接口并定义compareTo()方法<span id="more-486"></span><br />
2）list列表<br />
列表的主要特征是其对象以线性方式存储，没有特定顺序，只有一个开头和一个结尾，当然，它与根本没有顺序的集是不同的。<br />
列表在数据结构中分别表现为：数组和向量、链表、堆栈、队列。<br />
关于实现列表的集合类，是我们日常工作中经常用到的。<br />
List的功能方法<br />
List(interface): 次序是List最重要的特点；它确保维护元素特定的顺序。List为Collection添加了许多方法，使得能够向List中间插入与移除元素(只推荐 LinkedList使用)。一个List可以生成ListIterator，使用它可以从两个方向遍历List，也可以从List中间插入和删除元素。<br />
ArrayList: 由数组实现的List。它允许对元素进行快速随机访问，但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList，而不是用来插入和删除元素，因为这比LinkedList开销要大很多。<br />
LinkedList: 对顺序访问进行了优化，向List中间插入与删除得开销不大，随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、 addLast()、getFirst()、getLast()、removeFirst()、removeLast()，这些方法(没有在任何接口或基 类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。<br />
Vector类<br />
Vector非常类似ArrayList，但是Vector是同 步的。由Vector创建的Iterator，虽然和ArrayList创建的Iterator是同一接口，但是，因为Vector是同步的，当一个 Iterator被创建而且正在被使用，另一个线程改变了Vector的状态（例如，添加或删除了一些元素），这时调用Iterator的方法时将抛出 ConcurrentModificationException，因此必须捕获该异常。</p>
<p>Stack 类<br />
Stack继承自 Vector，实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法，还有peek方 法得到栈顶的元素，empty方法测试堆栈是否为空，search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。</p>
<p>3）map映射<br />
映射与集或列表有明显区别，映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字（Key）对象，关键字决定了对象在映射中的存储位置，检索对象时必须提供相应的关键字，就像在字典中查单词一样。关键字应该是唯一的。map没有继承Collection接口，Map提供key到value的映射。一个Map中 不能包含相同的key，每个key只能映射一个value。Map接口提供3种集合的视图，Map的内容可以被当作一组key集合，一组value集合， 或者一组key-value映射。<br />
Hashtable类<br />
Hashtable继承Map接口，实现一个key-value映射的哈希表。任何非空（non-null）的对象都可作为key或者value。<br />
添加数据使用put(key, value)，取出数据使用get(key)，这两个基本操作的时间开销为常数。<br />
Hashtable 通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的 均衡。增大load factor可以节省空间但相应的查找时间将增大，这会影响像get和put这样的操作。<br />
使用Hashtable的简单示例如下，将1，2，3放到Hashtable中，他们的key分别是”one”，”two”，”three”：<br />
Hashtable numbers = new Hashtable();<br />
numbers.put(“one”, new Integer(1));<br />
numbers.put(“two”, new Integer(2));<br />
numbers.put(“three”, new Integer(3));<br />
要取出一个数，比如2，用相应的key：<br />
Integer n = (Integer)numbers.get(“two”);<br />
System.out.println(“two = ” + n);<br />
由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置，因此任何作为key的对象都必须实现hashCode和equals方 法。hashCode和equals方法继承自根类Object，如果你用自定义的类当作key的话，要相当小心，按照散列函数的定义，如果两个对象相 同，即obj1.equals(obj2)=true，则它们的hashCode必须相同，但如果两个对象不同，则它们的hashCode不一定不同，如 果两个不同对象的hashCode相同，这种现象称为冲突，冲突会导致操作哈希表的时间开销增大，所以尽量定义好的hashCode()方法，能加快哈希 表的操作。<br />
如果相同的对象有不同的hashCode，对哈希表的操作会出现意想不到的结果（期待的get方法返回null），要避免这种问题，只需要牢记一条：要同时复写equals方法和hashCode方法，而不要只写其中一个。<br />
Hashtable是同步的。</p>
<p>HashMap类<br />
HashMap和Hashtable类似，不同之处在于HashMap是非同步的，并且允许null，即null value和null key。，但 是将HashMap视为Collection时（values()方法可返回Collection），其迭代子操作时间开销和HashMap的容量成比 例。因此，如果迭代操作的性能相当重要的话，不要将HashMap的初始化容量设得过高，或者load factor过低。</p>
<p>WeakHashMap类<br />
WeakHashMap是一种改进的HashMap，它对key实行“弱引用”，如果一个key不再被外部所引用，那么该key可以被GC回收。</p>
<p>总结<br />
如果涉及到堆栈，队列等操作，应该考虑用List，对于需要快速插入，删除元素，应该使用LinkedList，如果需要快速随机访问元素，应该使用ArrayList。<br />
如果程序在单线程环境中，或者访问仅仅在一个线程中进行，考虑非同步的类，其效率较高，如果多个线程可能同时操作一个类，应该使用同步的类。<br />
要特别注意对哈希表的操作，作为key的对象要正确复写equals和hashCode方法。<br />
尽量返回接口而非实际的类型，如返回List而非ArrayList，这样如果以后需要将ArrayList换成LinkedList时，客户端代码不用改变。这就是针对抽象编程。</p>
<p>同步性<br />
Vector 是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的，因此ArrayList中的对象并不是线程安全 的。因为同步的要求会影响执行的效率，所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择，这样可以避免由于同步带来的不必要的 性能开销。<br />
数据增长<br />
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类 型中增加元素的时候，如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度，Vector缺省情况下自动增长原来一倍的数组长 度，ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用 Vector有一些优势，因为你可以通过设置集合的初始化大小来避免不必要的资源开销。<br />
使用模式<br />
在ArrayList和Vector中， 从一个指定的位置（通过索引）查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的，这个时间我们用O(1)表示。但是，如果在集合的其他位 置增加或移除元素那么花费的时间会呈线形增长：O(n-i)，其中n代表集合中元素的个数，i代表元素增加或移除元素的索引位置。为什么会这样呢？以为在 进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢？<br />
这意味着，你只是查找特定位置的元素或只在集 合的末端增加、移除元素，那么使用Vector或ArrayList都可以。如果是其他操作，你最好选择其他的集合操作类。比如，LinkList集合类 在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1)，但它在索引一个元素的使用缺比较慢－O(i),其中i是索引的位置.使用 ArrayList也很容易，因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象，所有你要 明白它也会带来额外的开销。<br />
最后，在《Practical Java》一书中Peter Haggar建议使用一个简单的数组（Array）来代 替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分 配空间的操作。</p>
<p>Hashtable基本用法概述<br />
Hashtable-哈希表类<br />
以哈希表的形式存储数据,数据的形式是键值对.<br />
特点:<br />
查找速度快,遍历相对慢<br />
键值不能有空指针和重复数据<br />
创建<br />
Hashtable&lt;Integer,String&gt; ht=new Hashtable&lt;Integer,String&gt;();<br />
添值<br />
ht.put(1,&#8221;Andy&#8221;);<br />
ht.put(2,&#8221;Bill&#8221;);<br />
ht.put(3,&#8221;Cindy&#8221;);<br />
ht.put(4,&#8221;Dell&#8221;);<br />
ht.put(5,&#8221;Felex&#8221;);<br />
ht.put(6,&#8221;Edinburg&#8221;);<br />
ht.put(7,&#8221;Green&#8221;);<br />
取值<br />
String str=ht.get(1);<br />
System.out.println(str);// Andy<br />
对键进行遍历<br />
Iterator it = ht.keySet().iterator();<br />
while (it.hasNext()) {<br />
Integer key = (Integer)it.next();<br />
System.out.println(key);<br />
}<br />
对值进行遍历<br />
Iterator it = ht.values().iterator();<br />
while (it.hasNext()) {<br />
String value =(String) it.next();<br />
System.out.println(value);<br />
}<br />
取Hashtable记录数<br />
Hashtable&lt;Integer,String&gt; ht=new Hashtable&lt;Integer,String&gt;();<br />
ht.put(1,&#8221;Andy&#8221;);<br />
ht.put(2,&#8221;Bill&#8221;);<br />
ht.put(3,&#8221;Cindy&#8221;);<br />
ht.put(4,&#8221;Dell&#8221;);<br />
ht.put(5,&#8221;Felex&#8221;);<br />
ht.put(6,&#8221;Edinburg&#8221;);<br />
ht.put(7,&#8221;Green&#8221;);<br />
int i=ht.size();// 7<br />
删除元素<br />
Hashtable&lt;Integer,String&gt; ht=new Hashtable&lt;Integer,String&gt;();<br />
ht.put(1,&#8221;Andy&#8221;);<br />
ht.put(2,&#8221;Bill&#8221;);<br />
ht.put(3,&#8221;Cindy&#8221;);<br />
ht.put(4,&#8221;Dell&#8221;);<br />
ht.put(5,&#8221;Felex&#8221;);<br />
ht.put(6,&#8221;Edinburg&#8221;);<br />
ht.put(7,&#8221;Green&#8221;);<br />
ht.remove(1);<br />
ht.remove(2);<br />
ht.remove(3);<br />
ht.remove(4);<br />
System.out.println(ht.size());// 3</p>
<p>Iterator it = ht.values().iterator();<br />
while (it.hasNext()) {<br />
// Get value<br />
String value =(String) it.next();<br />
System.out.println(value);<br />
}<br />
输出:<br />
3<br />
Green<br />
Edinburg<br />
Felex</p>
<p>java中的hashcode()和equals()方法详解<br />
1. 首先equals()和hashcode()这两个方法都是从object类中继承过来的。<br />
equals()方法在object类中定义如下：<br />
public boolean equals(Object obj) {<br />
return (this == obj);<br />
}<br />
很明显是对两个对象的地址值进行的比较（即比较引用是否相同）。但是我们必需清楚，当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时，已经覆盖了object类的equals（）方法。比 如在String类中如下：<br />
public boolean equals(Object anObject) {<br />
if (this == anObject) {<br />
return true;<br />
}<br />
if (anObject instanceof String) {<br />
String anotherString = (String)anObject;<br />
int n = count;<br />
if (n == anotherString.count) {<br />
char v1[] = value;<br />
char v2[] = anotherString.value;<br />
int i = offset;<br />
int j = anotherString.offset;<br />
while (n&#8211; != 0) {<br />
if (v1[i++] != v2[j++])<br />
return false;<br />
}<br />
return true;<br />
}<br />
}<br />
return false;<br />
}<br />
很明显，这是进行的内容比较，而已经不再是地址的比较。依次类推Double、Integer、Math。。。。等等这些类都是重写了equals()方法的，从而进行的是内容的比较。当然了基本类型是进行值的比较，这个没有什么好说的。<br />
我们还应该注意，Java语言对equals()的要求如下，这些要求是必须遵循的：<br />
• 对称性：如果x.equals(y)返回是“true”，那么y.equals(x)也应该返回是“true”。<br />
• 反射性：x.equals(x)必须返回是“true”。<br />
• 类推性：如果x.equals(y)返回是“true”，而且y.equals(z)返回是“true”，那么z.equals(x)也应该返回是“true”。<br />
• 还有一致性：如果x.equals(y)返回是“true”，只要x和y内容一直不变，不管你重复x.equals(y)多少次，返回都是“true”。<br />
• 任何情况下，x.equals(null)，永远返回是“false”；x.equals(和x不同类型的对象)永远返回是“false”。<br />
以上这五点是重写equals()方法时，必须遵守的准则，如果违反会出现意想不到的结果，请大家一定要遵守。<br />
2. 其次是hashcode() 方法，在object类中定义如下：<br />
public native int hashCode();<br />
说明是一个本地方法，它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法，比如String、Integer、 Double。。。。等等这些类都是覆盖了hashcode()方法的。例如在String类中定义的hashcode()方法如下：<br />
public int hashCode() {<br />
int h = hash;<br />
if (h == 0) {<br />
int off = offset;<br />
char val[] = value;<br />
int len = count;<br />
for (int i = 0; i &lt; len; i++) {<br />
h = 31*h + val[off++];<br />
}<br />
hash = h;<br />
}<br />
return h;<br />
}<br />
解释一下这个程序（String的API中写到）：<br />
s[0]*31^(n-1) + s[1]*31^(n-2) + &#8230; + s[n-1]<br />
使用 int 算法，这里 s[i] 是字符串的第 i 个字符，n 是字符串的长度，^ 表示求幂。（空字符串的哈希码为 0。）</p>
<p>3.这里我们首先要明白一个问题：<br />
equals()相等的两个对象，hashcode()一定相等；<br />
equals（）不相等的两个对象，却并不能证明他们的hashcode()不相等。换句话说，equals()方法不相等的两个对象，hashcode()有可能相等。（我的理解是由于哈希码在生成的时候产生冲突造成的）。<br />
反过来：hashcode()不等，一定能推出equals()也不等；hashcode()相等，equals()可能相等，也可能不等。解释 下第3点的使用范围，我的理解是在object、String等类中都能使用。在object类中，hashcode()方法是本地方法，返回的是对象的 地址值，而object类中的equals()方法比较的也是两个对象的地址值，如果equals()相等，说明两个对象地址值也相等，当然 hashcode()也就相等了；在String类中，equals()返回的是两个对象内容的比较，当两个对象内容相等时，<br />
Hashcode()方法根据String类的重写（第2点里面已经分析了）代码的分析，也可知道hashcode()返回结果也会相等。以此 类推，可以知道Integer、Double等封装类中经过重写的equals()和hashcode()方法也同样适合于这个原则。当然没有经过重写的 类，在继承了object类的equals()和hashcode()方法后，也会遵守这个原则。</p>
<p>4.谈到hashcode()和equals()就不能不说到hashset,hashmap,hashtable中的使用，具体是怎样呢，请看如下分析：<br />
Hashset是继承Set接口，Set接口又实现Collection接口，这是层次关系。那么hashset是根据什么原理来存取对象的呢？<br />
在hashset中不允许出现重复对象，元素的位置也是不确定的。在hashset中又是怎样判定元素是否重复的呢？这就是问题的关键所在，经过一下午的查询求证终于获得了一点启示，和大家分享一下，在java的集合中，判断两个对象是否相等的规则是：<br />
1)，判断两个对象的hashCode是否相等<br />
如果不相等，认为两个对象也不相等，完毕<br />
如果相等，转入2<br />
（这一点只是为了提高存储效率而要求的，其实理论上没有也可以，但如果没有，实际使用时效率会大大降低，所以我们这里将其做为必需的。后面会重点讲到这个问题。）<br />
2)，判断两个对象用equals运算是否相等<br />
如果不相等，认为两个对象也不相等<br />
如果相等，认为两个对象相等（equals()是判断两个对象是否相等的关键）<br />
为什么是两条准则，难道用第一条不行吗？不行，因为前面已经说了，hashcode()相等时，equals()方法也可能不等，所以必须用第2条准则进行限制，才能保证加入的为非重复元素。<br />
比如下面的代码：</p>
<p>public static void main(String args[]){<br />
String s1=new String(&#8220;zhaoxudong&#8221;);<br />
String s2=new String(&#8220;zhaoxudong&#8221;);<br />
System.out.println(s1==s2);//false<br />
System.out.println(s1.equals(s2));//true<br />
System.out.println(s1.hashCode());//s1.hashcode()等于s2.hashcode()<br />
System.out.println(s2.hashCode());<br />
Set hashset=new HashSet();<br />
hashset.add(s1);<br />
hashset.add(s2);<br />
/*实质上在添加s1,s2时，运用上面说到的两点准则，可以知道hashset认为s1和s2是相等的，是在添加重复元素，所以让s2覆盖了s1;*/<br />
Iterator it=hashset.iterator();<br />
while(it.hasNext())<br />
{<br />
System.out.println(it.next());<br />
}<br />
最后在while循环的时候只打印出了一个”zhaoxudong”。<br />
输出结果为：false<br />
true<br />
-967303459<br />
-967303459<br />
这是因为String类已经重写了equals()方法和hashcode()方法，所以在根据上面的第1.2条原则判定时，hashset认为它们是相等的对象，进行了重复添加。<br />
但是看下面的程序：<br />
import java.util.*;<br />
public class HashSetTest {<br />
public static void main(String[] args)     {<br />
HashSet hs=new HashSet();<br />
hs.add(new Student(1,&#8221;zhangsan&#8221;));<br />
hs.add(new Student(2,&#8221;lisi&#8221;));<br />
hs.add(new Student(3,&#8221;wangwu&#8221;));<br />
hs.add(new Student(1,&#8221;zhangsan&#8221;));</p>
<p>Iterator it=hs.iterator();<br />
while(it.hasNext())      {<br />
System.out.println(it.next());<br />
}<br />
}<br />
}<br />
class Student    {<br />
int num;<br />
String name;<br />
Student(int num,String name)  {<br />
this.num=num;<br />
this.name=name;<br />
}<br />
public String toString()    {<br />
return num+&#8221;:&#8221;+name;<br />
}<br />
}<br />
输出结果为：<br />
1:zhangsan<br />
1:zhangsan<br />
3:wangwu<br />
2:lisi<br />
问题出现了，为什么hashset添加了相等的元素呢，这是不是和hashset的原则违背了呢？回答是：没有<br />
因为在根据hashcode()对两次建立的new Student(1,&#8221;zhangsan&#8221;)对象进行比较时，生成的是不同的哈希码值，所以hashset把他当作不同的对象对待了，当然此时的 equals()方法返回的值也不等（这个不用解释了吧）。那么为什么会生成不同的哈希码值呢？上面我们在比较s1和s2的时候不是生成了同样的哈希码 吗？原因就在于我们自己写的Student类并没有重新自己的hashcode()和equals()方法，所以在比较时，是继承的object类中的 hashcode()方法，呵呵，各位还记得object类中的hashcode()方法比较的是什么吧！！<br />
它是一个本地方法，比较的是对象的地址（引用地址），使用new方法创建对象，两次生成的当然是不同的对象了（这个大家都能理解吧。。。），造 成的结果就是两个对象的hashcode()返回的值不一样。所以根据第一个准则，hashset会把它们当作不同的对象对待，自然也用不着第二个准则进 行判定了。那么怎么解决这个问题呢？？<br />
答案是：在Student类中重新hashcode()和equals()方法。<br />
例如：<br />
class Student {<br />
int num;<br />
String name;<br />
Student(int num,String name) {<br />
this.num=num;<br />
this.name=name;<br />
}<br />
public int hashCode() {<br />
return num*name.hashCode();<br />
}<br />
public boolean equals(Object o) {<br />
Student s=(Student)o;<br />
return num==s.num &amp;&amp; name.equals(s.name);<br />
}<br />
public String toString() {<br />
return num+&#8221;:&#8221;+name;<br />
}<br />
}<br />
根据重写的方法，即便两次调用了new Student(1,&#8221;zhangsan&#8221;)，我们在获得对象的哈希码时，根据重写的方法hashcode()，获得的哈希码肯定是一样的（这一点应该没有疑问吧）。<br />
当然根据equals()方法我们也可判断是相同的。所以在向hashset集合中添加时把它们当作重复元素看待了。所以运行修改后的程序时，我们会发现运行结果是：<br />
1:zhangsan<br />
3:wangwu<br />
2:lisi<br />
可以看到重复元素的问题已经消除。<br />
关于在hibernate的pojo类中，重新equals()和hashcode()的问题：<br />
1)，重点是equals，重写hashCode只是技术要求（为了提高效率）<br />
2)，为什么要重写equals呢，因为在java的集合框架中，是通过equals来判断两个对象是否相等的<br />
3)，在hibernate中，经常使用set集合来保存相关对象，而set集合是不允许重复的。我们再来谈谈前面提到在向hashset集合中添加元素时,怎样判断对象是否相同的准则，前面说了两条，其实只要重写equals()这一条也可以。<br />
但当hashset中元素比较多时，或者是重写的equals()方法比较复杂时，我们只用equals()方法进行比较判断，效率也会非常低， 所以引入了hashcode()这个方法，只是为了提高效率，但是我觉得这是非常有必要的（所以我们在前面以两条准则来进行hashset的元素是否重复 的判断）。<br />
比如可以这样写：<br />
public int hashCode(){<br />
return  1;}//等价于hashcode无效<br />
这样做的效果就是在比较哈希码的时候不能进行判断，因为每个对象返回的哈希码都是1，每次都必须要经过比较equals()方法后才能进行判断是否重复，这当然会引起效率的大大降低。<br />
我有一个问题，如果像前面提到的在hashset中判断元素是否重复的必要方法是equals()方法（根据网上找到的观点），但是这里并没有涉及到关于哈希表的问题，可是这个集合却叫hashset，这是为什么？？<br />
我想，在hashmap,hashtable中的存储操作，依然遵守上面的准则。<br />
散列表的概念</p>
<p>1、散列表<br />
设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K（|K|比|U|小得多）。<br />
散列方法是使用函数h将U映射到表T[0..m-1]的下标上（m=O(|U|)）。这样以U中关键字为自变量，以h为函数的运算结果就是相应结点的存储地址。从而达到在O(1)时间内就可完成查找。<br />
其中：<br />
① h：U→{0，1，2，…，m-1} ，通常称h为散列函数(Hash Function)。散列函数h的作用是压缩待处理的下标范围，使待处理的|U|个值减少到m个值，从而降低空间开销。<br />
② T为散列表(Hash Table)。<br />
③ h(Ki)(Ki∈U)是关键字为Ki结点存储地址(亦称散列值或散列地址)。<br />
④ 将结点按其关键字的散列地址存储到散列表中的过程称为散列(Hashing)</p>
<p>3、散列表的冲突现象<br />
（1）冲突<br />
两个不同的关键字，由于散列函数值相同，因而被映射到同一表位置上。该现象称为冲突(Collision)或碰撞。发生冲突的两个关键字称为该散列函数的同义词(Synonym)。<br />
【例】上图中的k2≠k5，但h(k2)=h(k5)，故k2和K5所在的结点的存储地址相同。</p>
<p>（2）安全避免冲突的条件<br />
最理想的解决冲突的方法是安全避免冲突。要做到这一点必须满足两个条件：<br />
①其一是|U|≤m<br />
②其二是选择合适的散列函数。<br />
这只适用于|U|较小，且关键字均事先已知的情况，此时经过精心设计散列函数h有可能完全避免冲突。</p>
<p>（3）冲突不可能完全避免<br />
通常情况下，h是一个压缩映像。虽然|K|≤m，但|U|&gt;m，故无论怎样设计h，也不可能完全避免冲突。因此，只能在设计h时尽可能使冲突最少。同时还需要确定解决冲突的方法，使发生冲突的同义词能够存储到表中。</p>
<p>（4）影响冲突的因素<br />
冲突的频繁程度除了与h相关外，还与表的填满程度相关。<br />
设m和n分别表示表长和表中填人的结点数，则将α=n/m定义为散列表的装填因子(Load Factor)。α越大，表越满，冲突的机会也越大。通常取α≤1。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/09/java_collection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利于ThreadLocal管理JDBC的Connection</title>
		<link>http://www.javachen.com/2009/05/threadlocal_jdbc_connection/</link>
		<comments>http://www.javachen.com/2009/05/threadlocal_jdbc_connection/#comments</comments>
		<pubDate>Sun, 17 May 2009 13:33:55 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[JDBC]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=194</guid>
		<description><![CDATA[package com.kettas.jdbc.student.util; &#160; import java.sql.*; import java.util.Properties; import java.io.*; public class JdbcUtil &#123; private static Properties props=new Properties&#40;&#41;; private static final ThreadLocal&#60;connection&#62; tl=new ThreadLocal&#60;/connection&#62;&#60;connection&#62;&#40;&#41;; static &#123; try &#123; InputStream is=JdbcUtil.class.getResourceAsStream&#40;&#34;/com/kettas/jdbc/student/confg/config.properties&#34;&#41;; props.load&#40;is&#41;; is.close&#40;&#41;; &#125; catch &#40;Exception e&#41; &#123; //throw new ExceptionInInitializerError(e); &#125; &#125; &#160; public static Connection getConnection&#40;&#41; throws Exception&#123; Connection conn=tl.get&#40;&#41;; if&#40;conn==null&#41;&#123; Class.forName&#40;props.getProperty&#40;&#34;driver&#34;&#41;&#41;; conn=DriverManager.getConnection&#40;props.getProperty&#40;&#34;url&#34;&#41;, props.getProperty&#40;&#34;username&#34;&#41;, [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.kettas.jdbc.student.util</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.sql.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Properties</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JdbcUtil <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399; font-weight: bold;">Properties</span> props=<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">Properties</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> ThreadLocal<span style="color: #339933;">&lt;</span>connection<span style="color: #339933;">&gt;</span> tl=<span style="color: #000000; font-weight: bold;">new</span> ThreadLocal<span style="color: #339933;">&lt;</span>/connection<span style="color: #339933;">&gt;&lt;</span>connection<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399; font-weight: bold;">InputStream</span> is=JdbcUtil.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getResourceAsStream</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/com/kettas/jdbc/student/confg/config.properties&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			props.<span style="color: #006633;">load</span><span style="color: #009900;">&#40;</span>is<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			is.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">//throw  new ExceptionInInitializerError(e);</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #003399; font-weight: bold;">Connection</span> getConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399; font-weight: bold;">Exception</span><span style="color: #009900;">&#123;</span>
		<span style="color: #003399; font-weight: bold;">Connection</span> conn=tl.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>conn==<span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #003399; font-weight: bold;">Class</span>.<span style="color: #006633;">forName</span><span style="color: #009900;">&#40;</span>props.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;driver&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			conn=<span style="color: #003399; font-weight: bold;">DriverManager</span>.<span style="color: #006633;">getConnection</span><span style="color: #009900;">&#40;</span>props.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;url&quot;</span><span style="color: #009900;">&#41;</span>, props.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;username&quot;</span><span style="color: #009900;">&#41;</span>, props.<span style="color: #006633;">getProperty</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;password&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			tl.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>conn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> conn<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #006600; font-weight: bold;">void</span> releaseConnection<span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">ResultSet</span> rs,<span style="color: #003399; font-weight: bold;">Statement</span> stm,<span style="color: #003399; font-weight: bold;">Connection</span> conn<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000000;  font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>rs<span style="color: #339933;">!</span>=<span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>rs.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">SQLException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
				<span style="color: #000000;  font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>stm<span style="color: #339933;">!</span>=<span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>  <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>stm.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">SQLException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	<span style="color: #009900;">&#125;</span>
				<span style="color: #000000;  font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>conn<span style="color: #339933;">!</span>=<span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>  <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>conn.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">SQLException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;</span>/connection<span style="color: #339933;">&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/05/threadlocal_jdbc_connection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA中IO流的分类</title>
		<link>http://www.javachen.com/2009/05/java_io/</link>
		<comments>http://www.javachen.com/2009/05/java_io/#comments</comments>
		<pubDate>Sat, 16 May 2009 10:13:48 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[IO]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=152</guid>
		<description><![CDATA[1. stream代表的是任何有能力产出数据的数据源，或是任何有能力接收数据的接收源。在Java的IO中，所有的stream（包括Input和Out stream）都包括两种类型： 1.1 以字节为导向的stream 以字节为导向的stream，表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型： 1&#62;. input　stream 1) ByteArrayInputStream：把内存中的一个缓冲区作为InputStream使用 2) StringBufferInputStream：把一个String对象作为InputStream 3) FileInputStream：把一个文件作为InputStream，实现对文件的读取操作 4) PipedInputStream：实现了pipe的概念，主要在线程中使用 5) SequenceInputStream：把多个InputStream合并为一个InputStream 2&#62;. Out　stream 1) ByteArrayOutputStream：把信息存入内存中的一个缓冲区中 2) FileOutputStream：把信息存入文件中 3) PipedOutputStream：实现了pipe的概念，主要在线程中使用 4) SequenceOutputStream：把多个OutStream合并为一个OutStream ======================================================================= 1.2 以Unicode字符为导向的stream 以Unicode字符为导向的stream，表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型： 1&#62;. Input　Stream 1) CharArrayReader：与ByteArrayInputStream对应 2) StringReader：与StringBufferInputStream对应 3) FileReader：与FileInputStream对应 4) PipedReader：与PipedInputStream对应 2&#62;. Out　Stream 1) CharArrayWrite：与ByteArrayOutputStream对应 2) StringWrite：无与之对应的以字节为导向的stream 3) FileWrite：与FileOutputStream对应 4) PipedWrite：与PipedOutputStream对应 以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同，字是在操作时的导向不同。如 CharArrayReader：和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用，所不同的是前者每次从内存中读取一个字节的信息，而后者每次从内存中读取一个字符。 ======================================================================= [...]]]></description>
			<content:encoded><![CDATA[<p>1. stream代表的是任何有能力产出数据的数据源，或是任何有能力接收数据的接收源。在Java的IO中，所有的stream（包括Input和Out stream）都包括两种类型：<br />
1.1 以字节为导向的stream<br />
以字节为导向的stream，表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型：<br />
1&gt;. input　stream<br />
1) ByteArrayInputStream：把内存中的一个缓冲区作为InputStream使用<br />
2) StringBufferInputStream：把一个String对象作为InputStream<br />
3) FileInputStream：把一个文件作为InputStream，实现对文件的读取操作<br />
4) PipedInputStream：实现了pipe的概念，主要在线程中使用<br />
5) SequenceInputStream：把多个InputStream合并为一个InputStream<span id="more-152"></span></p>
<p>2&gt;. Out　stream<br />
1) ByteArrayOutputStream：把信息存入内存中的一个缓冲区中<br />
2) FileOutputStream：把信息存入文件中<br />
3) PipedOutputStream：实现了pipe的概念，主要在线程中使用<br />
4) SequenceOutputStream：把多个OutStream合并为一个OutStream<br />
=======================================================================<br />
1.2 以Unicode字符为导向的stream<br />
以Unicode字符为导向的stream，表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型：<br />
1&gt;. Input　Stream<br />
1) CharArrayReader：与ByteArrayInputStream对应<br />
2) StringReader：与StringBufferInputStream对应<br />
3) FileReader：与FileInputStream对应<br />
4) PipedReader：与PipedInputStream对应</p>
<p>2&gt;. Out　Stream<br />
1) CharArrayWrite：与ByteArrayOutputStream对应<br />
2) StringWrite：无与之对应的以字节为导向的stream<br />
3) FileWrite：与FileOutputStream对应<br />
4) PipedWrite：与PipedOutputStream对应<br />
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同，字是在操作时的导向不同。如 CharArrayReader：和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用，所不同的是前者每次从内存中读取一个字节的信息，而后者每次从内存中读取一个字符。<br />
=======================================================================<br />
1.3 两种不现导向的stream之间的转换<br />
InputStreamReader和OutputStreamReader：把一个以字节为导向的stream转换成一个以字符为导向的stream。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
2. stream添加属性<br />
2.1 “为stream添加属性”的作用<br />
运用上面介绍的Java中操作IO的API，我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类，我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。<br />
如果我们要往一个文件中写入数据，我们可以这样操作：<br />
FileOutStream fs = new FileOutStream(“test.txt”);<br />
然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是，如果我们想实现“先把要写入文件的数据先缓存到内存中，再把缓存中的数据写入文件中”的功能时，上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和 FilterOutStream的子类，为FileOutStream添加我们所需要的功能。</p>
<p>2.2 FilterInputStream的各种类型<br />
2.2.1 用于封装以字节为导向的InputStream<br />
1) DataInputStream：从stream中读取基本类型（int、char等）数据。<br />
2) BufferedInputStream：使用缓冲区<br />
3) LineNumberInputStream：会记录input stream内的行数，然后可以调用getLineNumber()和setLineNumber(int)<br />
4) PushbackInputStream：很少用到，一般用于编译器开发</p>
<p>2.2.2 用于封装以字符为导向的InputStream<br />
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader，否则使用DataInputStream<br />
2) BufferedReader：与BufferedInputStream对应<br />
3) LineNumberReader：与LineNumberInputStream对应<br />
4) PushBackReader：与PushbackInputStream对应</p>
<p>2.3 FilterOutStream的各种类型<br />
2.2.3 用于封装以字节为导向的OutputStream<br />
1) DataIOutStream：往stream中输出基本类型（int、char等）数据。<br />
2) BufferedOutStream：使用缓冲区<br />
3) PrintStream：产生格式化输出</p>
<p>2.2.4 用于封装以字符为导向的OutputStream<br />
1) BufferedWrite：与对应<br />
2) PrintWrite：与对应</p>
<p>3. RandomAccessFile<br />
1) 可通过RandomAccessFile对象完成对文件的读写操作<br />
2) 在产生一个对象时，可指明要打开的文件的性质：r，只读；w，只写；rw可读写<br />
3) 可以直接跳到文件中指定的位置<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>Java IO的一般使用原则：<br />
一、按数据来源（去向）分类：<br />
1、是文件： FileInputStream, FileOutputStream, FileReader, FileWriter<br />
2、是byte[]：ByteArrayInputStream, ByteArrayOutputStream<br />
3、是Char[]: CharArrayReader, CharArrayWriter<br />
4、是String: StringBufferInputStream, StringReader, StringWriter<br />
5、网络数据流：InputStream, OutputStream, Reader, Writer</p>
<p>二、按是否格式化输出分：<br />
1、要格式化输出：PrintStream, PrintWriter</p>
<p>三、按是否要缓冲分：<br />
1、要缓冲：BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter</p>
<p>四、按数据格式分：<br />
1、二进制格式（只要不能确定是纯文本的）: InputStream, OutputStream及其所有带Stream结束的子类<br />
2、纯文本格式（含纯英文与汉字或其他编码方式）；Reader, Writer及其所有带Reader, Writer的子类</p>
<p>五、按输入输出分：<br />
1、输入：Reader, InputStream类型的子类<br />
2、输出：Writer, OutputStream类型的子类</p>
<p>六、特殊需要：<br />
1、从Stream到Reader,Writer的转换类：InputStreamReader, OutputStreamWriter<br />
2、对象输入输出：ObjectInputStream, ObjectOutputStream<br />
3、进程间通信：PipeInputStream, PipeOutputStream, PipeReader, PipeWriter<br />
4、合并输入：SequenceInputStream<br />
5、更特殊的需要：PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader</p>
<p>决定使用哪个类以及它的构造进程的一般准则如下（不考虑特殊需要）：<br />
首先，考虑最原始的数据格式是什么： 原则四<br />
第二，是输入还是输出：原则五<br />
第三，是否需要转换流：原则六第1点<br />
第四，数据来源（去向）是什么：原则一<br />
第五，是否要缓冲：原则三 （特别注明：一定要注意的是readLine()是否有定义，有什么比read, write更特殊的输入或输出方法）<br />
第六，是否要格式化输出：原则二<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>关于代码的解释（以区为单位）：<br />
1区中，当读取文件时，先把文件内容读到缓存中，当调用in.readLine()时，再从缓存中以字符的方式读取数据（以下简称“缓存字节读取方式”）。<br />
1b区中，由于想以缓存字节读取方式从标准IO（键盘）中读取数据，所以要先把标准IO（System.in）转换成字符导向的stream，再进行BufferedReader封装。<br />
2区中，要以字符的形式从一个String对象中读取数据，所以要产生一个StringReader类型的stream。<br />
4区中，对String对象s2读取数据时，先把对象中的数据存入缓存中，再从缓冲中进行读取；对TestIO.out文件进行操作时，先把格式化后的信息输出到缓存中，再把缓存中的信息输出到文件中。<br />
5 区中，对Data.txt文件进行输出时，是先把基本类型的数据输出屋缓存中，再把缓存中的数据输出到文件中；对文件进行读取操作时，先把文件中的数据读取到缓存中，再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入第一个writeDouble()，所以为了正确显示。也要以基本类型的形式进行读取。<br />
6区是通过RandomAccessFile类对文件进行操作。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/05/java_io/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java集合框架使用总结</title>
		<link>http://www.javachen.com/2009/05/java_colletion/</link>
		<comments>http://www.javachen.com/2009/05/java_colletion/#comments</comments>
		<pubDate>Sat, 16 May 2009 10:11:31 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[collection]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=149</guid>
		<description><![CDATA[Java集合框架使用总结 1、集合框架 Collection是集合接口         &#124;————Set子接口:无序，不允许重复。         &#124;————List子接口:有序，可以有重复元素。   区别：Collections是集合类   Set和List对比： Set：检索元素效率低下，删除和插入效率高，插入和删除不会引起元素位置改变。 List：和数组类似，List可以动态增长，查找元素效率高，插入删除元素效率低，因为会引起其他元素位置改变。   Set和List具体子类： Set  &#124;————HashSet：以哈希表的形式存放元素，插入删除速度很快。   List  &#124;————ArrayList：动态数组  &#124;————LinkedList：链表、队列、堆栈。   Array和java.util.Vector Vector是一种老的动态数组，是线程同步的，效率很低，。   2、Iterator迭代器（接口） Iterator是获取集合中元素的过程，实际上帮助获取集合中的元素。 迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同： 迭代器允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。 方法名称得到了改进。   Iterator仅有一个子接口ListIterator，是列表迭代器，允许程序员按任一方向遍历列表、迭代期间修改列表，并获得迭代器在列表中的当前位置。ListIterator 没有当前元素；它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。在长度为 n 的列表中，有 n+1 个有效的索引值，从 0 到 n（包含）。   3、集合框架之外的Map接口 Map将键映射到值的对象。一个映射不能包含重复的键；每个键最多只能映射一个值。 Map接口是Dictionary（字典）抽象类的替代品。 Map [...]]]></description>
			<content:encoded><![CDATA[<p>Java集合框架使用总结<br />
1、集合框架<br />
Collection是集合接口<br />
        |————Set子接口:无序，不允许重复。<br />
        |————List子接口:有序，可以有重复元素。<br />
 <br />
区别：Collections是集合类<br />
 <span id="more-149"></span><br />
Set和List对比：<br />
Set：检索元素效率低下，删除和插入效率高，插入和删除不会引起元素位置改变。<br />
List：和数组类似，List可以动态增长，查找元素效率高，插入删除元素效率低，因为会引起其他元素位置改变。<br />
 <br />
Set和List具体子类：<br />
Set<br />
 |————HashSet：以哈希表的形式存放元素，插入删除速度很快。<br />
 <br />
List<br />
 |————ArrayList：动态数组<br />
 |————LinkedList：链表、队列、堆栈。<br />
 <br />
Array和java.util.Vector<br />
Vector是一种老的动态数组，是线程同步的，效率很低，。<br />
 <br />
2、Iterator迭代器（接口）<br />
Iterator是获取集合中元素的过程，实际上帮助获取集合中的元素。<br />
迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同：<br />
迭代器允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。<br />
方法名称得到了改进。<br />
 <br />
Iterator仅有一个子接口ListIterator，是列表迭代器，允许程序员按任一方向遍历列表、迭代期间修改列表，并获得迭代器在列表中的当前位置。ListIterator 没有当前元素；它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。在长度为 n 的列表中，有 n+1 个有效的索引值，从 0 到 n（包含）。<br />
 <br />
3、集合框架之外的Map接口<br />
Map将键映射到值的对象。一个映射不能包含重复的键；每个键最多只能映射一个值。<br />
Map接口是Dictionary（字典）抽象类的替代品。<br />
Map 接口提供三种collection 视图，允许以键集、值集合或键-值映射关系集的形式查看某个映射的内容。映射的顺序 定义为迭代器在映射的 collection 视图中返回其元素的顺序。某些映射实现可明确保证其顺序，如 TreeMap 类；某些映射实现则不保证顺序，如 HashMap 类。<br />
 <br />
有两个常见的已实现的子类：<br />
HashMap：基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作，并允许使用 null 值和 null 键。（除了不同步和允许使用 null 之外，HashMap 类与 Hashtable 大致相同。）此类不保证映射的顺序，特别是它不保证该顺序恒久不变。<br />
 <br />
TreeMap：它实现SortedMap 接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字，根据使用的构造方法不同，可能会按照键的类的自然顺序 进行排序（参见 Comparable），或者按照创建时所提供的比较器进行排序。<br />
Hashtable：此类实现一个哈希表，该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。<br />
 <br />
4、线程安全类<br />
在集合框架中，有些类是线程安全的，这些都是JDK1.1中的出现的。在JDK1.2之后，就出现许许多多非线程安全的类。<br />
下面是这些线程安全的同步的类：<br />
Vector：就比ArrayList多了个同步化机制（线程安全）。<br />
Statck：堆栈类，先进后出。<br />
Hashtable：就比HashMap多了个线程安全。<br />
Enumeration：枚举，相当于迭代器。<br />
除了这些之外，其他的都是非线程安全的类和接口。<br />
线程安全的类其方法是同步的，每次只能一个访问。是重量级对象，效率较低。对于非线程安全的类和接口，在多线程中需要程序员自己处理线程安全问题。<br />
 <br />
5、其他一些接口和类介绍<br />
Dictionary和Hashtable类：<br />
Dictionary提供键值映射的功能，是个抽象类。一般使用它的子类HashTable类。遍历Hashtable类要用到枚举。<br />
 <br />
Properties类<br />
Properties 继承于 Hashtable，Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。一般可以通过读取properties配置文件来填充Properties对象。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/05/java_colletion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>积累！与 坚持！</title>
		<link>http://www.javachen.com/2009/05/pesist/</link>
		<comments>http://www.javachen.com/2009/05/pesist/#comments</comments>
		<pubDate>Sat, 16 May 2009 05:05:18 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[QQ]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=101</guid>
		<description><![CDATA[一不小心进了聚友网，以为这是一个以英语为手段的交流平台，遂想注册账号在里面用英语写BLOG并与人交流，没有想到这个网站是类似与校内网的交友平台。里面的内容视乎比校内网做的要好些，没有校内网那样花哨复杂，简单实用，就主要是以交友为目的，既然注册了就用用吧！就把聚友网当作交友的地方，顺便看看美女吧^_^。 记得校内网里一个不认识的朋友说过，校内网就是用来分享的，这句话把我对校内的想法完全表达出来了，校内网对于我来说根本就没有什么实际有用的价值，就除了分享一些有用的信息，漂亮的图片，以前还认为群组也非常有用，但后来慢慢感觉到群组里面的内容不够专业，不实用。三次删除校内网账号三次恢复，校内网真是苦心积虑，为了牢牢套住广大的校园学子，不允许成员彻底删除账号！ 奥运会昨天结束了，是昨天看下篮球决赛的，但由于太累昨天睡了一天，醒来时候刚好是20点，没有错过闭幕式！对于奥运会不想做出任何评价，评价不发生在我身边的事情没有任何意义！ 最近一直在忙着自己的个人网站建设，开始是想以asp.net为平台在网上搜索源代码，首先在自己的电脑上调试，在上传到空间。装好visua studio 2005 和IIS后，环境配置用了很长时间，把下好的源代码放在电脑上调试，总是出报出错误，在百度里百度了很多的解决方法都没有起作用，后来在老大的提示下知道源代码里需要数据库，我并没有设置好数据库，所以网页总是不能显示主页。怎么样建立数据库并且设置好环境变量，现在还不清楚，只好慢慢解决。。。 在网上知道了PJBLOG，于是想实用PJBLOG作为自己网站的源码。PJBLOG没有ZBLOG复杂，但起操作起来也并不容易，用FTP工具上传源码用了两小时，每次调试安装新的插件都要备份数据库，但自己总是忘记了，网页上还有几个模块不能加载，还不知道是什么原因怎么样解决。每次打开主页都是慢的不得了，比用201上江大主页还慢，不知道是空间的问题还是域名的问题，空间用的是外国的一个免费的，域名是用到万网的也是免费的，http://boykings.cn/这个空间能够免费实用一年。后开在网友那里知道了中网数据，一个国际域名一年65元，中国域名只要5元一年，于是决定用自己的昵称注册一套空间加域名总共200元，即将正式拥有自己的域名了，呵呵！！ 暑假过得真快，洛阳实习后，在学校上网看电影荒废了10天，在极度空虚的时候，听了好友的一番话，觉得自己不应该放弃难得一次的考研进入梦想中的大学的机会，于是决定在大四没有事情做的情况下考研。在8月份准备了一个星期后，奥运会开始了，原本因为考研而平静的心又浮躁起来了，由于某种原因又使我不得不放弃考研的机会&#8230;&#8230;. 从摸上电脑的那一刻，我就知道，这才是我的世界。开始学习.net，从网上下下来vc2005，并参照教程开始键出书上的原程序，一遍一遍的调试，也就是在这个时候想用ASP.NET建立个人网站。由于还没有深入学习ASP.NET所以对从网上下下来的源码只能做简单的修改，出了很多问题只能慢慢解决。在用了几天几夜的时间调试主页之后，身体疲惫，决定暂时放弃网站建设，首先学习代码知识。 从大一包夜开始用别人写好的框架建设网站，到现在用软件编写调试代码建网站，这期间遇到了很多问题，意识到了自己还有很多东西要学习，学习网络三剑客的使用，学习photosh，学习数据库知识，学习C#语言&#8230;&#8230;. 从摸上电脑的那一刻，我就知道，这才是我的世界。 我一心一意地想作个程序员，尽管知道很累。 人真的不能轻言放弃，否则，失去的永远无法挽回！ 生命是一种长期而持续的累积过程 所有成功的人都有一个不变的黄金法则： 积累！与 坚持！]]></description>
			<content:encoded><![CDATA[<p>一不小心进了<a href="http://wwwcn.myspace.cn/hauiyu" target="_blank">聚友网</a>，以为这是一个以英语为手段的交流平台，遂想注册账号在里面用英语写BLOG并与人交流，没有想到这个网站是类似与<a href="http://xiaonei.com/profile.do?id=55414622" target="_blank">校内网</a>的交友平台。里面的内容视乎比校内网做的要好些，没有校内网那样花哨复杂，简单实用，就主要是以交友为目的，既然注册了就用用吧！就把聚友网当作交友的地方，顺便看看美女吧^_^。</p>
<div>记得校内网里一个不认识的朋友说过，校内网就是用来分享的，这句话把我对校内的想法完全表达出来了，校内网对于我来说根本就没有什么实际有用的价值，就除了分享一些有用的信息，漂亮的图片，以前还认为群组也非常有用，但后来慢慢感觉到群组里面的内容不够专业，不实用。三次删除校内网账号三次恢复，校内网真是苦心积虑，为了牢牢套住广大的校园学子，不允许成员彻底删除账号！<span id="more-101"></span></div>
<div>奥运会昨天结束了，是昨天看下篮球决赛的，但由于太累昨天睡了一天，醒来时候刚好是20点，没有错过闭幕式！对于奥运会不想做出任何评价，评价不发生在我身边的事情没有任何意义！</div>
<div>最近一直在忙着自己的个人网站建设，开始是想以asp.net为平台在网上搜索源代码，首先在自己的电脑上调试，在上传到空间。装好visua studio 2005 和IIS后，环境配置用了很长时间，把下好的源代码放在电脑上调试，总是出报出错误，在百度里百度了很多的解决方法都没有起作用，后来在老大的提示下知道源代码里需要数据库，我并没有设置好数据库，所以网页总是不能显示主页。怎么样建立数据库并且设置好环境变量，现在还不清楚，只好慢慢解决。。。</div>
<div>在网上知道了<a href="http://www.pjhome.net/" target="_blank">PJBLOG</a>，于是想实用<a href="http://www.pjhome.net/" target="_blank">PJBLOG</a>作为自己网站的源码。<a href="http://www.pjhome.net/" target="_blank">PJBLOG</a>没有<a href="http://rainbowsoft.org/" target="_blank">ZBLOG</a>复杂，但起操作起来也并不容易，用FTP工具上传源码用了两小时，每次调试安装新的插件都要备份数据库，但自己总是忘记了，网页上还有几个模块不能加载，还不知道是什么原因怎么样解决。每次打开主页都是慢的不得了，比用201上江大主页还慢，不知道是空间的问题还是域名的问题，空间用的是外国的一个免费的，域名是用到万网的也是免费的，<a href="http://boykings.cn/" target="_blank">http://boykings.cn/</a>这个空间能够免费实用一年。后开在网友那里知道了<a href="http://cnnetidc.com/login/login.asp" target="_blank">中网数据</a>，一个国际域名一年65元，中国域名只要5元一年，于是决定用自己的昵称注册一套空间加域名总共200元，即将正式拥有自己的域名了，呵呵！！</div>
<div>暑假过得真快，洛阳实习后，在学校上网看电影荒废了10天，在极度空虚的时候，听了好友的一番话，觉得自己不应该放弃难得一次的考研进入梦想中的大学的机会，于是决定在大四没有事情做的情况下考研。在8月份准备了一个星期后，奥运会开始了，原本因为考研而平静的心又浮躁起来了，由于某种原因又使我不得不放弃考研的机会&#8230;&#8230;.</div>
<div>从摸上电脑的那一刻，我就知道，这才是我的世界。开始学习.net，从网上下下来vc2005，并参照教程开始键出书上的原程序，一遍一遍的调试，也就是在这个时候想用ASP.NET建立个人网站。由于还没有深入学习ASP.NET所以对从网上下下来的源码只能做简单的修改，出了很多问题只能慢慢解决。在用了几天几夜的时间调试主页之后，身体疲惫，决定暂时放弃网站建设，首先学习代码知识。</div>
<div>从大一包夜开始用别人写好的框架建设网站，到现在用软件编写调试代码建网站，这期间遇到了很多问题，意识到了自己还有很多东西要学习，学习网络三剑客的使用，学习photosh，学习数据库知识，学习C#语言&#8230;&#8230;.</div>
<div>从摸上电脑的那一刻，我就知道，这才是我的世界。</div>
<div>我一心一意地想作个程序员，尽管知道很累。</div>
<div>人真的不能轻言放弃，否则，失去的永远无法挽回！</div>
<div>生命是一种长期而持续的累积过程</div>
<div>所有成功的人都有一个不变的黄金法则： 积累！与 坚持！</div>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/05/pesist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>To be best of best！</title>
		<link>http://www.javachen.com/2009/05/to_be_best/</link>
		<comments>http://www.javachen.com/2009/05/to_be_best/#comments</comments>
		<pubDate>Sat, 16 May 2009 04:52:04 +0000</pubDate>
		<dc:creator>JavaChen</dc:creator>
				<category><![CDATA[Post]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Interview]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.javachen.com/?p=96</guid>
		<description><![CDATA[今天去华科参加了群硕软件公司的笔试考试，这是我第二次参加笔试。第一次笔试是为了进入冠捷公司而参加的，那次考试完全没有准备最后考得还不错，这次也没有准备希望能够收到面试的通知，希望而已。 上次没有准备是因为不知道准备什么，这次是因为时间不够太忙了，要负责评奖学金要准备入党的材料软考也没有时间看书，总感觉很累很累但也没有做出自己真正应该做的事情来！ 今天笔试的题目都是用英文出的，说明了该公司对英语的重视程度也说明了英语的重要性，只可惜在这个大学里英语完全不可能有质的飞跃，反而是相对与高中下降不少。英语，现在缺的不是口语而是对英语的掌握程度，参见工作之后口语环境自然会有，而对英语词汇知识掌握的多少才是最重要的。考试中有两个数学逻辑题，非常简单，小学生都可以做出来~~~其他的涉及到面向对象、数据库、数据结构、软件测试、actionscript 3.0.。。。到现在才知道actionscript 3.0原来是用下一代 Flash Player Runtime 和 Mozilla 的 Tamarin 开放源码项目编写 Adobe 电影和应用程序。考试没有想象中的难也不简单，只要平时知识学的扎实做完是完全有可能的，只可惜啊什么数据结构、数据库、面向对象、很长时间没有接触了，更何况当时学习的时候就没有完全搞清楚。现在主要学习.NET，视乎软件的基本知识根本就没有掌握清楚啊！ 希望明天能够收到群硕的面试通知，希望而已，呵呵！感觉收到通知去面试也不会通过面试，因为自己掌握的知识太少了，也不牢固，系统，科学。希望老大能够通过，他应该能过通过。。。。还好还有时间学习，还有时间准备，在明年7月之前争取能够进入这个刚出生不久的软件公司。 群硕公司非常重视员工各个方面的素质的培养，重视英语的能力，而且刚在武汉建立了自己的分部，正在大量的招聘应届毕业生，这对与正在找工作的应届生来说是个很不错的选择，以后找其他的公司，也会以那些刚刚成长发展起来的公司为首要目标，与公司一起成长，自己得到锻炼的机会就会越多，升职机会也越多。 今天在华科西12楼的一个教室参加考试，这个教学楼里还有很多班集体在上课，走在教学楼里走廊里到处都是在学习的学生，教室里更是坐满了自习的学生，浓厚的学习氛围真是让人羡慕，只可惜以后怕是没有机会进入这样的学府学习了~~想起大学四年，没有很好的体会教室自习的氛围真是遗憾！大学最快乐的事情&#8212;&#8212;自习，自己视乎没有很好的体会过&#8230;.. 要就业找到好工作？现在还有很长路要走！ 一定要努力！ Stay hungry！Be foolish！ To be best of best！]]></description>
			<content:encoded><![CDATA[<p>今天去华科参加了群硕软件公司的笔试考试，这是我第二次参加笔试。第一次笔试是为了进入冠捷公司而参加的，那次考试完全没有准备最后考得还不错，这次也没有准备希望能够收到面试的通知，希望而已。<br />
上次没有准备是因为不知道准备什么，这次是因为时间不够太忙了，要负责评奖学金要准备入党的材料软考也没有时间看书，总感觉很累很累但也没有做出自己真正应该做的事情来！<br />
今天笔试的题目都是用英文出的，说明了该公司对英语的重视程度也说明了英语的重要性，只可惜在这个大学里英语完全不可能有质的飞跃，反而是相对与高中下降不少。英语，现在缺的不是口语而是对英语的掌握程度，参见工作之后口语环境自然会有，而对英语词汇知识掌握的多少才是最重要的。<span id="more-96"></span>考试中有两个数学逻辑题，非常简单，小学生都可以做出来~~~其他的涉及到面向对象、数据库、数据结构、软件测试、actionscript 3.0.。。。到现在才知道actionscript 3.0原来是用下一代 Flash Player Runtime 和 Mozilla 的 Tamarin 开放源码项目编写 Adobe 电影和应用程序。考试没有想象中的难也不简单，只要平时知识学的扎实做完是完全有可能的，只可惜啊什么数据结构、数据库、面向对象、很长时间没有接触了，更何况当时学习的时候就没有完全搞清楚。现在主要学习.NET，视乎软件的基本知识根本就没有掌握清楚啊！<br />
希望明天能够收到群硕的面试通知，希望而已，呵呵！感觉收到通知去面试也不会通过面试，因为自己掌握的知识太少了，也不牢固，系统，科学。希望老大能够通过，他应该能过通过。。。。还好还有时间学习，还有时间准备，在明年7月之前争取能够进入这个刚出生不久的软件公司。<br />
群硕公司非常重视员工各个方面的素质的培养，重视英语的能力，而且刚在武汉建立了自己的分部，正在大量的招聘应届毕业生，这对与正在找工作的应届生来说是个很不错的选择，以后找其他的公司，也会以那些刚刚成长发展起来的公司为首要目标，与公司一起成长，自己得到锻炼的机会就会越多，升职机会也越多。<br />
今天在华科西12楼的一个教室参加考试，这个教学楼里还有很多班集体在上课，走在教学楼里走廊里到处都是在学习的学生，教室里更是坐满了自习的学生，浓厚的学习氛围真是让人羡慕，只可惜以后怕是没有机会进入这样的学府学习了~~想起大学四年，没有很好的体会教室自习的氛围真是遗憾！大学最快乐的事情&#8212;&#8212;自习，自己视乎没有很好的体会过&#8230;..<br />
要就业找到好工作？现在还有很长路要走！<br />
一定要努力！<br />
Stay hungry！Be foolish！<br />
To be best of best！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javachen.com/2009/05/to_be_best/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
