﻿<?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-急速追風</title><link>http://www.blogjava.net/gonghao/</link><description>時間在流失，生活仍繼續！</description><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2026 17:44:26 GMT</lastBuildDate><pubDate>Tue, 21 Apr 2026 17:44:26 GMT</pubDate><ttl>60</ttl><item><title>利用java获取计算机cpu利用率和内存使用信息2(转）</title><link>http://www.blogjava.net/gonghao/articles/279068.html</link><dc:creator>艾克</dc:creator><author>艾克</author><pubDate>Sat, 30 May 2009 13:16:00 GMT</pubDate><guid>http://www.blogjava.net/gonghao/articles/279068.html</guid><wfw:comment>http://www.blogjava.net/gonghao/comments/279068.html</wfw:comment><comments>http://www.blogjava.net/gonghao/articles/279068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gonghao/comments/commentRss/279068.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gonghao/services/trackbacks/279068.html</trackback:ping><description><![CDATA[http://blog.csdn.net/guohuang/archive/2008/05/20/2463089.aspx<br /> 利用java程序实现获取计算机cpu利用率和内存使用信息。 
<p>    创建一个Bean用来存贮要得到的信</p><p>public class MonitorInfoBean {<br />    /** 可使用内存. */<br />    private long totalMemory;<br />    <br />    /**  剩余内存. */<br />    private long freeMemory;<br />    <br />    /** 最大可使用内存. */<br />    private long maxMemory;<br />    <br />    /** 操作系统. */<br />    private String osName;<br />    <br />    /** 总的物理内存. */<br />    private long totalMemorySize;<br />    <br />    /** 剩余的物理内存. */<br />    private long freePhysicalMemorySize;<br />    <br />    /** 已使用的物理内存. */<br />    private long usedMemory;<br />    <br />    /** 线程总数. */<br />    private int totalThread;<br />    <br />    /** cpu使用率. */<br />    private double cpuRatio;</p><p>    public long getFreeMemory() {<br />        return freeMemory;<br />    }</p><p>    public void setFreeMemory(long freeMemory) {<br />        this.freeMemory = freeMemory;<br />    }</p><p>    public long getFreePhysicalMemorySize() {<br />        return freePhysicalMemorySize;<br />    }</p><p>    public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {<br />        this.freePhysicalMemorySize = freePhysicalMemorySize;<br />    }</p><p>    public long getMaxMemory() {<br />        return maxMemory;<br />    }</p><p>    public void setMaxMemory(long maxMemory) {<br />        this.maxMemory = maxMemory;<br />    }</p><p>    public String getOsName() {<br />        return osName;<br />    }</p><p>    public void setOsName(String osName) {<br />        this.osName = osName;<br />    }</p><p>    public long getTotalMemory() {<br />        return totalMemory;<br />    }</p><p>    public void setTotalMemory(long totalMemory) {<br />        this.totalMemory = totalMemory;<br />    }</p><p>    public long getTotalMemorySize() {<br />        return totalMemorySize;<br />    }</p><p>    public void setTotalMemorySize(long totalMemorySize) {<br />        this.totalMemorySize = totalMemorySize;<br />    }</p><p>    public int getTotalThread() {<br />        return totalThread;<br />    }</p><p>    public void setTotalThread(int totalThread) {<br />        this.totalThread = totalThread;<br />    }</p><p>    public long getUsedMemory() {<br />        return usedMemory;<br />    }</p><p>    public void setUsedMemory(long usedMemory) {<br />        this.usedMemory = usedMemory;<br />    }</p><p>    public double getCpuRatio() {<br />        return cpuRatio;<br />    }</p><p>    public void setCpuRatio(double cpuRatio) {<br />        this.cpuRatio = cpuRatio;<br />    }<br />}</p><p>    之后，建立bean的接口</p><p>public interface IMonitorService {<br />    public MonitorInfoBean getMonitorInfoBean() throws Exception;</p><p>}</p><p>  然后，就是最关键的，得到cpu的利用率，已用内存，可用内存，最大内存等信息。</p><p>import java.io.InputStreamReader;<br />import java.io.LineNumberReader;</p><p>import sun.management.ManagementFactory;</p><p>import com.sun.management.OperatingSystemMXBean;<br />import java.io.*;<br />import java.util.StringTokenizer;</p><p>/** </p><p> * 获取系统信息的业务逻辑实现类.<br /> * @author GuoHuang<br /> */<br />public class MonitorServiceImpl implements IMonitorService {<br />    <br />    private static final int CPUTIME = 30;</p><p>    private static final int PERCENT = 100;</p><p>    private static final int FAULTLENGTH = 10;<br />    <br />    private static final File versionFile = new File("/proc/version");<br />    private static String linuxVersion = null;</p><p>    /** <br />     * 获得当前的监控对象.<br />     * @return 返回构造好的监控对象<br />     * @throws Exception<br />     * @author GuoHuang<br />     */<br />    public MonitorInfoBean getMonitorInfoBean() throws Exception {<br />        int kb = 1024;<br />        <br />        // 可使用内存<br />        long totalMemory = Runtime.getRuntime().totalMemory() / kb;<br />        // 剩余内存<br />        long freeMemory = Runtime.getRuntime().freeMemory() / kb;<br />        // 最大可使用内存<br />        long maxMemory = Runtime.getRuntime().maxMemory() / kb;</p><p>        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory<br />                .getOperatingSystemMXBean();</p><p>        // 操作系统<br />        String osName = System.getProperty("os.name");<br />        // 总的物理内存<br />        long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;<br />        // 剩余的物理内存<br />        long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;<br />        // 已使用的物理内存<br />        long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb<br />                .getFreePhysicalMemorySize())<br />                / kb;</p><p>        // 获得线程总数<br />        ThreadGroup parentThread;<br />        for (parentThread = Thread.currentThread().getThreadGroup(); parentThread<br />                .getParent() != null; parentThread = parentThread.getParent())<br />            ;<br />        int totalThread = parentThread.activeCount();</p><p>        double cpuRatio = 0;<br />        if (osName.toLowerCase().startsWith("windows")) {<br />            cpuRatio = this.getCpuRatioForWindows();<br />        }<br />        else {<br />         cpuRatio = this.getCpuRateForLinux();<br />        }<br />        <br />        // 构造返回对象<br />        MonitorInfoBean infoBean = new MonitorInfoBean();<br />        infoBean.setFreeMemory(freeMemory);<br />        infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);<br />        infoBean.setMaxMemory(maxMemory);<br />        infoBean.setOsName(osName);<br />        infoBean.setTotalMemory(totalMemory);<br />        infoBean.setTotalMemorySize(totalMemorySize);<br />        infoBean.setTotalThread(totalThread);<br />        infoBean.setUsedMemory(usedMemory);<br />        infoBean.setCpuRatio(cpuRatio);<br />        return infoBean;<br />    }<br />    private static double getCpuRateForLinux(){<br />        InputStream is = null;<br />        InputStreamReader isr = null;<br />        BufferedReader brStat = null;<br />        StringTokenizer tokenStat = null;<br />        try{<br />            System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);</p><p>            Process process = Runtime.getRuntime().exec("top -b -n 1");<br />            is = process.getInputStream();                    <br />            isr = new InputStreamReader(is);<br />            brStat = new BufferedReader(isr);<br />            <br />            if(linuxVersion.equals("2.4")){<br />                brStat.readLine();<br />                brStat.readLine();<br />                brStat.readLine();<br />                brStat.readLine();<br />                <br />                tokenStat = new StringTokenizer(brStat.readLine());<br />                tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                String user = tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                String system = tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                String nice = tokenStat.nextToken();<br />                <br />                System.out.println(user+" , "+system+" , "+nice);<br />                <br />                user = user.substring(0,user.indexOf("%"));<br />                system = system.substring(0,system.indexOf("%"));<br />                nice = nice.substring(0,nice.indexOf("%"));<br />                <br />                float userUsage = new Float(user).floatValue();<br />                float systemUsage = new Float(system).floatValue();<br />                float niceUsage = new Float(nice).floatValue();<br />                <br />                return (userUsage+systemUsage+niceUsage)/100;<br />            }else{<br />                brStat.readLine();<br />                brStat.readLine();<br />                    <br />                tokenStat = new StringTokenizer(brStat.readLine());<br />                tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                tokenStat.nextToken();<br />                String cpuUsage = tokenStat.nextToken();<br />                    <br />                <br />                System.out.println("CPU idle : "+cpuUsage);<br />                Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));<br />                <br />                return (1-usage.floatValue()/100);<br />            }</p><p>             <br />        } catch(IOException ioe){<br />            System.out.println(ioe.getMessage());<br />            freeResource(is, isr, brStat);<br />            return 1;<br />        } finally{<br />            freeResource(is, isr, brStat);<br />        }</p><p>    }<br />    private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br){<br />        try{<br />            if(is!=null)<br />                is.close();<br />            if(isr!=null)<br />                isr.close();<br />            if(br!=null)<br />                br.close();<br />        }catch(IOException ioe){<br />            System.out.println(ioe.getMessage());<br />        }<br />    }</p><p><br />    /** <br />     * 获得CPU使用率.<br />     * @return 返回cpu使用率<br />     * @author GuoHuang<br />     */<br />    private double getCpuRatioForWindows() {<br />        try {<br />            String procCmd = System.getenv("windir")<br />                    + "<a href="http://cumtyjp.blog.163.com/file://system32//wbem//wmic.exe"><font color="#276904">\\system32\\wbem\\wmic.exe</font></a> process get Caption,CommandLine,"<br />                    + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";<br />            // 取进程信息<br />            long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd));<br />            Thread.sleep(CPUTIME);<br />            long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd));<br />            if (c0 != null &amp;&amp; c1 != null) {<br />                long idletime = c1[0] - c0[0];<br />                long busytime = c1[1] - c0[1];<br />                return Double.valueOf(<br />                        PERCENT * (busytime) / (busytime + idletime))<br />                        .doubleValue();<br />            } else {<br />                return 0.0;<br />            }<br />        } catch (Exception ex) {<br />            ex.printStackTrace();<br />            return 0.0;<br />        }<br />    }</p><p>    /**      </p><p>* 读取CPU信息.<br />     * @param proc<br />     * @return<br />     * @author GuoHuang<br />     */<br />    private long[] readCpu(final Process proc) {<br />        long[] retn = new long[2];<br />        try {<br />            proc.getOutputStream().close();<br />            InputStreamReader ir = new InputStreamReader(proc.getInputStream());<br />            LineNumberReader input = new LineNumberReader(ir);<br />            String line = input.readLine();<br />            if (line == null || line.length() &lt; FAULTLENGTH) {<br />                return null;<br />            }<br />            int capidx = line.indexOf("Caption");<br />            int cmdidx = line.indexOf("CommandLine");<br />            int rocidx = line.indexOf("ReadOperationCount");<br />            int umtidx = line.indexOf("UserModeTime");<br />            int kmtidx = line.indexOf("KernelModeTime");<br />            int wocidx = line.indexOf("WriteOperationCount");<br />            long idletime = 0;<br />            long kneltime = 0;<br />            long usertime = 0;<br />            while ((line = input.readLine()) != null) {<br />                if (line.length() &lt; wocidx) {<br />                    continue;<br />                }<br />                // 字段出现顺序：Caption,CommandLine,KernelModeTime,ReadOperationCount,<br />                // ThreadCount,UserModeTime,WriteOperation<br />                String caption = Bytes.substring(line, capidx, cmdidx - 1)<br />                        .trim();<br />                String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();<br />                if (cmd.indexOf("wmic.exe") &gt;= 0) {<br />                    continue;<br />                }<br />                // log.info("line="+line);<br />                if (caption.equals("System Idle Process")<br />                        || caption.equals("System")) {<br />                    idletime += Long.valueOf(<br />                            Bytes.substring(line, kmtidx, rocidx - 1).trim())<br />                            .longValue();<br />                    idletime += Long.valueOf(<br />                            Bytes.substring(line, umtidx, wocidx - 1).trim())<br />                            .longValue();<br />                    continue;<br />                }</p><p>                kneltime += Long.valueOf(<br />                        Bytes.substring(line, kmtidx, rocidx - 1).trim())<br />                        .longValue();<br />                usertime += Long.valueOf(<br />                        Bytes.substring(line, umtidx, wocidx - 1).trim())<br />                        .longValue();<br />            }<br />            retn[0] = idletime;<br />            retn[1] = kneltime + usertime;<br />            return retn;<br />        } catch (Exception ex) {<br />            ex.printStackTrace();<br />        } finally {<br />            try {<br />                proc.getInputStream().close();<br />            } catch (Exception e) {<br />                e.printStackTrace();<br />            }<br />        }<br />        return null;<br />    }<br />    <br />    /**     测试方法.<br />     * @param args<br />     * @throws Exception<br />     * @author GuoHuang<br />       */<br />    public static void main(String[] args) throws Exception {<br />        IMonitorService service = new MonitorServiceImpl();<br />        MonitorInfoBean monitorInfo = service.getMonitorInfoBean();<br />        System.out.println("cpu占有率=" + monitorInfo.getCpuRatio());<br />        <br />        System.out.println("可使用内存=" + monitorInfo.getTotalMemory());<br />        System.out.println("剩余内存=" + monitorInfo.getFreeMemory());<br />        System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory());<br />        <br />        System.out.println("操作系统=" + monitorInfo.getOsName());<br />        System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb");<br />        System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb");<br />        System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb");<br />        System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb");<br />    }<br />}</p><p>    其中，Bytes类用来处理字符串</p>   public class Bytes {<br />    public static String substring(String src, int start_idx, int end_idx){<br />        byte[] b = src.getBytes();<br />        String tgt = "";<br />        for(int i=start_idx; i&lt;=end_idx; i++){<br />            tgt +=(char)b[i];<br />        }<br />        return tgt;<br />    }<br />} <img src ="http://www.blogjava.net/gonghao/aggbug/279068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gonghao/" target="_blank">艾克</a> 2009-05-30 21:16 <a href="http://www.blogjava.net/gonghao/articles/279068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下用java程序获取cpu和内存的使用率(转)</title><link>http://www.blogjava.net/gonghao/articles/279065.html</link><dc:creator>艾克</dc:creator><author>艾克</author><pubDate>Sat, 30 May 2009 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/gonghao/articles/279065.html</guid><wfw:comment>http://www.blogjava.net/gonghao/comments/279065.html</wfw:comment><comments>http://www.blogjava.net/gonghao/articles/279065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gonghao/comments/commentRss/279065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gonghao/services/trackbacks/279065.html</trackback:ping><description><![CDATA[
		<p class="g_p_center g_t_wrap g_t_left g_t_20 g_c_pdin c07 brd01" id="blogtitle_fks_082066085086087071082082080095083080080066080094086075" style="MARGIN: 15px auto; WIDTH: 760px; BORDER-BOTTOM: 1px dotted">
				<span style="FONT-FAMILY: '微软雅黑','黑体',Arial,Helvetica,Sans-Serif">linux下用java程序获取cpu和内存的使用率1(转）</span>
				<span class="g_t_10 c08">
						<font color="#a59974" size="1">　2009-04-15 19:51</font>
				</span>
		</p>
		<div class="g_p_center g_t_right g_c_pdin g_h_20 c08" style="MARGIN-BOTTOM: 20px; WIDTH: 760px">
				<div class="g_p_left">
						<a class="g_c_ul c05" id="aBelongClsfks_082066085086087071082082080095083080080066080094086075" style="FONT-SIZE: 12px" onclick="NEBlog.gPermaLinkPage.updownMenu.openSameClass('fks_087064084083087075082095094095083080080066080094086075', 'java网络编程');" href="http://cumtyjp.blog.163.com/blog/static/7611480820093157512732/#">
								<font color="#276904">分类：java网络编程</font>
						</a>
				</div>
				<div>字号： <a class="g_c_ul c05" id="bigfont" style="FONT-SIZE: 12px" onclick="NEBlog.gPermaLinkPage.updownMenu.changeFont('blogtext_fks_082066085086087071082082080095083080080066080094086075', 1);return false;" href="http://cumtyjp.blog.163.com/blog/static/7611480820093157512732/#"><font color="#276904">大</font></a><span class="g_t_bold c07" id="bigfont_off" style="DISPLAY: none"><strong><font color="#638a4e">大</font></strong></span>  <a class="g_c_ul c05" id="middlefont" style="FONT-SIZE: 12px" onclick="NEBlog.gPermaLinkPage.updownMenu.changeFont('blogtext_fks_082066085086087071082082080095083080080066080094086075', 2);return false;" href="http://cumtyjp.blog.163.com/blog/static/7611480820093157512732/#"><font color="#276904">中</font></a><span class="g_t_bold c07" id="middlefont_off" style="DISPLAY: none"><strong><font color="#638a4e">中</font></strong></span>  <a class="g_c_ul c05" id="smallfont" style="DISPLAY: none; FONT-SIZE: 12px" onclick="NEBlog.gPermaLinkPage.updownMenu.changeFont('blogtext_fks_082066085086087071082082080095083080080066080094086075', 3);return false;" href="http://cumtyjp.blog.163.com/blog/static/7611480820093157512732/#"><font color="#276904">小</font></a><span class="g_t_bold c07" id="smallfont_off" style="DISPLAY: inline"><strong><font color="#638a4e">小</font></strong></span></div>
		</div>
		<div class="g_blog_list">
				<div class="g_t_center g_c_pdin g_p_center c07 content" id="blogtext_fks_082066085086087071082082080095083080080066080094086075" style="WIDTH: 760px">
						<p>http://hi.baidu.com/qmiao128/blog/item/fa91b41f1b6c1f61f724e424.html<br /></p>
						<p>项目组张布置说是要在linux实验平台上获取cpu和内存的使用率，刚开始想的是用jni调用本地方法，但是感觉这个方法太麻烦，主要也是对jni不怎么熟悉。后来在网上查到这个方法，经过改装，运行成功。</p>
						<p>在这个程序中，我将getCpuUsage和getMemUsage两个方法封装到MySystem这个类中，声明为静态方法，这样可以直接通过类来调用方法，而不必创建新的对象。</p>
						<p>这个程序主要还是针对我们实验平台linux系统来做的，如果要运行到其他的linux需要一定的修改。</p>
						<p>import java.io.BufferedReader;<br />import java.io.InputStreamReader;</p>
						<p>
								<br />public class MySystem {<br /><br /><br /><br />public static double getCpuUsage() throws Exception {<br />   double cpuUsed = 0;<br />   double idleUsed = 0.0;<br />   Runtime rt = Runtime.getRuntime();<br />   Process p = rt.exec("top -b -n 1");// call "top" command in linux<br />   BufferedReader in = null;<br />   // try <br />   {<br />    in = new BufferedReader(new InputStreamReader(p.getInputStream()));<br />//    in = new BufferedReader(new InputStreamReader(System.in));<br />    String str = null;<br />    int linecount = 0;</p>
						<p>    while ((str = in.readLine()) != null) {<br />     linecount++;<br />     if (linecount == 3) {<br />      String[] s = str.split("%");<br />      String idlestr = s[3];<br />      String idlestr1[] = idlestr.split(" ");<br />      idleUsed = Double.parseDouble(idlestr1[idlestr1.length-1]);<br />    //   System.out.println("IdleUsed:XXXXXXXXXXXX"+idleUsed);<br />      cpuUsed = 100-idleUsed;<br />    //   System.out.println(cpuUsed);<br />      break;<br />     }</p>
						<p>    }<br />    // System.out.println(str);<br />   }<br />   //   }<br />   /* <br />    }<br />    catch (Exception e) {<br />    e.printStackTrace();<br />    } finally {<br />    in.close();<br />    }*/<br />   return cpuUsed;<br />}<br /><br />public static double getMemUsage() throws Exception {<br />   long memUsed = 0;<br />   long memTotal = 0;<br />   double memUsage = 0.0;<br />   Runtime rt = Runtime.getRuntime();<br />   Process p = rt.exec("top -b -n 1");// call "top" command in linux<br />   BufferedReader in = null;<br />  <br />   // try <br />   {<br />    in = new BufferedReader(new InputStreamReader(p.getInputStream()));<br />//    in = new BufferedReader(new InputStreamReader(System.in));<br />    String str = null;<br />    int linecount = 0;</p>
						<p>    while ((str = in.readLine()) != null) {<br />     linecount++;<br />     if (linecount == 4) {<br />      String[] s = str.split("k ");<br />      String memUsedstr = s[1];<br />      String memTotalstr = s[0];<br />      String memUsedstr1[] = memUsedstr.split(" ");<br />      memUsed = Long.parseLong(memUsedstr1[memUsedstr1.length-1]);<br />      String memTotalstr1[] = memTotalstr.split(" ");<br />      memTotal = Long.parseLong(memTotalstr1[memTotalstr1.length-1]);<br />    //   System.out.println("IdleUsed:XXXXXXXXXXXX"+idleUsed);<br />      memUsage = memUsed*100/memTotal;<br />    //   System.out.println(memUsed+"\n"+memTotal);<br />    //   System.out.println(memUsage);<br />    //   System.out.println(cpuUsed);<br />      break;<br />     }</p>
						<p>    }<br />    // System.out.println(str);<br />   }<br />   //   }<br />   /* <br />    }<br />    catch (Exception e) {<br />    e.printStackTrace();<br />    } finally {<br />    in.close();<br />    }*/<br />   return memUsage;<br />}</p>public static void main(String []args)<br />{<br />   try<br />   {<br />    System.out.println(MySystem.getCpuUsage());<br />    System.out.println(MySystem.getMemUsage());<br />   }<br />   catch(Exception e)<br />   {<br />   <br />   }<br />}<br /> }<br /></div>
		</div>
<img src ="http://www.blogjava.net/gonghao/aggbug/279065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gonghao/" target="_blank">艾克</a> 2009-05-30 21:13 <a href="http://www.blogjava.net/gonghao/articles/279065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用Java中集合类</title><link>http://www.blogjava.net/gonghao/archive/2009/05/17/271165.html</link><dc:creator>艾克</dc:creator><author>艾克</author><pubDate>Sun, 17 May 2009 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/gonghao/archive/2009/05/17/271165.html</guid><wfw:comment>http://www.blogjava.net/gonghao/comments/271165.html</wfw:comment><comments>http://www.blogjava.net/gonghao/archive/2009/05/17/271165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gonghao/comments/commentRss/271165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gonghao/services/trackbacks/271165.html</trackback:ping><description><![CDATA[
		<table class="titel" style="BORDER-TOP: #ffffff 17px solid" cellspacing="0" cellpadding="0" width="98%" border="0">
				<tbody>
						<tr>
								<td align="middle">
										<h1 class="titel">如何使用Java中集合类的详细讲解 </h1>
								</td>
						</tr>
				</tbody>
		</table>
		<table style="MARGIN: 2px 0px 20px" cellspacing="0" cellpadding="0" width="560" border="0">
				<tbody>
						<tr>
								<td bgcolor="#b1bcc0" height="1">
								</td>
						</tr>
				</tbody>
		</table>
		<table style="MARGIN-BOTTOM: 20px" cellspacing="0" cellpadding="0" width="98%" border="0">
				<tbody>
						<tr>
								<td align="middle">
										<span class="content01">
										</span>
										<span class="b">发布时间：2007.05.23 05:27</span>    <span class="b"> 来源：赛迪网技术社区</span>    <span class="b">作者：dxaw</span></td>
						</tr>
				</tbody>
		</table>
		<table class="p11" cellspacing="0" cellpadding="0" width="560" border="0">
				<tbody>
						<tr>
								<td style="WORD-WRAP: break-word" align="left">
										<p class="a14c" style="TEXT-INDENT: 2em">
												<span class="a14c" id="zoom">
														<p style="TEXT-INDENT: 2em">
														</p>
														<center>
																<ccid_nobr>
																		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
																				<tbody>
																						<tr>
																								<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																										<pre>
																												<ccid_code>import java.util.*;

public class Testset {
 public static void main(String args[]){
 Set set = new HashSet();
 set.add("aaa");
 set.add("bbb");
 set.add("aaa");
 set.add("bbb");
 set.add("aaa");
 set.add("bbb");
 set.add("aaa");
 set.add("bbb");
 set.add("aaa");
 set.add("bbb");
 Iterator ite=set.iterator();
 set.size();
 while(ite.hasNext())
  System.out.println("------"+ite.next());
 }
}</ccid_code>
																										</pre>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</ccid_nobr>
														</center>
														<p style="TEXT-INDENT: 2em">在使用Java的时候，我们都会遇到使用集合（Collection）的时候，但是Java API提供了多种集合的实现，我在使用和面试的时候频 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">频遇到这样的“抉择” 。 :）（主要还是面试的时候） 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">久而久之，也就有了一点点的心得体会，写出来以供大家讨论 。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">总的说来，Java API中所用的集合类，都是实现了Collection接口，他的一个类继承结构如下： 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">Collection&lt;--List&lt;--Vector 
</p>
														<p style="TEXT-INDENT: 2em">Collection&lt;--List&lt;--ArrayList 
</p>
														<p style="TEXT-INDENT: 2em">Collection&lt;--List&lt;--LinkedList 
</p>
														<p style="TEXT-INDENT: 2em">Collection&lt;--Set&lt;--HashSet 
</p>
														<p style="TEXT-INDENT: 2em">Collection&lt;--Set&lt;--HashSet&lt;--LinkedHashSet 
</p>
														<p style="TEXT-INDENT: 2em">Collection&lt;--Set&lt;--SortedSet&lt;--TreeSet 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">Vector : 基于Array的List，其实就是封装了Array所不具备的一些功能方便我们使用，它不可能走入Array的限制。性能也就不可能 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">超越Array。所以，在可能的情况下，我们要多运用Array。另外很重要的一点就是Vector“sychronized”的，这个也是Vector和 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">ArrayList的唯一的区别。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">ArrayList：同Vector一样是一个基于Array上的链表，但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些，但 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">是当运行到多线程环境中时，可需要自己在管理线程的同步问题。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">LinkedList：LinkedList不同于前面两种List，它不是基于Array的，所以不受Array性能的限制。它每一个节点（Node）都包含两方 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">面的内容：1.节点本身的数据（data）；2.下一个节点的信息（nextNode）。所以当对LinkedList做添加，删除动作的时候就不用像 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">基于Array的List一样，必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">List总结： 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">1. 所有的List中只能容纳单个不同类型的对象组成的表，而不是Key－Value键值对。例如：[ tom,1,c ]； 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">2. 所有的List中可以有相同的元素，例如Vector中可以有 [ tom,koo,too,koo ]； 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">3. 所有的List中可以有null元素，例如[ tom,null,1 ]； 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">4. 基于Array的List（Vector，ArrayList）适合查询，而LinkedList（链表）适合添加，删除操作。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">HashSet：虽然Set同List都实现了Collection接口，但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">在HashMap的基础上来实现的，这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">HashSet的add（Object obj）方法的实现就可以一目了然了。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">public boolean add(Object obj) 
</p>
														<p style="TEXT-INDENT: 2em">{ 
</p>
														<p style="TEXT-INDENT: 2em">return map.put(obj, PRESENT) == null; 
</p>
														<p style="TEXT-INDENT: 2em">} 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">这个也是为什么在Set中不能像在List中一样有重复的项的根本原因，因为HashMap的key是不能有重复的。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">LinkedHashSet：HashSet的一个子类，一个链表。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">TreeSet：SortedSet的子类，它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">Set总结： 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">1. Set实现的基础是Map（HashMap）； 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">2. Set中的元素是不能重复的，如果使用add(Object obj)方法添加已经存在的对象，则会覆盖前面的对象 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">为什么要使用集合类 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">当你事先不知道要存放数据的个数，或者你需要一种比数组下标存取机制更灵活的方法时，你就需要用到集合类。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">理解集合类 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">集合类存放于java.util包中。 
</p>
														<p style="TEXT-INDENT: 2em">集合类存放的都是对象的引用，而非对象本身，出于表达上的便利，我们称集合中的对象就是指集合中对象的引用（reference)。 
</p>
														<p style="TEXT-INDENT: 2em">集合类型主要有3种：set(集）、list(列表）和map(映射)。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">(1)集 
</p>
														<p style="TEXT-INDENT: 2em">集（set）是最简单的一种集合，它的对象不按特定方式排序，只是简单的把对象加入集合中，就像往口袋里放东西。 
</p>
														<p style="TEXT-INDENT: 2em">对集中成员的访问和操作是通过集中对象的引用进行的，所以集中不能有重复对象。 
</p>
														<p style="TEXT-INDENT: 2em">集也有多种变体，可以实现排序等功能，如TreeSet，它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">列中。它实现的是SortedSet接口，也就是加入了对象比较的方法。通过对集中的对象迭代，我们可以得到一个升序的对象集合。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">(2)列表 
</p>
														<p style="TEXT-INDENT: 2em">列表的主要特征是其对象以线性方式存储，没有特定顺序，只有一个开头和一个结尾，当然，它与根本没有顺序的集是不同的。 
</p>
														<p style="TEXT-INDENT: 2em">列表在数据结构中分别表现为：数组和向量、链表、堆栈、队列。 
</p>
														<p style="TEXT-INDENT: 2em">关于实现列表的集合类，是我们日常工作中经常用到的，将在后边的笔记详细介绍。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">(3)映射 
</p>
														<p style="TEXT-INDENT: 2em">映射与集或列表有明显区别，映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字（Key）对象，关键字决定了 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">对象在映射中的存储位置，检索对象时必须提供相应的关键字，就像在字典中查单词一样。关键字应该是唯一的。 
</p>
														<p style="TEXT-INDENT: 2em">关键字本身并不能决定对象的存储位置，它需要对过一种散列(hashing)技术来处理，产生一个被称作散列码(hash code)的整数值， 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">散列码通常用作一个偏置量，该偏置量是相对于分配给映射的内存区域起始位置的，由此确定关键字/对象对的存储位置。理想情况 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">下，散列处理应该产生给定范围内均匀分布的值，而且每个关键字应得到不同的散列码。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">集合类简介 
</p>
														<p style="TEXT-INDENT: 2em">java.util中共有13个类可用于管理集合对象，它们支持集、列表或映射等集合，以下是这些类的简单介绍 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">集： 
</p>
														<p style="TEXT-INDENT: 2em">HashSet： 使用HashMap的一个集的实现。虽然集定义成无序，但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">象实现集的存储和检索操作是在固定时间内实现的. 
</p>
														<p style="TEXT-INDENT: 2em">TreeSet： 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">了一个TreeMap. 
</p>
														<p style="TEXT-INDENT: 2em">列表： 
</p>
														<p style="TEXT-INDENT: 2em">Vector： 实现一个类似数组一样的表，自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类??当两个或多个线程同时访问时也是性能良好的。 
</p>
														<p style="TEXT-INDENT: 2em">Stsck: 这个类从Vector派生而来，并且增加了方法实现栈??一种后进先出的存储结构。 
</p>
														<p style="TEXT-INDENT: 2em">LinkedList: 实现一个链表。由这个类定义的链表也可以像栈或队列一样被使用。 
</p>
														<p style="TEXT-INDENT: 2em">ArrayList: 实现一个数组，它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">映射： 
</p>
														<p style="TEXT-INDENT: 2em">HashTable： 实现一个映象，所有的键必须非空。为了能高效的工作，定义键的类必须实现hashcode()方法和equal()方法。这个类 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">是前面java实现的一个继承，并且通常能在实现映象的其他类中更好的使用。 
</p>
														<p style="TEXT-INDENT: 2em">HashMap： 实现一个映象，允许存储空对象，而且允许键是空（由于键必须是唯一的，当然只能有一个）。 
</p>
														<p style="TEXT-INDENT: 2em">WeakHashMap： 实现这样一个映象：通常如果一个键对一个对象而言不再被引用，键/对象对将被舍弃。这与HashMap形成对照，映象 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">中的键维持键/对象对的生命周期，尽管使用映象的程序不再有对键的引用，并且因此不能检索对象。 
</p>
														<p style="TEXT-INDENT: 2em">TreeMap： 实现这样一个映象，对象是按键升序排列的。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">Set和List都是由公共接口Collection扩展而来，所以它们都可以使用一个类型为Collection的变量来引用。这就意味着任何列表或 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">集构成的集合都可以用这种方式引用，只有映射类除外（但也不是完全排除在外，因为可以从映射获得一个列表。）所以说，把一个 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">列表或集传递给方法的标准途径是使用Collection类型的参数。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">Vector 还是ArrayList，哪一个更好，为什么？ 
</p>
														<p style="TEXT-INDENT: 2em">要回答这个问题不能一概而论，有时候使用Vector比较好；有时是ArrayList，有时候这两个都不是最好的选择。你别指望能够获得 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">一个简单肯定答案，因为这要看你用它们干什么。下面有4个要考虑的因素： 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">(1)API 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">(2)同步处理 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">(3)数据增长性 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">(4)使用模式 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">下面针对这4个方面进行一一探讨 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">API 
</p>
														<p style="TEXT-INDENT: 2em">在由Ken Arnold等编著的《Java Programming Language》(Addison-Wesley, June 2000)一书中有这样的描述，Vector类似于 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">ArrayList.。所有从API的角度来看这两个类非常相似。但他们之间也还是有一些主要的区别的。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">同步性 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的，因此ArrayList中的对象并不 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">是线程安全的。因为同步的要求会影响执行的效率，所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择，这样 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">可以避免由于同步带来的不必要的性能开销。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">数据增长 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候，如果元素 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度，Vector缺省情况下自动增长原来一倍的数组长度，ArrayList是 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">有一些优势，因为你可以通过设置集合的初始化大小来避免不必要的资源开销。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">使用模式 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">在ArrayList和Vector中，从一个指定的位置（通过索引）查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的， 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">这个时间我们用O(1)表示。但是，如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长：O(n-i)，其中n代表集合中 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">元素的个数，i代表元素增加或移除元素的索引位置。为什么会这样呢？以为在进行上述操作的时候集合中第i和第i个元素之后的所 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">有元素都要执行位移的操作。这一切意味着什么呢？ 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">这意味着，你只是查找特定位置的元素或只在集合的末端增加、移除元素，那么使用Vector或ArrayList都可以。如果是其他操作， 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">你最好选择其他的集合操作类。比如，LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的—O(1)，但它在 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">索引一个元素的使用缺比较慢－O(i),其中i是索引的位置.使用ArrayList也很容易，因为你可以简单的使用索引来代替创建iterator 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">对象的操作。LinkList也会为每个插入的元素创建对象，所有你要明白它也会带来额外的开销。 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">最后，在《Practical Java》一书中Peter Haggar建议使用一个简单的数组（Array）来代替Vector或ArrayList。尤其是对于执行效 
</p>
														<p style="TEXT-INDENT: 2em">
														</p>
														<p style="TEXT-INDENT: 2em">率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。(T007) </p>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/gonghao/aggbug/271165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gonghao/" target="_blank">艾克</a> 2009-05-17 22:24 <a href="http://www.blogjava.net/gonghao/archive/2009/05/17/271165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java集合</title><link>http://www.blogjava.net/gonghao/archive/2009/05/17/271164.html</link><dc:creator>艾克</dc:creator><author>艾克</author><pubDate>Sun, 17 May 2009 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/gonghao/archive/2009/05/17/271164.html</guid><wfw:comment>http://www.blogjava.net/gonghao/comments/271164.html</wfw:comment><comments>http://www.blogjava.net/gonghao/archive/2009/05/17/271164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gonghao/comments/commentRss/271164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gonghao/services/trackbacks/271164.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">Collection </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">├List </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">│├LinkedList </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">│├ArrayList </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">│└Vector </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">│　└Stack </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">└Set </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">Map </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">├Hashtable </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">├HashMap </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">└WeakHashMap </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements） </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">Map提供key到value的映射 </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">Vector与ArrayList及LinkedList</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">同步性</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的，因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率，所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择，这样可以避免由于同步带来的不必要的性能开销。</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">数据增长</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候，如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度，Vector缺省情况下自动增长原来一倍的数组长度，ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势，因为你可以通过设置集合的初始化大小来避免不必要的资源开销。</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">使用模式</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">在ArrayList和Vector中，从一个指定的位置（通过索引）查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的，这个时间我们用O(1)表示。但是，如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长：O(n-i)，其中n代表集合中元素的个数，i代表元素增加或移除元素的索引位置。为什么会这样呢？以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢？</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">这意味着，你只是查找特定位置的元素或只在集合的末端增加、移除元素，那么使用Vector或ArrayList都可以。如果是其他操作，你最好选择其他的集合操作类。比如，LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的—O(1)，但它在索引一个元素的使用缺比较慢－O(i),其中i是索引的位置.使用ArrayList也很容易，因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象，所有你要明白它也会带来额外的开销。</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">最后，在《Practical Java》一书中Peter Haggar建议使用一个简单的数组（Array）来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">三者不同</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">ArrayList和Vector通常比LinkedList和同步封装之后的LinkedList有着更好的性能。即使在你认为LinkedList可能提供更高性能的情况下，你也可以通过修改元素加入的方式从ArrayList争取更好的性能，例如翻转集合元素的次序。</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">有些情况下LinkedList会有更好的性能，例如，当大量元素需要同时加入到大型集合的开头和末尾时。但一般而言，我建议你优先使用ArrayList/Vector类，只有当它们存在明显的性能问题而LinkedList能够改进性能时，才使用LinkedList。</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">HashMap和Hashtable的区别</font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">1.历史原因:Hashtable是基于陈旧的Dictionary类的，HashMap是Java 1.2引进的Map接口的一个实现 </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">2.同步性:Hashtable是线程安全的，也就是说是同步的，而HashMap是线程序不安全的，不是同步的 </font>
		</p>
		<p style="TEXT-INDENT: 2em">
				<font color="#000000">3.值：只有HashMap可以让你将空值作为一个表的条目的key或value </font>
		</p>
<img src ="http://www.blogjava.net/gonghao/aggbug/271164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gonghao/" target="_blank">艾克</a> 2009-05-17 22:21 <a href="http://www.blogjava.net/gonghao/archive/2009/05/17/271164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JTextArea</title><link>http://www.blogjava.net/gonghao/archive/2009/05/07/269483.html</link><dc:creator>艾克</dc:creator><author>艾克</author><pubDate>Thu, 07 May 2009 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/gonghao/archive/2009/05/07/269483.html</guid><wfw:comment>http://www.blogjava.net/gonghao/comments/269483.html</wfw:comment><comments>http://www.blogjava.net/gonghao/archive/2009/05/07/269483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gonghao/comments/commentRss/269483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gonghao/services/trackbacks/269483.html</trackback:ping><description><![CDATA[
		<p>import java.awt.Graphics;</p>
		<p>import javax.swing.ImageIcon;<br />import javax.swing.JFrame;<br />import javax.swing.JScrollPane;<br />import javax.swing.JTextArea;</p>
		<p>/**<br /> * 在JTextArea中显示一个图片背景（背景随滚动而移动位置）<br /> * <br /> * @author 五斗米 &lt;如转载请保留作者和出处&gt;<br /> * @blog <a href="http://blog.csdn.net/mq612">http://blog.csdn.net/mq612</a><br /> */<br />public class Test extends JFrame {</p>
		<p> private static final long serialVersionUID = 4785452373598819719L;</p>
		<p> private JScrollPane sp = null;</p>
		<p> private JTextArea text = null;</p>
		<p> private ImageIcon imageIcon = null;</p>
		<p> public Test() {<br />  super("JTextArea");<br />  <br />  imageIcon = new ImageIcon("photo.jpg");<br />  text = new JTextArea() {<br />   private static final long serialVersionUID = -8220994963464909915L;</p>
		<p>   {<br />    setOpaque(false); // 设置透明<br />   }</p>
		<p>   protected void paintComponent(Graphics g) {<br />    g.drawImage(imageIcon.getImage(), 0, 0, this);<br />    super.paintComponent(g);<br />   }<br />  };<br />  sp = new JScrollPane(text);</p>
		<p>  this.getContentPane().add(sp);</p>
		<p>  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />  this.setSize(360, 260);<br />  this.setVisible(true);<br /> }</p>
		<p> public static void main(String args[]) {<br />  new Test();<br /> }</p>
		<p>}<br /> </p>
		<p>
				<br />二、背景不随滚动而移动位置：</p>
		<p>import java.awt.BorderLayout;<br />import java.awt.Graphics;</p>
		<p>import javax.swing.ImageIcon;<br />import javax.swing.JFrame;<br />import javax.swing.JPanel;<br />import javax.swing.JScrollPane;<br />import javax.swing.JTextArea;</p>
		<p>/**<br /> * 在JTextArea中显示一个图片背景（背景不随滚动而移动位置）<br /> * <br /> * @author 五斗米 &lt;如转载请保留作者和出处&gt;<br /> * @blog <a href="http://blog.csdn.net/mq612">http://blog.csdn.net/mq612</a><br /> */<br />public class Test extends JFrame {</p>
		<p> private static final long serialVersionUID = 4785452373598819719L;</p>
		<p> private JScrollPane sp = null;</p>
		<p> private JTextArea text = null;</p>
		<p> private ImageIcon imageIcon = null;</p>
		<p> public Test() {<br />  super("JTextArea");</p>
		<p>  imageIcon = new ImageIcon("photo.jpg");<br />  // 构造文本组件并使之透明<br />  text = new JTextArea();<br />  text.setOpaque(false);<br />  // 构造滚动组件并使之透明<br />  sp = new JScrollPane(text);<br />  sp.setOpaque(false);<br />  sp.getViewport().setOpaque(false);<br />  // 构造一个背景JPanel<br />  JPanel backdrop = new JPanel() {<br />   private static final long serialVersionUID = 1957203784117943458L;<br />   {<br />    this.setOpaque(false);<br />    this.setLayout(new BorderLayout());<br />   }</p>
		<p>   public void paintComponent(Graphics g) {<br />    g.drawImage(imageIcon.getImage(), 0, 0, this);<br />    super.paintComponents(g);<br />   }<br />  };<br />  // 将滚动组件加入<br />  backdrop.add(sp);<br />  // 将背景组件加入窗体<br />  this.getContentPane().add(backdrop);</p>
		<p>  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />  this.setSize(360, 260);<br />  this.setVisible(true);<br /> }</p>
		<p> public static void main(String args[]) {<br />  new Test();<br /> }</p>
		<p>}</p>
<img src ="http://www.blogjava.net/gonghao/aggbug/269483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gonghao/" target="_blank">艾克</a> 2009-05-07 21:02 <a href="http://www.blogjava.net/gonghao/archive/2009/05/07/269483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>