﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-java集合类</title><link>http://www.blogjava.net/stevenjohn/category/51100.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Sun, 15 Feb 2015 11:39:39 GMT</lastBuildDate><pubDate>Sun, 15 Feb 2015 11:39:39 GMT</pubDate><ttl>60</ttl><item><title>各种Map</title><link>http://www.blogjava.net/stevenjohn/archive/2015/02/15/422937.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 15 Feb 2015 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/02/15/422937.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/422937.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/02/15/422937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/422937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/422937.html</trackback:ping><description><![CDATA[<div>&nbsp;HashMap&nbsp;is&nbsp;implemented&nbsp;as&nbsp;a&nbsp;hash&nbsp;table,&nbsp;and&nbsp;there&nbsp;is&nbsp;no&nbsp;ordering&nbsp;on&nbsp;keys&nbsp;or&nbsp;values.<br />TreeMap&nbsp;is&nbsp;implemented&nbsp;based&nbsp;on&nbsp;red-black&nbsp;tree&nbsp;structure,&nbsp;and&nbsp;it&nbsp;is&nbsp;ordered&nbsp;by&nbsp;the&nbsp;key.<br />LinkedHashMap&nbsp;preserves&nbsp;the&nbsp;insertion&nbsp;order<br />Hashtable&nbsp;is&nbsp;synchronized,&nbsp;in&nbsp;contrast&nbsp;to&nbsp;HashMap.</div><img src ="http://www.blogjava.net/stevenjohn/aggbug/422937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-02-15 10:59 <a href="http://www.blogjava.net/stevenjohn/archive/2015/02/15/422937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>教你如何迅速秒杀掉：99%的海量数据处理面试题 .</title><link>http://www.blogjava.net/stevenjohn/archive/2012/12/06/392549.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 06 Dec 2012 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/12/06/392549.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/392549.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/12/06/392549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/392549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/392549.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; &nbsp; &nbsp; 教你如何迅速秒杀掉：99%的海量数据处理面试题作者：July出处：结构之法算法之道blog前言&nbsp;&nbsp; 一般而言，标题含有&#8220;秒杀&#8221;，&#8220;99%&#8221;，&#8220;史上最全/最强&#8221;等词汇的往往都脱不了哗众取宠之嫌，但进一步来讲，如果读者读罢此文，却无任何收获，那么，我也甘...&nbsp;&nbsp;<a href='http://www.blogjava.net/stevenjohn/archive/2012/12/06/392549.html'>阅读全文</a><img src ="http://www.blogjava.net/stevenjohn/aggbug/392549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-12-06 15:06 <a href="http://www.blogjava.net/stevenjohn/archive/2012/12/06/392549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Map,List,Vector,Set遍历</title><link>http://www.blogjava.net/stevenjohn/archive/2012/11/20/391618.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 19 Nov 2012 16:19:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/11/20/391618.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/391618.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/11/20/391618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/391618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/391618.html</trackback:ping><description><![CDATA[<p>package chn.lass.liu.collection;</p>
<p>import java.util.HashMap;<br />import java.util.Iterator;<br />import java.util.Map;</p>
<p>public class MapTest {<br />&nbsp;public static Map&lt;String,String&gt; createMap(){<br />&nbsp;&nbsp;Map&lt;String,String&gt; map=new HashMap&lt;String, String&gt;();<br />&nbsp;&nbsp;map.put("a", "111");<br />&nbsp;&nbsp;map.put("b", "222");<br />&nbsp;&nbsp;return map;<br />&nbsp;}<br />&nbsp;public static void parseMap(Map&lt;String,String&gt; map){<br />&nbsp;&nbsp;for(Iterator it=map.entrySet().iterator();it.hasNext();){<br />&nbsp;&nbsp;&nbsp;Map.Entry entry=(Map.Entry)it.next();<br />&nbsp;&nbsp;&nbsp;System.out.println("key="+entry.getKey());<br />&nbsp;&nbsp;&nbsp;System.out.println("value="+entry.getValue());<br />&nbsp;&nbsp;&nbsp;if("a".equals(entry.getKey())){<br />&nbsp;&nbsp;&nbsp;&nbsp;it.remove();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;for(Iterator it=map.entrySet().iterator();it.hasNext();){<br />&nbsp;&nbsp;&nbsp;Map.Entry entry=(Map.Entry)it.next();<br />&nbsp;&nbsp;&nbsp;System.out.println("key1="+entry.getKey());<br />&nbsp;&nbsp;&nbsp;System.out.println("value1="+entry.getValue());<br />&nbsp;&nbsp;}<br />&nbsp;} <br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;Map&lt;String,String&gt; map=createMap();<br />&nbsp;&nbsp;parseMap(map);<br />&nbsp;}<br />}<br /></p><br /><br /><br /><br />
<p>package chn.lass.liu.collection;</p>
<p>import java.util.ArrayList;<br />import java.util.Iterator;<br />import java.util.List;</p>
<p>public class ListTest {<br />&nbsp;public static List&lt;String&gt; createList(){<br />&nbsp;&nbsp;List&lt;String&gt; list=new ArrayList&lt;String&gt;();<br />&nbsp;&nbsp;for(int i=0;i&lt;5;i++){<br />&nbsp;&nbsp;&nbsp;list.add(""+i);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return list;<br />&nbsp;}<br />&nbsp;public static void ParseList(List&lt;String&gt; list){<br />&nbsp;&nbsp;for(Iterator it=list.iterator();it.hasNext();){<br />&nbsp;&nbsp;&nbsp;String its=(String)it.next();<br />&nbsp;&nbsp;&nbsp;System.out.println("list is:"+its);<br />&nbsp;&nbsp;&nbsp;it.remove();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp; List&lt;String&gt; list=createList();<br />&nbsp;&nbsp; ParseList(list);<br />&nbsp;}<br />}<br /></p><br /><br /><br /><br /><br />
<p>package chn.lass.liu.collection;</p>
<p>import java.util.Iterator;<br />import java.util.Vector;</p>
<p>public class VectorTest {<br />&nbsp;public static Vector&lt;String&gt; createVector(){<br />&nbsp;&nbsp;Vector&lt;String&gt; vector=new Vector&lt;String&gt;();<br />&nbsp;&nbsp;vector.addElement("aa");<br />&nbsp;&nbsp;vector.addElement("bb");<br />&nbsp;&nbsp;return vector;<br />&nbsp;}<br />&nbsp;public static void parseVector(Vector&lt;String&gt; vector){<br />&nbsp;&nbsp;for(Iterator it=vector.iterator();it.hasNext();){<br />&nbsp;&nbsp;&nbsp;String its=(String)it.next();<br />&nbsp;&nbsp;&nbsp;System.out.println("its is:"+its);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;Vector&lt;String&gt; vector=createVector();<br />&nbsp;&nbsp;parseVector(vector);<br />&nbsp;}<br />}<br /><br /><br /><br /><br /><br /></p>
<p>package chn.lass.liu.collection;</p>
<p>import java.util.HashSet;<br />import java.util.Iterator;<br />import java.util.Set;</p>
<p>public class SetTest {<br />&nbsp;public static Set&lt;String&gt; createSet(){<br />&nbsp;&nbsp;Set&lt;String&gt; set=new HashSet&lt;String&gt;();<br />&nbsp;&nbsp;set.add("a");<br />&nbsp;&nbsp;set.add("b");<br />&nbsp;&nbsp;return set;<br />&nbsp;}<br />&nbsp;public static void parseSet(Set&lt;String&gt; set){<br />&nbsp;&nbsp;for(Iterator it=set.iterator();it.hasNext();){<br />&nbsp;&nbsp;&nbsp;String its=(String)it.next();<br />&nbsp;&nbsp;&nbsp;System.out.println("its is:"+its);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;Set&lt;String&gt; set=createSet();<br />&nbsp;&nbsp;parseSet(set);<br />&nbsp;}<br />}<br /></p>
<p>&nbsp;</p> <img src ="http://www.blogjava.net/stevenjohn/aggbug/391618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-11-20 00:19 <a href="http://www.blogjava.net/stevenjohn/archive/2012/11/20/391618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java  全局队列</title><link>http://www.blogjava.net/stevenjohn/archive/2012/08/20/385845.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 20 Aug 2012 04:25:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/08/20/385845.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/385845.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/08/20/385845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/385845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/385845.html</trackback:ping><description><![CDATA[<p>package com.abin.lee.queue;</p>
<p>import java.util.Queue;</p>
<p>public interface IMakeQueue {<br />&nbsp;public void addQueue(Object obj);<br />&nbsp;public boolean hasQueue();<br />&nbsp;public Object getQueueHeader();<br />&nbsp;public int queueSize();<br />&nbsp;public boolean delQueue();<br />}<br /></p><br /><br /><br />
<p>package com.abin.lee.queue;</p>
<p>import java.util.Queue;<br />import java.util.concurrent.LinkedBlockingQueue;</p>
<p>public class MakeQueue implements IMakeQueue{<br />&nbsp;private static Queue queue=new LinkedBlockingQueue();</p>
<p>&nbsp;public void addQueue(Object obj) {<br />&nbsp;&nbsp;queue.offer(obj);<br />&nbsp;}</p>
<p>&nbsp;public boolean hasQueue() {<br />&nbsp;&nbsp;boolean flag=false;<br />&nbsp;&nbsp;if(queue.isEmpty()){<br />&nbsp;&nbsp;&nbsp;flag=true;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return flag;<br />&nbsp;}</p>
<p>&nbsp;public Object getQueueHeader() {<br />&nbsp;&nbsp;Object obj=queue.peek();<br />&nbsp;&nbsp;return obj;<br />&nbsp;}</p>
<p>&nbsp;public int queueSize() {<br />&nbsp;&nbsp;int queueSize=queue.size();<br />&nbsp;&nbsp;return queueSize;<br />&nbsp;}</p>
<p>&nbsp;public boolean delQueue() {<br />&nbsp;&nbsp;boolean flag=false;<br />&nbsp;&nbsp;Object obj=queue.poll();<br />&nbsp;&nbsp;if(obj!=null){<br />&nbsp;&nbsp;&nbsp;flag=true;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return flag;<br />&nbsp;}<br />&nbsp;<br />}<br /></p><br /><br /><br /><br /><br />
<p>package com.abin.lee.queue;</p>
<p>import org.springframework.beans.BeansException;<br />import org.springframework.context.ApplicationContext;<br />import org.springframework.context.ApplicationContextAware;<br />import org.springframework.context.support.ClassPathXmlApplicationContext;</p>
<p>/**<br />&nbsp;* <br />&nbsp;* 获取spring容器，以访问容器中定义的其他bean<br />&nbsp;* <br />&nbsp;* @author lyltiger<br />&nbsp;* @since MOSTsView 3.0 2009-11-16<br />&nbsp;*/<br />public class SpringContextUtil implements ApplicationContextAware {</p>
<p>&nbsp;// Spring应用上下文环境<br />&nbsp;private static ApplicationContext applicationContext = new ClassPathXmlApplicationContext(<br />&nbsp;&nbsp;&nbsp;"com/abin/lee/spring/applicationContext-queue.xml");</p>
<p>&nbsp;/**<br />&nbsp; * 实现ApplicationContextAware接口的回调方法，设置上下文环境<br />&nbsp; * <br />&nbsp; * @param applicationContext<br />&nbsp; */<br />&nbsp;public void setApplicationContext(ApplicationContext applicationContext) {<br />&nbsp;&nbsp;SpringContextUtil.applicationContext = applicationContext;<br />&nbsp;}</p>
<p>&nbsp;/**<br />&nbsp; * @return ApplicationContext<br />&nbsp; */<br />&nbsp;public static ApplicationContext getApplicationContext() {<br />&nbsp;&nbsp;return applicationContext;<br />&nbsp;}</p>
<p>&nbsp;/**<br />&nbsp; * 获取对象 这里重写了bean方法，起主要作用<br />&nbsp; * <br />&nbsp; * @param name<br />&nbsp; * @return Object 一个以所给名字注册的bean的实例<br />&nbsp; * @throws BeansException<br />&nbsp; */<br />&nbsp;public static Object getBean(String name) throws BeansException {<br />&nbsp;&nbsp;return applicationContext.getBean(name);<br />&nbsp;}</p>
<p>}</p><br /><br /><br /><br />
<p>package com.abin.lee.queue;</p>
<p>import java.io.BufferedWriter;<br />import java.io.IOException;<br />import java.io.OutputStreamWriter;<br />import java.util.Map;</p>
<p>import javax.servlet.ServletException;<br />import javax.servlet.ServletOutputStream;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p>
<p>public class QueueServlet extends HttpServlet{<br />&nbsp;<br />&nbsp;protected void doPost(HttpServletRequest request, HttpServletResponse response)<br />&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />&nbsp;&nbsp;Map map=request.getParameterMap();<br />&nbsp;&nbsp;String name1=(String)((Object[])map.get("name1"))[0];<br />&nbsp;&nbsp;String name2=(String)((Object[])map.get("name2"))[0];<br />&nbsp;&nbsp;MakeQueue makeQueue = (MakeQueue)SpringContextUtil.getBean("makeQueue");//bean的名称 <br />&nbsp;&nbsp;System.out.println(makeQueue.queueSize());<br />&nbsp;&nbsp;makeQueue.addQueue(name1);<br />&nbsp;&nbsp;makeQueue.addQueue(name2);<br />&nbsp;&nbsp;System.out.println(makeQueue.queueSize());<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;ServletOutputStream out=response.getOutputStream();<br />&nbsp;&nbsp;BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(out));<br />&nbsp;&nbsp;writer.write("success");<br />&nbsp;&nbsp;writer.flush();<br />&nbsp;&nbsp;writer.close();<br />&nbsp;}<br />}<br /></p><br /><br /><br /><br />
<p>package com.abin.lee.spring;</p>
<p>import java.util.ArrayList;<br />import java.util.List;</p>
<p>import junit.framework.TestCase;</p>
<p>import org.apache.http.HttpEntity;<br />import org.apache.http.HttpResponse;<br />import org.apache.http.NameValuePair;<br />import org.apache.http.client.HttpClient;<br />import org.apache.http.client.entity.UrlEncodedFormEntity;<br />import org.apache.http.client.methods.HttpPost;<br />import org.apache.http.impl.client.DefaultHttpClient;<br />import org.apache.http.message.BasicNameValuePair;<br />import org.apache.http.protocol.HTTP;<br />import org.apache.http.util.EntityUtils;</p>
<p>public class SpringUnit extends TestCase {<br />&nbsp;private static final String HTTP_URL="<a href="http://localhost:1010/WebService/servlet/QueueServlet">http://localhost:1010/WebService/servlet/QueueServlet</a>";<br />&nbsp;public void testBean() {<br />&nbsp;&nbsp;HttpClient client=new DefaultHttpClient();<br />&nbsp;&nbsp;HttpPost post=new HttpPost(HTTP_URL);<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;List&lt;NameValuePair&gt; nvps=new ArrayList&lt;NameValuePair&gt;();<br />&nbsp;&nbsp;&nbsp;nvps.add(new BasicNameValuePair("name1", "lee"));<br />&nbsp;&nbsp;&nbsp;nvps.add(new BasicNameValuePair("name2", "abin"));<br />&nbsp;&nbsp;&nbsp;post.setEntity(new UrlEncodedFormEntity(nvps,HTTP.UTF_8));<br />&nbsp;&nbsp;&nbsp;HttpResponse response=client.execute(post);<br />&nbsp;&nbsp;&nbsp;HttpEntity entity=response.getEntity();<br />&nbsp;&nbsp;&nbsp;String result=EntityUtils.toString(entity);<br />&nbsp;&nbsp;&nbsp;System.out.println("result="+result);<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br /></p><br /><br /><br /><br /><br /><br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;beans xmlns="<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>"<br />&nbsp;xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" xmlns:context="<a href="http://www.springframework.org/schema/context">http://www.springframework.org/schema/context</a>"<br />&nbsp;xmlns:aop="<a href="http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop</a>"<br />&nbsp;xsi:schemaLocation="<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">http://www.springframework.org/schema/beans/spring-beans-3.0.xsd</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop</a> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">http://www.springframework.org/schema/aop/spring-aop-3.0.xsd</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.springframework.org/schema/context">http://www.springframework.org/schema/context</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.springframework.org/schema/context/spring-context-3.0.xsd">http://www.springframework.org/schema/context/spring-context-3.0.xsd</a>"&gt;</p>
<p>&nbsp;&lt;!-- Queue全局队列 --&gt;<br />&nbsp;&lt;bean id="makeQueue" class="com.abin.lee.queue.MakeQueue" scope="singleton" /&gt;<br />&nbsp;</p>
<p>&lt;/beans&gt;</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/385845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-08-20 12:25 <a href="http://www.blogjava.net/stevenjohn/archive/2012/08/20/385845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 遍历嵌套Map</title><link>http://www.blogjava.net/stevenjohn/archive/2012/08/18/385729.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 18 Aug 2012 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/08/18/385729.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/385729.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/08/18/385729.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/385729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/385729.html</trackback:ping><description><![CDATA[<p>package com.abin.lee.sort;</p>
<p>import java.util.Collections;<br />import java.util.HashMap;<br />import java.util.Iterator;<br />import java.util.Map;</p>
<p>public class CollectionIterator {<br />&nbsp;/**<br />&nbsp; * 创建二维MAP<br />&nbsp; * <br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static Map&lt;String, Map&lt;String, String&gt;&gt; createMap() {<br />&nbsp;&nbsp;Map&lt;String, Map&lt;String, String&gt;&gt; map2 = Collections<br />&nbsp;&nbsp;&nbsp;&nbsp;.synchronizedMap(new HashMap&lt;String, Map&lt;String, String&gt;&gt;());<br />&nbsp;&nbsp;Map&lt;String, String&gt; map1 = Collections<br />&nbsp;&nbsp;&nbsp;&nbsp;.synchronizedMap(new HashMap&lt;String, String&gt;());<br />&nbsp;&nbsp;Map&lt;String, String&gt; map3 = Collections<br />&nbsp;&nbsp;&nbsp;&nbsp;.synchronizedMap(new HashMap&lt;String, String&gt;());<br />&nbsp;&nbsp;map1.put("abin", "varyall");<br />&nbsp;&nbsp;map1.put("abing", "boy");<br />&nbsp;&nbsp;map1.put("peng", "boy");<br />&nbsp;&nbsp;map1.put("pengzi", "man");<br />&nbsp;&nbsp;map2.put("user", map1);</p>
<p>&nbsp;&nbsp;map3.put("chinese", "beijing");<br />&nbsp;&nbsp;map3.put("china", "shanghai");<br />&nbsp;&nbsp;map2.put("contury", map3);</p>
<p>&nbsp;&nbsp;return map2;<br />&nbsp;}<br />&nbsp;/**<br />&nbsp; * 解析二维MAP<br />&nbsp; * @param map<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;<br />&nbsp;public static String getMap(Map&lt;String, Map&lt;String, String&gt;&gt; map) {<br />&nbsp;&nbsp;for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {<br />&nbsp;&nbsp;&nbsp;Map.Entry entry=(Map.Entry)iterator.next();<br />&nbsp;&nbsp;&nbsp;//先遍历一维map<br />&nbsp;&nbsp;&nbsp;System.out.println("one map name="+entry.getKey());<br />&nbsp;&nbsp;&nbsp;System.out.println("one map name="+entry.getValue());<br />&nbsp;&nbsp;&nbsp;Map&lt;String, String&gt; map1=(Map&lt;String, String&gt;)entry.getValue();<br />&nbsp;&nbsp;&nbsp;if(entry.getValue() instanceof Map){<br />&nbsp;&nbsp;&nbsp;&nbsp;for(Iterator it=map1.entrySet().iterator();it.hasNext();){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map.Entry entry2=(Map.Entry)it.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//再遍历二维map<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("two map name="+entry2.getKey());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("two map name="+entry2.getValue());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return null;<br />&nbsp;}<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;Map&lt;String, Map&lt;String, String&gt;&gt; map=createMap();<br />&nbsp;&nbsp;getMap(map);<br />&nbsp;&nbsp;<br />&nbsp;}<br />}<br /></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/385729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-08-18 15:51 <a href="http://www.blogjava.net/stevenjohn/archive/2012/08/18/385729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java容器集合类的区别用法</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/23/372533.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 23 Mar 2012 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/23/372533.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/372533.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/23/372533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/372533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/372533.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed; width: 100%">
<tbody>
<tr>
<td>
<div class="cnt" id="blog_text">
<h1><a href="http://www.cnblogs.com/sunliming/archive/2011/04/05/2005957.html">Java容器集合类的区别用法</a> 
<div>
<p>Set,List,Map,Vector,ArrayList的区别 
<p>JAVA的容器---List,Map,Set <br />Collection <br />&#9500;List <br />&#9474;&#9500;LinkedList <br />&#9474;&#9500;ArrayList <br />&#9474;&#9492;Vector <br />&#9474;　&#9492;Stack <br />&#9492;Set <br />Map <br />&#9500;Hashtable <br />&#9500;HashMap <br />&#9492;WeakHashMap 
<p><strong>Collection接口 </strong><br />　　Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements）。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类，Java SDK提供的类都是继承自Collection的&#8220;子接口&#8221;如List和Set。 <br />　　所有实现Collection接口的类都必须提供两个标准的构造函数：无参数的构造函数用于创建一个空的Collection，有一个 Collection参数的构造函数用于创建一个新的Collection，这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。 <br />　　如何遍历Collection中的每一个元素？不论Collection的实际类型如何，它都支持一个iterator()的方法，该方法返回一个迭代子，使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下： <br />　　　　Iterator it = collection.iterator(); // 获得一个迭代子 <br />　　　　while(it.hasNext()) { <br />　　　　　　Object obj = it.next(); // 得到下一个元素 <br />　　　　} <br />　　由Collection接口派生的两个接口是List和Set。 
<p><strong>List接口 </strong><br />　　List是有序的Collection，使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引（元素在List中的位置，类似于数组下标）来访问List中的元素，这类似于Java的数组。 <br />和下面要提到的Set不同，List允许有相同的元素。 <br />　　除了具有Collection接口必备的iterator()方法外，List还提供一个listIterator()方法，返回一个 ListIterator接口，和标准的Iterator接口相比，ListIterator多了一些add()之类的方法，允许添加，删除，设定元素，还能向前或向后遍历。 <br />　　实现List接口的常用类有LinkedList，ArrayList，Vector和Stack。 
<p><strong>LinkedList类 </strong><br />　　LinkedList实现了List接口，允许null元素。此外LinkedList提供额外的get，remove，insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈（stack），队列（queue）或双向队列（deque）。 <br />　　注意LinkedList没有同步方法。如果多个线程同时访问一个List，则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List： <br />　　　　List list = Collections.synchronizedList(new LinkedList(...)); 
<p><strong>ArrayList类 </strong><br />　　ArrayList实现了可变大小的数组。它允许所有元素，包括null。ArrayList没有同步。 <br />size，isEmpty，get，set方法运行时间为常数。但是add方法开销为分摊的常数，添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 <br />　　每个ArrayList实例都有一个容量（Capacity），即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加，但是增长算法并没有定义。当需要插入大量元素时，在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 <br />　　和LinkedList一样，ArrayList也是非同步的（unsynchronized）。 
<p><strong>Vector类 </strong><br />　　Vector非常类似ArrayList，但是Vector是同步的。由Vector创建的Iterator，虽然和ArrayList创建的 Iterator是同一接口，但是，因为Vector是同步的，当一个Iterator被创建而且正在被使用，另一个线程改变了Vector的状态（例如，添加或删除了一些元素），这时调用Iterator的方法时将抛出ConcurrentModificationException，因此必须捕获该异常。 
<p><strong>Stack 类 </strong><br />　　Stack继承自Vector，实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法，还有peek方法得到栈顶的元素，empty方法测试堆栈是否为空，search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 
<p><strong>Set接口 </strong><br />　　Set是一种不包含重复的元素的Collection，即任意的两个元素e1和e2都有e1.equals(e2)=false，Set最多有一个null元素。 <br />　　很明显，Set的构造函数有一个约束条件，传入的Collection参数不能包含重复的元素。 <br />　　请注意：必须小心操作可变对象（Mutable Object）。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。 
<p><strong>Map接口 </strong><br />　　请注意，Map没有继承Collection接口，Map提供key到value的映射。一个Map中不能包含相同的key，每个key只能映射一个 value。Map接口提供3种集合的视图，Map的内容可以被当作一组key集合，一组value集合，或者一组key-value映射。 
<p><strong>Hashtable类 </strong><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分别是&#8221;one&#8221;，&#8221;two&#8221;，&#8221;three&#8221;： <br />　　　　Hashtable numbers = new Hashtable(); <br />　　　　numbers.put(&#8220;one&#8221;, new Integer(1)); <br />　　　　numbers.put(&#8220;two&#8221;, new Integer(2)); <br />　　　　numbers.put(&#8220;three&#8221;, new Integer(3)); <br />　　要取出一个数，比如2，用相应的key： <br />　　　　Integer n = (Integer)numbers.get(&#8220;two&#8221;); <br />　　　　System.out.println(&#8220;two = &#8221; + 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><strong>HashMap类 </strong><br />　　HashMap和Hashtable类似，不同之处在于HashMap是非同步的，并且允许null，即null value和null key。，但是将HashMap视为Collection时（values()方法可返回Collection），其迭代子操作时间开销和HashMap 的容量成比例。因此，如果迭代操作的性能相当重要的话，不要将HashMap的初始化容量设得过高，或者load factor过低。 
<p><strong>WeakHashMap类 <br /></strong>　　WeakHashMap是一种改进的HashMap，它对key实行&#8220;弱引用&#8221;，如果一个key不再被外部所引用，那么该key可以被GC回收。 
<p>总结 <br />　　如果涉及到堆栈，队列等操作，应该考虑用List，对于需要快速插入，删除元素，应该使用LinkedList，如果需要快速随机访问元素，应该使用ArrayList。 <br />　　如果程序在单线程环境中，或者访问仅仅在一个线程中进行，考虑非同步的类，其效率较高，如果多个线程可能同时操作一个类，应该使用同步的类。 <br />　　要特别注意对哈希表的操作，作为key的对象要正确复写equals和hashCode方法。 <br />　　尽量返回接口而非实际的类型，如返回List而非ArrayList，这样如果以后需要将ArrayList换成LinkedList时，客户端代码不用改变。这就是针对抽象编程。 
<p>Java 集合类 map set list arraylist hashmap hashtable(转) 
<p>Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe)，而ArrayList的方法不是，由于线程的同步必然要影响性能，因此,ArrayList的性能比Vector好。 <br />当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小，这样,ArrayList就有利于节约内存空间。 <br />Hashtable和HashMap&nbsp;&nbsp; <br />它们的性能方面的比较类似 Vector和ArrayList，比如Hashtable的方法是同步的,而HashMap的不是。 <br />ArrayList和LinkedList&nbsp;&nbsp; <br />对 于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],所以 从概念上讲,它更象数组，但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构，所以,它们在性能上有很大的差别。&nbsp;&nbsp; <br />（1） 从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间，所以,当你的操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能。&nbsp;&nbsp; <br />（2）而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止，所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。&nbsp;&nbsp; <br />（3）如果在编程中,1，2两种情形交替出现,这时,你可以考虑使用List这样的通用接口,而不用关心具体的实现，在具体的情形下,它的性能由具体的实现来保证。 <br />设置集合类的初始大小 <br />在Java 集合框架中的大部分类的大小是可以随着元素个数的增加而相应的增加的，我们似乎不用关心它的初始大小,但如果我们考虑类的性能问题时,就一定要考虑尽可能 地设置好集合对象的初始大小,这将大大提高代码的性能，比如,Hashtable缺省的初始大小为101,载入因子为0.75,即如果其中的元素个数超过 75个,它就必须增加大小并重新组织元素，所以,如果你知道在创建一个新的Hashtable对象时就知道元素的确切数目如为110,那么,就应将其初始 大小设为110/0.75=148,这样,就可以避免重新组织内存并增加大小。 <br />特别要理解的： <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分别是&#8221;one&#8221;，&#8221;two&#8221;，&#8221;three&#8221;： <br />　　　　Hashtable numbers = new Hashtable(); <br />　　　　numbers.put(&#8220;one&#8221;, new Integer(1)); <br />　　　　numbers.put(&#8220;two&#8221;, new Integer(2)); <br />　　　　numbers.put(&#8220;three&#8221;, new Integer(3)); <br />　　要取出一个数，比如2，用相应的key： <br />　　　　Integer n = (Integer)numbers.get(&#8220;two&#8221;); <br />　　　　System.out.println(&#8220;two = &#8221; + 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是同步的。 <br />HashMap类 <br />　 　HashMap和Hashtable类似，不同之处在于HashMap是非同步的，并且允许null，即null value和null key。，但 是将HashMap视为Collection时（values()方法可返回Collection），其迭代子操作时间开销和HashMap的容量成比 例。因此，如果迭代操作的性能相当重要的话，不要将HashMap的初始化容量设得过高，或者load factor过低。 <br />LinkedList类 <br />　 　LinkedList实现了List接口，允许null元素。此外LinkedList提供额外的get，remove，insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈（stack），队列（queue）或双向队列（deque）。 <br />　　注意LinkedList没有同步方法。如果多个线程同时访问一个List，则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List： <br />　　　　List list = Collections.synchronizedList(new LinkedList(...)); <br />ArrayList类 <br />　　ArrayList实现了可变大小的数组。它允许所有元素，包括null。ArrayList没有同步。 <br />size，isEmpty，get，set方法运行时间为常数。但是add方法开销为分摊的常数，添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 <br />　 　每个ArrayList实例都有一个容量（Capacity），即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加，但是增长算法并 没有定义。当需要插入大量元素时，在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 <br />　　和LinkedList一样，ArrayList也是非同步的（unsynchronized）。 <br />Vector类 <br />　 　Vector非常类似ArrayList，但是Vector是同步的。由Vector创建的Iterator，虽然和ArrayList创建的 Iterator是同一接口，但是，因为Vector是同步的，当一个Iterator被创建而且正在被使用，另一个线程改变了Vector的状态（例 如，添加或删除了一些元素），这时调用Iterator的方法时将抛出ConcurrentModificationException，因此必须捕获该 异常。 
<p><strong>细说Java之util类:</strong> 
<p>线性表，链表，哈希表是常用的数据结构，在进行Java开发时，JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述，向读者阐述各个类的作用以及如何正确使用这些类。 
<p><em>Collection</em><br />&#9500;<em>List</em><br />&#9474;&#9500;LinkedList<br />&#9474;&#9500;ArrayList<br />&#9474;&#9492;Vector<br />&#9474;　&#9492;Stack<br />&#9492;<em>Set</em><br /><em>Map</em><br />&#9500;Hashtable<br />&#9500;HashMap<br />&#9492;WeakHashMap 
<p><strong>Collection接口</strong><br />　 　Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements）。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类，Java SDK提供的类都是继承自Collection的&#8220;子接口&#8221;如List和Set。<br />　　所有实现Collection接口的类都必须提供两个标准的 构造函数：无参数的构造函数用于创建一个空的Collection，有一个Collection参数的构造函数用于创建一个新的Collection，这 个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。<br />　　如何遍历Collection中的每一个元素？不论Collection的实际类型如何，它都支持一个iterator()的方法，该方法返回一个迭代子，使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下：<br />　　　　Iterator it = collection.iterator(); // 获得一个迭代子<br />　　　　while(it.hasNext()) {<br />　　　　　　Object obj = it.next(); // 得到下一个元素<br />　　　　}<br />　　由Collection接口派生的两个接口是List和Set。 
<p><strong>List接口</strong><br />　　List是有序的Collection，使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引（元素在List中的位置，类似于数组下标）来访问List中的元素，这类似于Java的数组。<br />和下面要提到的Set不同，List允许有相同的元素。<br />　 　除了具有Collection接口必备的iterator()方法外，List还提供一个listIterator()方法，返回一个 ListIterator接口，和标准的Iterator接口相比，ListIterator多了一些add()之类的方法，允许添加，删除，设定元素， 还能向前或向后遍历。<br />　　实现List接口的常用类有LinkedList，ArrayList，Vector和Stack。 
<p><strong>LinkedList类</strong><br />　 　LinkedList实现了List接口，允许null元素。此外LinkedList提供额外的get，remove，insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈（stack），队列（queue）或双向队列（deque）。<br />　　注意LinkedList没有同步方法。如果多个线程同时访问一个List，则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List：<br />　　　　List list = Collections.synchronizedList(new LinkedList(...)); 
<p><strong>ArrayList类</strong><br />　　ArrayList实现了可变大小的数组。它允许所有元素，包括null。ArrayList没有同步。<br />size，isEmpty，get，set方法运行时间为常数。但是add方法开销为分摊的常数，添加n个元素需要O(n)的时间。其他的方法运行时间为线性。<br />　 　每个ArrayList实例都有一个容量（Capacity），即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加，但是增长算法并 没有定义。当需要插入大量元素时，在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。<br />　　和LinkedList一样，ArrayList也是非同步的（unsynchronized）。 
<p><strong>Vector类</strong><br />　 　Vector非常类似ArrayList，但是Vector是同步的。由Vector创建的Iterator，虽然和ArrayList创建的 Iterator是同一接口，但是，因为Vector是同步的，当一个Iterator被创建而且正在被使用，另一个线程改变了Vector的状态（例 如，添加或删除了一些元素），这时调用Iterator的方法时将抛出ConcurrentModificationException，因此必须捕获该 异常。 
<p><strong>Stack 类</strong><br />　　 Stack继承自Vector，实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方 法，还有peek方法得到栈顶的元素，empty方法测试堆栈是否为空，search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。 
<p><strong>Set接口</strong><br />　　Set是一种不包含重复的元素的Collection，即任意的两个元素e1和e2都有e1.equals(e2)=false，Set最多有一个null元素。<br />　　很明显，Set的构造函数有一个约束条件，传入的Collection参数不能包含重复的元素。<br />　　请注意：必须小心操作可变对象（Mutable Object）。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。 
<p><strong>Map接口</strong><br />　 　请注意，Map没有继承Collection接口，Map提供key到value的映射。一个Map中不能包含相同的key，每个key只能映射一个 value。Map接口提供3种集合的视图，Map的内容可以被当作一组key集合，一组value集合，或者一组key-value映射。 
<p><strong>Hashtable类</strong><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分别是&#8221;one&#8221;，&#8221;two&#8221;，&#8221;three&#8221;：<br />　　　　Hashtable numbers = new Hashtable();<br />　　　　numbers.put(&#8220;one&#8221;, new Integer(1));<br />　　　　numbers.put(&#8220;two&#8221;, new Integer(2));<br />　　　　numbers.put(&#8220;three&#8221;, new Integer(3));<br />　　要取出一个数，比如2，用相应的key：<br />　　　　Integer n = (Integer)numbers.get(&#8220;two&#8221;);<br />　　　　System.out.println(&#8220;two = &#8221; + 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><strong>HashMap类</strong><br />　 　HashMap和Hashtable类似，不同之处在于HashMap是非同步的，并且允许null，即null value和null key。，但是将HashMap视为Collection时（values()方法可返回Collection），其迭代子操作时间开销和HashMap 的容量成比例。因此，如果迭代操作的性能相当重要的话，不要将HashMap的初始化容量设得过高，或者load factor过低。 
<p><strong>WeakHashMap类</strong><br />　　WeakHashMap是一种改进的HashMap，它对key实行&#8220;弱引用&#8221;，如果一个key不再被外部所引用，那么该key可以被GC回收。 
<p><strong>总结</strong><br />　　如果涉及到堆栈，队列等操作，应该考虑用List，对于需要快速插入，删除元素，应该使用LinkedList，如果需要快速随机访问元素，应该使用ArrayList。<br />　　如果程序在单线程环境中，或者访问仅仅在一个线程中进行，考虑非同步的类，其效率较高，如果多个线程可能同时操作一个类，应该使用同步的类。<br />　　要特别注意对哈希表的操作，作为key的对象要正确复写equals和hashCode方法。<br />　　尽量返回接口而非实际的类型，如返回List而非ArrayList，这样如果以后需要将ArrayList换成LinkedList时，客户端代码不用改变。这就是针对抽象编程。 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p></div></h1></div></td></tr></tbody></table><img src ="http://www.blogjava.net/stevenjohn/aggbug/372533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-23 12:31 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/23/372533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入Java集合学习系列：ArrayList的实现原理</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/16/372036.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 16 Mar 2012 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/16/372036.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/372036.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/16/372036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/372036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/372036.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">
<div class="blog_content" id="blog_content">
<p><span style="color: #0000ff">1. ArrayList概述：</span></p>
<p>&nbsp;&nbsp; ArrayList是List接口的可变数组的实现。实现了所有可选列表操作，并允许包括 null 在内的所有元素。除了实现 List 接口外，此类还提供一些方法来操作内部用来存储列表的数组的大小。<br />&nbsp;&nbsp; 每个ArrayList实例都有一个容量，该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元 素，其容量也自动增长。自动增长会带来数据向新数组的重新拷贝，因此，如果可预知数据量的多少，可在构造ArrayList时指定其容量。在添加大量元素 前，应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量，这可以减少递增式再分配的数量。 <br />&nbsp;&nbsp; 注意，此实现不是同步的。如果多个线程同时访问一个ArrayList实例，而其中至少一个线程从结构上修改了列表，那么它必须保持外部同步。</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff">2. ArrayList的实现：</span></p>
<p>&nbsp;&nbsp; 对于ArrayList而言，它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作。下面我们来分析ArrayList的源代码：</p>
<p>&nbsp;&nbsp; <span style="color: #0000ff">1) 底层使用数组实现：</span></p>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">transient</span><span>&nbsp;Object[]&nbsp;elementData;&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">2) 构造方法：</span> <br />&nbsp;&nbsp; ArrayList提供了三种方式的构造器，可以构造一个默认初始容量为10的空列表、构造一个指定初始容量的空列表以及构造一个包含指定collection的元素的列表，这些元素按照该collection的迭代器返回它们的顺序排列的。</p>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">public</span><span>&nbsp;ArrayList()&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>(</span><span class="number">10</span><span>);&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;ArrayList(</span><span class="keyword">int</span><span>&nbsp;initialCapacity)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">super</span><span>();&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(initialCapacity&nbsp;&lt;&nbsp;</span><span class="number">0</span><span>)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;IllegalArgumentException(</span><span class="string">"Illegal&nbsp;Capacity:&nbsp;"</span><span>+&nbsp;initialCapacity);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.elementData&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[initialCapacity];&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;ArrayList(Collection&lt;?&nbsp;</span><span class="keyword">extends</span><span>&nbsp;E&gt;&nbsp;c)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;elementData&nbsp;=&nbsp;c.toArray();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;elementData.length;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;c.toArray&nbsp;might&nbsp;(incorrectly)&nbsp;not&nbsp;return&nbsp;Object[]&nbsp;(see&nbsp;6260652)</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(elementData.getClass()&nbsp;!=&nbsp;Object[].</span><span class="keyword">class</span><span>)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elementData&nbsp;=&nbsp;Arrays.copyOf(elementData,&nbsp;size,&nbsp;Object[].<span class="keyword">class</span><span>);&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff"> 3) 存储：</span> <br />&nbsp;&nbsp; ArrayList提供了set(int index, E element)、add(E e)、add(int index, E element)、addAll(Collection&lt;? extends E&gt; c)、addAll(int index, Collection&lt;? extends E&gt; c)这些添加元素的方法。下面我们一一讲解：</p>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="comment">//&nbsp;用指定的元素替代此列表中指定位置上的元素，并返回以前位于该位置上的元素。</span><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;E&nbsp;set(</span><span class="keyword">int</span><span>&nbsp;index,&nbsp;E&nbsp;element)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;RangeCheck(index);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;oldValue&nbsp;=&nbsp;(E)&nbsp;elementData[index];&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;elementData[index]&nbsp;=&nbsp;element;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;oldValue;&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="comment">//&nbsp;将指定的元素添加到此列表的尾部。</span><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;add(E&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;ensureCapacity(size&nbsp;+&nbsp;<span class="number">1</span><span>);&nbsp;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;elementData[size++]&nbsp;=&nbsp;e;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="comment">//&nbsp;将指定的元素插入此列表中的指定位置。</span><span>&nbsp;&nbsp;</span></li><li><span class="comment">//&nbsp;如果当前位置有元素，则向右移动当前位于该位置的元素以及所有后续元素（将其索引加1）。</span><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;add(</span><span class="keyword">int</span><span>&nbsp;index,&nbsp;E&nbsp;element)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(index&nbsp;&gt;&nbsp;size&nbsp;||&nbsp;index&nbsp;&lt;&nbsp;</span><span class="number">0</span><span>)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;IndexOutOfBoundsException(</span><span class="string">"Index:&nbsp;"</span><span>+index+</span><span class="string">",&nbsp;Size:&nbsp;"</span><span>+size);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;如果数组长度不足，将进行扩容。</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;ensureCapacity(size+<span class="number">1</span><span>);&nbsp;&nbsp;</span><span class="comment">//&nbsp;Increments&nbsp;modCount!!</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将&nbsp;elementData中从Index位置开始、长度为size-index的元素，</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;拷贝到从下标为index+1位置开始的新的elementData数组中。</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;即将当前位于该位置的元素以及所有后续元素右移一个位置。</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(elementData,&nbsp;index,&nbsp;elementData,&nbsp;index&nbsp;+&nbsp;<span class="number">1</span><span>,&nbsp;size&nbsp;-&nbsp;index);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;elementData[index]&nbsp;=&nbsp;element;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;size++;&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="comment">//&nbsp;按照指定collection的迭代器所返回的元素顺序，将该collection中的所有元素添加到此列表的尾部。</span><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;addAll(Collection&lt;?&nbsp;</span><span class="keyword">extends</span><span>&nbsp;E&gt;&nbsp;c)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;a&nbsp;=&nbsp;c.toArray();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;numNew&nbsp;=&nbsp;a.length;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;ensureCapacity(size&nbsp;+&nbsp;numNew);&nbsp;&nbsp;<span class="comment">//&nbsp;Increments&nbsp;modCount</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(a,&nbsp;<span class="number">0</span><span>,&nbsp;elementData,&nbsp;size,&nbsp;numNew);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;+=&nbsp;numNew;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;numNew&nbsp;!=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="comment">//&nbsp;从指定的位置开始，将指定collection中的所有元素插入到此列表中。</span><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;addAll(</span><span class="keyword">int</span><span>&nbsp;index,&nbsp;Collection&lt;?&nbsp;</span><span class="keyword">extends</span><span>&nbsp;E&gt;&nbsp;c)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(index&nbsp;&gt;&nbsp;size&nbsp;||&nbsp;index&nbsp;&lt;&nbsp;</span><span class="number">0</span><span>)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;IndexOutOfBoundsException(&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"Index:&nbsp;"</span><span>&nbsp;+&nbsp;index&nbsp;+&nbsp;</span><span class="string">",&nbsp;Size:&nbsp;"</span><span>&nbsp;+&nbsp;size);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;a&nbsp;=&nbsp;c.toArray();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;numNew&nbsp;=&nbsp;a.length;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;ensureCapacity(size&nbsp;+&nbsp;numNew);&nbsp;&nbsp;<span class="comment">//&nbsp;Increments&nbsp;modCount</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;numMoved&nbsp;=&nbsp;size&nbsp;-&nbsp;index;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(numMoved&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(elementData,&nbsp;index,&nbsp;elementData,&nbsp;index&nbsp;+&nbsp;numNew,&nbsp;numMoved);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(a,&nbsp;<span class="number">0</span><span>,&nbsp;elementData,&nbsp;index,&nbsp;numNew);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;+=&nbsp;numNew;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;numNew&nbsp;!=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff"> 4) 读取：</span></p>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="comment">//&nbsp;返回此列表中指定位置上的元素。</span><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;E&nbsp;get(</span><span class="keyword">int</span><span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;RangeCheck(index);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;(E)&nbsp;elementData[index];&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;&nbsp;<span style="color: #0000ff">&nbsp; 5) 删除：</span> <br />&nbsp;&nbsp; ArrayList提供了根据下标或者指定对象两种方式的删除功能。如下：</p>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="comment">//&nbsp;移除此列表中指定位置上的元素。</span><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;E&nbsp;remove(</span><span class="keyword">int</span><span>&nbsp;index)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;RangeCheck(index);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;modCount++;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;oldValue&nbsp;=&nbsp;(E)&nbsp;elementData[index];&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;numMoved&nbsp;=&nbsp;size&nbsp;-&nbsp;index&nbsp;-&nbsp;</span><span class="number">1</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(numMoved&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(elementData,&nbsp;index+<span class="number">1</span><span>,&nbsp;elementData,&nbsp;index,&nbsp;numMoved);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;elementData[--size]&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;</span><span class="comment">//&nbsp;Let&nbsp;gc&nbsp;do&nbsp;its&nbsp;work</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;oldValue;&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="comment">//&nbsp;移除此列表中首次出现的指定元素（如果存在）。这是应为ArrayList中允许存放重复的元素。</span><span>&nbsp;&nbsp;</span></li><li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;remove(Object&nbsp;o)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;由于ArrayList中允许存放null，因此下面通过两种情况来分别处理。</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(o&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;index&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;index&nbsp;&lt;&nbsp;size;&nbsp;index++)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(elementData[index]&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;类似remove(int&nbsp;index)，移除列表中指定位置上的元素。</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastRemove(index);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;index&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;index&nbsp;&lt;&nbsp;size;&nbsp;index++)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(o.equals(elementData[index]))&nbsp;{&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastRemove(index);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;&nbsp;&nbsp; 注意：从数组中移除元素的操作，也会导致被移除的元素以后的所有元素的向左移动一个位置。<br />&nbsp;&nbsp;<span style="color: #0000ff"> 6) 调整数组容量：</span> <br />&nbsp;&nbsp; 从上面介绍的向ArrayList中存储元素的代码中，我们看到，每当向数组中添加元素时，都要去检查添加后元素的个数是否会超出当前数组的长度，如果超 出，数组将会进行扩容，以满足添加数据的需求。数组扩容通过一个公开的方法ensureCapacity(int minCapacity)来实现。在实际添加大量元素前，我也可以使用ensureCapacity来手动增加ArrayList实例的容量，以减少递增 式再分配的数量。</p>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ensureCapacity(</span><span class="keyword">int</span><span>&nbsp;minCapacity)&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;modCount++;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;oldCapacity&nbsp;=&nbsp;elementData.length;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(minCapacity&nbsp;&gt;&nbsp;oldCapacity)&nbsp;{&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;oldData[]&nbsp;=&nbsp;elementData;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;newCapacity&nbsp;=&nbsp;(oldCapacity&nbsp;*&nbsp;</span><span class="number">3</span><span>)/</span><span class="number">2</span><span>&nbsp;+&nbsp;</span><span class="number">1</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(newCapacity&nbsp;&lt;&nbsp;minCapacity)&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newCapacity&nbsp;=&nbsp;minCapacity;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;minCapacity&nbsp;is&nbsp;usually&nbsp;close&nbsp;to&nbsp;size,&nbsp;so&nbsp;this&nbsp;is&nbsp;a&nbsp;win:</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elementData&nbsp;=&nbsp;Arrays.copyOf(elementData,&nbsp;newCapacity);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;&nbsp; 从上述代码中可以看出，数组进行扩容时，会将老数组中的元素重新拷贝一份到新的数组中，每次数组容量的增长大约是其原容量的1.5倍。这种操作的代价是很 高的，因此在实际使用时，我们应该尽量避免数组容量的扩张。当我们可预知要保存的元素的多少时，要在构造ArrayList实例时，就指定其容量，以避免 数组扩容的发生。或者根据实际需求，通过调用ensureCapacity方法来手动增加ArrayList实例的容量。<br />&nbsp;&nbsp; ArrayList还给我们提供了将底层数组的容量调整为当前列表保存的实际元素的大小的功能。它可以通过trimToSize方法来实现。代码如下：</p>
<div class="dp-highlighter" id="">
<div class="bar">
<div class="tools">Java代码 &nbsp;<a title="收藏这段代码"><img class="star" alt="收藏代码" src="http://zhangshixi.iteye.com/images/icon_star.png" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;trimToSize()&nbsp;{&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;modCount++;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;oldCapacity&nbsp;=&nbsp;elementData.length;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(size&nbsp;&lt;&nbsp;oldCapacity)&nbsp;{&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elementData&nbsp;=&nbsp;Arrays.copyOf(elementData,&nbsp;size);&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span> </li></ol></div>
<p>&nbsp;&nbsp; <span style="color: #0000ff">7) Fail-Fast机制：</span> <br />ArrayList也采用了快速失败的机制，通过记录modCount参数来实现。在面对并发的修改时，迭代器很快就会完全失败，而不是冒着在将来某个不确定时间发生任意不确定行为的风险。具体介绍请参考我之前的文章深入Java集合学习系列：HashMap的实现原理 中的Fail-Fast机制。<br />&nbsp;&nbsp; <span style="color: #0000ff">8) 关于其他</span> 的一些方法的实现都很简单易懂，读者可参照API文档和源代码，一看便知，这里就不再多说。</p>
<p><br /><span style="color: #0000ff">3. 相关阅读：</span> <br />&nbsp;&nbsp; 本系列的文章之前还整理了以下几篇，有兴趣的可以参考，望与大家分享心得，共同进步：<br />&nbsp;&nbsp; 1) 深入Java集合学习系列：HashMap的实现原理 。<br />&nbsp;&nbsp; 2) 深入Java集合学习系列：LinkedHashMap的实现原理 。<br />&nbsp;&nbsp; 3) 深入Java集合学习系列：HashSet的实现原理 。<br />&nbsp;&nbsp; 4) 深入Java集合学习系列：LinkedHashSet的实现原理 。</p></div></div><br /><br />转载自：<a href="http://www.cnblogs.com/batys/archive/2011/11/02/2233597.html">http://www.cnblogs.com/batys/archive/2011/11/02/2233597.html</a><img src ="http://www.blogjava.net/stevenjohn/aggbug/372036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-16 12:28 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/16/372036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java枚举类型enum使用详解 </title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/15/371915.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Thu, 15 Mar 2012 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/15/371915.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/371915.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/15/371915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/371915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/371915.html</trackback:ping><description><![CDATA[<p>java的Enum枚举类型终于在j2se1.5出现了。之前觉得它只不过是鸡肋而已，可有可无。毕竟这么多年来，没有它，大家不都过得很好吗？今日看《Thinking in Java》4th edition，里面有一句话&#8220;有时恰恰因为它，你才能够"优雅而干净"地解决问题。优雅与清晰很重要，正式它们区别了成功的解决方案与失败的解决方案。而失败的解决方案就是因为其他人无法理他。"使用Enum枚举类型，可以将以前笨拙的代码变得优雅简单？但是，我同时也在思考另外一个问题，使用新的技术，会不会给技术人员带来更多的负担呢？</p>
<p>"学习新版语言的一个危险就是疯狂使用新的语法结构"</p>
<p>先学习一下enum的简单应用，以下简洁的代码已经包括enum所提供的绝大部分功能。</p>
<p>1.enum的应用，包括定义，遍历，switch，enumset，enummap等</p>
<p>Java代码&nbsp;</p>
<p>&nbsp;</p>&nbsp;import java.util.EnumMap;<br />import java.util.EnumSet;<br />public class EnumTest {<br />&nbsp;// 定义一个enum枚举类型，包括两个实例ON，OFF<br />&nbsp;public enum State {<br />&nbsp;&nbsp;ON, OFF<br />&nbsp;};<br />&nbsp;// 测试函数<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;// 直接变量enum<br />&nbsp;&nbsp;for (State s : State.values())<br />&nbsp;&nbsp;&nbsp;System.out.println(s.name());<br />&nbsp;&nbsp;// switch与enum的结合使用<br />&nbsp;&nbsp;State switchState = State.OFF;<br />&nbsp;&nbsp;switch (switchState) {<br />&nbsp;&nbsp;case OFF:<br />&nbsp;&nbsp;&nbsp;System.out.println("OFF");<br />&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;case ON:<br />&nbsp;&nbsp;&nbsp;System.out.println("ON");<br />&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;// EnumSet的使用<br />&nbsp;&nbsp;EnumSet&lt;State&gt; stateSet = EnumSet.allOf(State.class);<br />&nbsp;&nbsp;for (State s : stateSet) {<br />&nbsp;&nbsp;&nbsp;System.out.println(s);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;// EnumMap的使用<br />&nbsp;&nbsp;EnumMap&lt;State,String&gt; stateMap = new EnumMap&lt;State,String&gt;(State.class);<br />&nbsp;&nbsp;stateMap.put(State.ON, "is On");<br />&nbsp;&nbsp;stateMap.put(State.OFF, "is off");<br />&nbsp;&nbsp;for (State s : State.values()) {<br />&nbsp;&nbsp;&nbsp;System.out.println(s.name() + ":" + stateMap.get(s));<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p><br /><br />package com.aicent.test;<br />public enum TestEnumMathod {<br />&nbsp;// 为每个enum实例添加不同的实现方法<br />&nbsp;SAMPLE1 {<br />&nbsp;&nbsp;String getInfo() {<br />&nbsp;&nbsp;&nbsp;return "SAMPLE1";<br />&nbsp;&nbsp;}<br />&nbsp;},<br />&nbsp;SAMPLE2 {<br />&nbsp;&nbsp;String getInfo() {<br />&nbsp;&nbsp;&nbsp;return "SAMPLE2";<br />&nbsp;&nbsp;}<br />&nbsp;};<br />&nbsp;abstract String getInfo();<br />&nbsp;// 测试<br />&nbsp;public static void main(String args[]) {<br />&nbsp;&nbsp;for (TestEnumMathod method : values()) {<br />&nbsp;&nbsp;&nbsp;System.out.println(method.getInfo());<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br /><br /><br /><br /><br />以下内容可能有些无聊，但绝对值得一窥<br />1.代码：<br />public class State {<br />public static final int ON = 1;<br />public static final Int OFF= 0;<br />} 
<p>&nbsp;</p>
<p>有什么不好了，大家都这样用了很长时间了，没什么问题啊。<br />首先，它不是类型安全的。你必须确保是int<br />其次，你还要确保它的范围是0和1<br />最后，很多时候你打印出来的时候，你只看到 1 和0 ，</p>
<p>但其没有看到代码的人并不知道你的企图，抛弃你所有旧的public static final常量吧</p>
<p>2.可以创建一个enum类，把它看做一个普通的类。除了它不能继承其他类了。(java是单继承，它已经继承了Enum),<br />可以添加其他方法，覆盖它本身的方法</p>
<p>3.switch()参数可以使用enum了</p>
<p>4.values()方法是编译器插入到enum定义中的static方法，所以，当你将enum实例向上转型为父类Enum是，values()就不可访问了。解决办法：在Class中有一个getEnumConstants()方法，所以即便Enum接口中没有values()方法，我们仍然可以通过Class对象取得所有的enum实例</p>
<p>5.无法从enum继承子类，如果需要扩展enum中的元素，在一个接口的内部，创建实现该接口的枚举，以此将元素进行分组。达到将枚举元素进行分组。</p>
<p>6.使用EnumSet代替标志。enum要求其成员都是唯一的，但是enum中不能删除添加元素。</p>
<p>7.EnumMap的key是enum，value是任何其他Object对象。</p>
<p>8.enum允许程序员为eunm实例编写方法。所以可以为每个enum实例赋予各自不同的行为。</p>
<p>9.使用enum的职责链(Chain of Responsibility) .这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时，遍历这个链，直到链中的某个解决方案能够处理该请求。</p>
<p>10.使用enum的状态机</p>
<p>11.使用enum多路分发</p>
<p>&nbsp;<br /><br />转载自：<a href="http://blog.csdn.net/mqboss/article/details/5647851">http://blog.csdn.net/mqboss/article/details/5647851</a></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/371915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-15 11:16 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/15/371915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Enum类型方法使用</title><link>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371761.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 12 Mar 2012 14:29:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371761.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/371761.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/03/12/371761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/371761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/371761.html</trackback:ping><description><![CDATA[<p>package com.abin.inter.service;</p>
<p>public interface UserService {<br />&nbsp;<br />&nbsp;public static enum UserType{<br />&nbsp;&nbsp;UserBasic("Basic Information"),<br />&nbsp;&nbsp;UserName("Name Of User"),<br />&nbsp;&nbsp;UserSex("Sex Of User"),<br />&nbsp;&nbsp;UserAge("Age Of User"),<br />&nbsp;&nbsp;UserInitialize("Initialize Of User");<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;private String info;<br />&nbsp;&nbsp;private UserType(String _info){<br />&nbsp;&nbsp;&nbsp;this.info=_info;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;public String getObject(){<br />&nbsp;&nbsp;&nbsp;return info;<br />&nbsp;&nbsp;}<br />&nbsp;};<br />&nbsp;<br />&nbsp;<br />&nbsp;int UserSum(int one,int two,UserType userInfo);<br />&nbsp;String Welcome(String username,UserType userInfo);<br />}<br /></p><br /><br /><br /><br /><br /><br />
<p>package com.abin.inter.serviceImpl;</p>
<p>import com.abin.inter.service.UserService;</p>
<p>public class UserServiceImpl implements UserService{<br />&nbsp;@Override<br />&nbsp;public int UserSum(int one, int two,UserType userInfo) {<br />&nbsp;&nbsp;UserType user=UserType.UserInitialize;<br />&nbsp;&nbsp;System.out.println("Enum Info:"+user.getObject());<br />&nbsp;&nbsp;if(userInfo.equals(UserType.UserAge)){<br />&nbsp;&nbsp;&nbsp;System.out.println("UserInfo:"+userInfo);<br />&nbsp;&nbsp;&nbsp;return one+two;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return 0;<br />&nbsp;}</p>
<p>&nbsp;@Override<br />&nbsp;public String Welcome(String username,UserType userInfo) {<br />&nbsp;&nbsp;UserType user=UserType.UserInitialize;<br />&nbsp;&nbsp;System.out.println("Enum Info:"+user);<br />&nbsp;&nbsp;if(userInfo.equals(UserType.UserName)){<br />&nbsp;&nbsp;&nbsp;System.out.println("UserInfo:"+userInfo);<br />&nbsp;&nbsp;&nbsp;return "欢迎"+username;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return "NOT WELCOME";<br />&nbsp;}</p>
<p>&nbsp;@Override<br />&nbsp;public String toString() {<br />&nbsp;&nbsp;// TODO Auto-generated method stub<br />&nbsp;&nbsp;return super.toString();<br />&nbsp;}<br />&nbsp;<br />&nbsp;<br />}<br /></p><br /><br /><br /><br /><br /><br /><br />
<p>package com.abin.inter.test;</p>
<p>import com.abin.inter.service.UserService;<br />import com.abin.inter.service.UserService.UserType;<br />import com.abin.inter.serviceImpl.UserServiceImpl;</p>
<p>import junit.framework.TestCase;</p>
<p>public class TestUser extends TestCase{<br />&nbsp;<br />&nbsp;public void test(){<br />&nbsp;&nbsp;UserService service=new UserServiceImpl();<br />&nbsp;&nbsp;UserType userInfo=UserType.UserAge;<br />&nbsp;&nbsp;int result=service.UserSum(10, 17, userInfo);<br />&nbsp;&nbsp;System.out.println("UserSum="+result);<br />&nbsp;&nbsp;UserType userInfo1=UserType.UserName;<br />&nbsp;&nbsp;String result1=service.Welcome("abin", userInfo1);<br />&nbsp;&nbsp;System.out.println("Welcome="+result1);<br />&nbsp;&nbsp;<br />&nbsp;}<br />}<br /></p><br /><br /><br /><br />运行结果：<br />Enum Info:Initialize Of User<br />UserInfo:UserAge<br />UserSum=27<br />Enum Info:UserInitialize<br />UserInfo:UserName<br />Welcome=欢迎abin<br /> <img src ="http://www.blogjava.net/stevenjohn/aggbug/371761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-03-12 22:29 <a href="http://www.blogjava.net/stevenjohn/archive/2012/03/12/371761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>