﻿<?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-silvermyth-文章分类-Java</title><link>http://www.blogjava.net/silvermyth/category/55180.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 31 Mar 2017 06:09:08 GMT</lastBuildDate><pubDate>Fri, 31 Mar 2017 06:09:08 GMT</pubDate><ttl>60</ttl><item><title>Swing Worker应用举例</title><link>http://www.blogjava.net/silvermyth/articles/353009.html</link><dc:creator>Gavin Li</dc:creator><author>Gavin Li</author><pubDate>Sun, 26 Jun 2011 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/silvermyth/articles/353009.html</guid><wfw:comment>http://www.blogjava.net/silvermyth/comments/353009.html</wfw:comment><comments>http://www.blogjava.net/silvermyth/articles/353009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/silvermyth/comments/commentRss/353009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/silvermyth/services/trackbacks/353009.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;在开发Java Swing应用程序的过程中，有两个原则是必须要牢记的：<br />&nbsp;&nbsp;&nbsp;&nbsp;1.耗时的操作（例如从数据库查询大量数据，读取URI资源等）一定不能运行在EDT(事件派发线程)上，否则会导致Swing用户界面失去响应。<br />&nbsp;&nbsp;&nbsp;&nbsp;2.只能在EDT线程上对Swing Components进行访问。<br />&nbsp;&nbsp;&nbsp;&nbsp;基于上面两点原因，在一个Java Swing程序中，要想使用户界面响应灵敏，至少应该有两个线程；一个线程用来执行耗时操作，EDT线程用来执行所有与Swing Components的交互，例如更新文本，重绘图形等等。这就要求两个线程之间要相互通讯，给程序的开发带来了不少的难度，Swing Worker的出现从根本上解决了这个问题，使程序员快速开发反应灵敏的的Swing程序成为可能。SwingWoker被设计应用在此种场景下，你有一个耗时操作需要运行在后台，在该操作完成或部分完成时，你要利用操作返回的结果去更新用户界面。<br />&nbsp;&nbsp;&nbsp;&nbsp;让我们假想有这样一个应用场景，我有一个保存联系人的文件，我需要从中读取并解析出所有联系人的信息，并及时更新在一个JTable中；假设这个文件非常的大，解析出所有联系人的信息需要花费几分钟的时间，如果不能很好的协调这个任务和EDT线程，则很有可能会造成用户在几分钟时间里得不到结果，而Swing界面处于无响应状态。在这种情况下，SwingWorker就是一个绝佳的选择。我们首先看一下SwingWorker的定义：<br />&nbsp;&nbsp;&nbsp;&nbsp;public abstract class <strong>SwingWorker&lt;T,V&gt; </strong>extends <a title="class in java.lang" href="http://download.oracle.com/javase/6/docs/api/java/lang/Object.html">Object</a>&nbsp;implements <a title="interface in java.util.concurrent" href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/RunnableFuture.html">RunnableFuture</a>&lt;T&gt;<br />显然，这时一个抽象的模板类，在应用的时候，我们需要继承SwingWorker并实例化模板参数。那么，这两个模板类型究竟是什么意思呢，T参数代表的是你的耗时任务执行完成时返回的结果类型，V代表的是你的耗时任务部分完成时返回的结果类型。在我们的场景中，假设任务完成时我们需要一个List&lt;BeanContact&gt;(BeanContact是一个保存联系人信息的JavaBean),每当从文件中解析出一个联系人信息时，我们会新建一个BeanContact并需要更新到JTable中。那么我们的T就是List&lt;BeanContact&gt;,而V就是BeanContact,则应该定义如下的类：<br />&nbsp;&nbsp;&nbsp;&nbsp; <font face="Verdana">public class LoadContactsTask extends SwingWorker&lt;List&lt;BeanContact&gt;, BeanContact&gt; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp; protected List&lt;BeanContact&gt; doInBackground() throws Exception {</font><font face="Verdana"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//To do the task and return the result<br />&nbsp;&nbsp;&nbsp; }</font></p><br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;从上面可以看到，我们还必须覆盖SwingWorker的doInBackground方法，该方法执行我们的耗时操作，并且返回模板实例化时的T类型结果。下面是具体的代码实现：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp; protected List&lt;BeanContact&gt; doInBackground() throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader reader = new BufferedReader(new FileReader("c:/contacts.cff"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((line = reader.readLine()) != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] strContacts = line.split(",");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanContact contact = new BeanContact();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contact.setName(strContacts[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contact.setSex(strContacts[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contact.setPhone(strContacts[2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contact.setEmail(strContacts[3]);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lineCnt++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; publish(contact);/*********/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contacts.add(contact);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return contacts;<br />&nbsp;&nbsp;&nbsp; }</font></p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该方法很简单，就是从文件中读取一个联系人的记录并且新建一个BeanContact实例添加到结果集中。我们需要注意的是其中的publish方法，该方法用来发布部分执行结果，每读取一个联系人信息，我们就用该方法把新建的BeanContact发布出去。我们需要知道的是，在publish若干个结果后（可能是一个或多个，由SwingWorker类实现）SwingWorker类的process方法会被自动回调，而我们可以在其中去更新用户界面，SwingWorker保证process方法中所有操作都运行在EDT线程中。下面是我们的具体实现：<br />&nbsp;&nbsp;&nbsp;&nbsp;<font face="Verdana">@Override<br />&nbsp;&nbsp;&nbsp; protected void process(List&lt;BeanContact&gt; chunks) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (progressHandle != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progressHandle.processInProgress(chunks, lineCnt * 100 / 10000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</font><br />&nbsp;&nbsp;&nbsp;&nbsp;我们的实现中，process中会调用IProgressHandle（自定义的一个接口，用来更新用户界面，详见后面代码）的processInProgress方法来更新用户界面，大家会注意到process方法的参数是一个List&lt;BeanContact&gt;,为什么不是一个BeanContact呢，答案就是我们在上面讲过的，有可能publish若干次后才调用process方法。<br />&nbsp;&nbsp;&nbsp;&nbsp;与此类似，在doInBackground完成后，SwingWorker会自动调用done方法，下面是我们的实现：<br />&nbsp;&nbsp;&nbsp;&nbsp;<font face="Verdana">@Override<br />&nbsp;&nbsp;&nbsp; protected void done() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (progressHandle != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progressHandle.processComplete(contacts);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;客户端如何来使用用SwingWork呢，很简单，只需要新建一个实例并且调用它的execute方法即可，他会自动调用doInBackground方法来完成操作；以下是完整的代码实现：<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;
<p>/*<br />&nbsp;* To change this template, choose Tools | Templates<br />&nbsp;* and open the template in the editor.<br />&nbsp;*/<br />package swingworkertest;</p>
<p>/**<br />&nbsp;*<br />&nbsp;* @author Administrator<br />&nbsp;*/<br />public class BeanContact {<br />&nbsp;&nbsp;&nbsp; private String name=null;<br />&nbsp;&nbsp;&nbsp; private String sex=null;<br />&nbsp;&nbsp;&nbsp; private String phone=null;<br />&nbsp;&nbsp;&nbsp; private String email=null;</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @return the name<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getName() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param name the name to set<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @return the sex<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getSex() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sex;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param sex the sex to set<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public void setSex(String sex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.sex = sex;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @return the phone<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getPhone() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return phone;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param phone the phone to set<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public void setPhone(String phone) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.phone = phone;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @return the email<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public String getEmail() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return email;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param email the email to set<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public void setEmail(String email) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.email = email;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />}<br /></p><br />
<p>/*<br />&nbsp;* To change this template, choose Tools | Templates<br />&nbsp;* and open the template in the editor.<br />&nbsp;*/</p>
<p>/*<br />&nbsp;* Contacts.java<br />&nbsp;*<br />&nbsp;* Created on 2011-6-25, 10:40:13<br />&nbsp;*/<br />package swingworkertest;</p>
<p>import javax.swing.JFileChooser;</p>
<p>/**<br />&nbsp;*<br />&nbsp;* @author Administrator<br />&nbsp;*/<br />public class Contacts extends javax.swing.JFrame {</p>
<p>&nbsp;&nbsp;&nbsp; /** Creates new form Contacts */<br />&nbsp;&nbsp;&nbsp; public Contacts() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initComponents();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handle = new DefaultProgressHandle();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handle.setTable(jTable1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handle.setProgressBar(jProgressBar1);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /** This method is called from within the constructor to<br />&nbsp;&nbsp;&nbsp;&nbsp; * initialize the form.<br />&nbsp;&nbsp;&nbsp;&nbsp; * WARNING: Do NOT modify this code. The content of this method is<br />&nbsp;&nbsp;&nbsp;&nbsp; * always regenerated by the Form Editor.<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; @SuppressWarnings("unchecked")<br />&nbsp;&nbsp;&nbsp; // &lt;editor-fold defaultstate="collapsed" desc="Generated Code"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private void initComponents() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jButton1 = new javax.swing.JButton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jTextField1 = new javax.swing.JTextField();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jScrollPane1 = new javax.swing.JScrollPane();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jTable1 = new javax.swing.JTable();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jButton2 = new javax.swing.JButton();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jProgressBar1 = new javax.swing.JProgressBar();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jButton1.setText("浏览");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jButton1.addActionListener(new java.awt.event.ActionListener() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void actionPerformed(java.awt.event.ActionEvent evt) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jButton1ActionPerformed(evt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jTextField1.setEditable(false);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jTable1.setModel(new javax.swing.table.DefaultTableModel(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Object [][] {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new String [] {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "姓名", "性别", "电话", "电子邮件"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class[] types = new Class [] {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Class getColumnClass(int columnIndex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return types [columnIndex];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jScrollPane1.setViewportView(jTable1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jButton2.setText("加载联系人");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jButton2.addActionListener(new java.awt.event.ActionListener() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void actionPerformed(java.awt.event.ActionEvent evt) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jButton2ActionPerformed(evt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getContentPane().setLayout(layout);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.setHorizontalGroup(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addContainerGap()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 557, Short.MAX_VALUE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jProgressBar1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 557, Short.MAX_VALUE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jButton2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 557, Short.MAX_VALUE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addGroup(layout.createSequentialGroup()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 97, Short.MAX_VALUE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addGap(18, 18, 18)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 442, javax.swing.GroupLayout.PREFERRED_SIZE)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addContainerGap())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.setVerticalGroup(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addGroup(layout.createSequentialGroup()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addContainerGap()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jButton1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jButton2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jButton1, jButton2, jTextField1});</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pack();<br />&nbsp;&nbsp;&nbsp; }// &lt;/editor-fold&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ContactsFileFilter filter = new ContactsFileFilter();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFileChooser chooser = new JFileChooser();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chooser.setFileFilter(filter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int returnVal = chooser.showOpenDialog(null);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(returnVal == JFileChooser.APPROVE_OPTION){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jTextField1.setText(chooser.getSelectedFile().getAbsolutePath());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO add your handling code here:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoadContactsTask task = new LoadContactsTask(jTextField1.getText());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; task.setProgressHandle(handle);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; task.execute();<br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param args the command line arguments<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.awt.EventQueue.invokeLater(new Runnable() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Contacts contacts = new Contacts();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contacts.setTitle("Contacts");;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contacts.setVisible(true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; DefaultProgressHandle handle = null;<br />&nbsp;&nbsp;&nbsp; // Variables declaration - do not modify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private javax.swing.JButton jButton1;<br />&nbsp;&nbsp;&nbsp; private javax.swing.JButton jButton2;<br />&nbsp;&nbsp;&nbsp; private javax.swing.JProgressBar jProgressBar1;<br />&nbsp;&nbsp;&nbsp; private javax.swing.JScrollPane jScrollPane1;<br />&nbsp;&nbsp;&nbsp; private javax.swing.JTable jTable1;<br />&nbsp;&nbsp;&nbsp; private javax.swing.JTextField jTextField1;<br />&nbsp;&nbsp;&nbsp; // End of variables declaration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />}<br /></p><br />
<p>/*<br />&nbsp;* To change this template, choose Tools | Templates<br />&nbsp;* and open the template in the editor.<br />&nbsp;*/<br />package swingworkertest;</p>
<p>import java.io.File;<br />import javax.swing.filechooser.FileFilter;</p>
<p>/**<br />&nbsp;*<br />&nbsp;* @author Administrator<br />&nbsp;*/<br />public class ContactsFileFilter extends FileFilter{</p>
<p>&nbsp;&nbsp;&nbsp; public boolean accept(File pathname) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathname.isDirectory()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pathname.getName().endsWith(".cff");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; public String getDescription() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Text Files";<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />}<br /></p><br />
<p>/*<br />&nbsp;* To change this template, choose Tools | Templates<br />&nbsp;* and open the template in the editor.<br />&nbsp;*/<br />package swingworkertest;</p>
<p>import java.util.List;<br />import javax.swing.JProgressBar;<br />import javax.swing.JTable;<br />import javax.swing.table.DefaultTableModel;</p>
<p>/**<br />&nbsp;*<br />&nbsp;* @author Administrator<br />&nbsp;*/<br />public class DefaultProgressHandle implements IProgressHandle {</p>
<p>&nbsp;&nbsp;&nbsp; private JTable table = null;<br />&nbsp;&nbsp;&nbsp; private JProgressBar progressBar = null;</p>
<p>&nbsp;&nbsp;&nbsp; public void processInProgress(List&lt;BeanContact&gt; contacts, int progress) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultTableModel model = (DefaultTableModel) table.getModel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (BeanContact contact : contacts) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] strArray = {contact.getName(), contact.getSex(), contact.getPhone(), contact.getEmail()};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model.addRow(strArray);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progressBar.setValue(progress);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void processComplete(List&lt;BeanContact&gt; contacts) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progressBar.setValue(progressBar.getMaximum());<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param table the table to set<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public void setTable(JTable table) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.table = table;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param progressBar the progressBar to set<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public void setProgressBar(JProgressBar progressBar) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.progressBar = progressBar;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></p><br />
<p>/*<br />&nbsp;* To change this template, choose Tools | Templates<br />&nbsp;* and open the template in the editor.<br />&nbsp;*/<br />package swingworkertest;</p>
<p>import java.util.List;</p>
<p>/**<br />&nbsp;*<br />&nbsp;* @author Administrator<br />&nbsp;*/<br />public interface IProgressHandle {<br />&nbsp;&nbsp;&nbsp; public abstract void processInProgress(List&lt;BeanContact&gt; contacts,int progress);<br />&nbsp;&nbsp;&nbsp; public abstract void processComplete(List&lt;BeanContact&gt; contacts);<br />}<br /></p><br />
<p>/*<br />&nbsp;* To change this template, choose Tools | Templates<br />&nbsp;* and open the template in the editor.<br />&nbsp;*/<br />package swingworkertest;</p>
<p>import java.io.BufferedReader;<br />import java.io.FileReader;<br />import java.util.ArrayList;<br />import java.util.List;<br />import javax.swing.SwingWorker;</p>
<p>/**<br />&nbsp;*<br />&nbsp;* @author Administrator<br />&nbsp;*/<br />public class LoadContactsTask extends SwingWorker&lt;List&lt;BeanContact&gt;, BeanContact&gt; {</p>
<p>&nbsp;&nbsp;&nbsp; private String fileName = null;<br />&nbsp;&nbsp;&nbsp; private IProgressHandle progressHandle = null;<br />&nbsp;&nbsp;&nbsp; private List&lt;BeanContact&gt; contacts = null;<br />&nbsp;&nbsp;&nbsp; private int lineCnt = 0;</p>
<p>&nbsp;&nbsp;&nbsp; public LoadContactsTask(String fileName) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.fileName = fileName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contacts = new ArrayList&lt;BeanContact&gt;();<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; protected List&lt;BeanContact&gt; doInBackground() throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader reader = new BufferedReader(new FileReader("c:/contacts.cff"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((line = reader.readLine()) != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] strContacts = line.split(",");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanContact contact = new BeanContact();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contact.setName(strContacts[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contact.setSex(strContacts[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contact.setPhone(strContacts[2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contact.setEmail(strContacts[3]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lineCnt++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; publish(contact);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contacts.add(contact);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return contacts;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * @param progressHandle the progressHandle to set<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; public void setProgressHandle(IProgressHandle progressHandle) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.progressHandle = progressHandle;<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; protected void process(List&lt;BeanContact&gt; chunks) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (progressHandle != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progressHandle.processInProgress(chunks, lineCnt * 100 / 10000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; protected void done() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (progressHandle != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; progressHandle.processComplete(contacts);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></p></font></font><img src ="http://www.blogjava.net/silvermyth/aggbug/353009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/silvermyth/" target="_blank">Gavin Li</a> 2011-06-26 11:10 <a href="http://www.blogjava.net/silvermyth/articles/353009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Volatile的一种简单应用</title><link>http://www.blogjava.net/silvermyth/articles/352316.html</link><dc:creator>Gavin Li</dc:creator><author>Gavin Li</author><pubDate>Tue, 14 Jun 2011 14:53:00 GMT</pubDate><guid>http://www.blogjava.net/silvermyth/articles/352316.html</guid><wfw:comment>http://www.blogjava.net/silvermyth/comments/352316.html</wfw:comment><comments>http://www.blogjava.net/silvermyth/articles/352316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/silvermyth/comments/commentRss/352316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/silvermyth/services/trackbacks/352316.html</trackback:ping><description><![CDATA[<span>&nbsp; 
</span><div style="list-style: disc outside none; background-image: none; position: static; text-align: left; padding: 0px; line-height: normal; overflow: visible; text-transform: none; background-color: transparent; font-variant-ligatures: normal; font-variant-caps: normal; font-style: normal; text-indent: 0pt; background-attachment: scroll; display: block; font-family: &quot;MS Shell Dlg&quot;; background-position: 0% 0%; float: none; letter-spacing: normal; visibility: inherit; color: #000000; clear: none; font-size: 12px; text-decoration: none;"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Tahoma; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="list-style: disc none outside;background-image: none; border-bottom: #000000; position: static; text-align: left; border-left: #000000; padding-bottom: 0px; line-height: normal; overflow-x: visible; overflow-y: visible; text-transform: none; background-color: transparent; font-variant: normal; font-style: normal; text-indent: 0pt; padding-left: 0px; background-attachment: scroll; padding-right: 0px; display: inline; font-family: 'MS Shell Dlg'; background-position: 0% 0%; float: none; letter-spacing: normal; visibility: inherit; color: #000000; clear: none; font-size: 12px; border-top: #000000; border-right: #000000; text-decoration: none; padding-top: 0px"><font style="list-style: disc none outside;background-image: none; border-bottom: #0000ff; position: static; text-align: left; border-left: #0000ff; padding-bottom: 0px; line-height: normal; overflow-x: visible; overflow-y: visible; text-transform: none; background-color: transparent; font-variant: normal; font-style: normal; text-indent: 0pt; padding-left: 0px; background-attachment: scroll; padding-right: 0px; display: inline; font-family: 'MS Shell Dlg'; background-position: 0% 0%; float: none; letter-spacing: normal; visibility: inherit; color: #0000ff; clear: none; font-size: 12px; border-top: #0000ff; border-right: #0000ff; text-decoration: none; padding-top: 0px" color="#0000ff">&nbsp;&nbsp;&nbsp;<span>&nbsp;我们知道，在Java中设置变量值的操作，除了long和double类型的变量外都是原子操作，也就是说，对于变量值的简单读写操作没有必要进行同步。这在JVM&nbsp;1.2之前，Java的内存模型实现总是从主存读取变量，是不需要进行特别的注意的。而随着JVM的成熟和优化，现在在多线程环境下volatile关键字的使用变得非常重要。在当前的Java内存模型下，线程可以把变量保存在本地内存（比如机器的寄存器）中，而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值，而另外一个线程还继续使用它在寄存器中的变量值的拷贝，造成数据的不一致。把变量声明为volatile（不稳定的），这就指示JVM，这个变量是不稳定的，每次使用它都到主存中进行读取。一般说来，多任务环境下各任务间共享的标志都应该加volatile修饰。</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;在一些情况下，使用volatile可以达到同步的目的，在某种程度上相当于synchronized关键字；为什么说是一定程度上呢，这就要从synchronized同步关键字说起了，synchronized在Java语言中可以实现两个功能，互斥性和可见性。互斥性是指任意时刻只能有一个线程持有特定的锁，从而可以实现对共享数据的协调访问；而可见性说的是，任意线程修改的共享数据对于其他线程必须是可见的，也就是说不允许其他线程拿到旧的数据。而volatile关键字只能实现可见性，也就是说用volatile修饰的变量的修改对于其他线程是可见的，如果该值被修改，其他线程可以立即得到新值。下面的代码简单展示了volatile的一个简单应用，线程的退出：</span><br />&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span>&nbsp;1</span><img id="Codehighlighter1_41_463_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_463_Open_Text.style.display='none'; Codehighlighter1_41_463_Closed_Image.style.display='inline'; Codehighlighter1_41_463_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_41_463_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_41_463_Closed_Text.style.display='none'; Codehighlighter1_41_463_Open_Image.style.display='inline'; Codehighlighter1_41_463_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span>public</span><span style="color: #000000">&nbsp;</span><span>class</span><span>&nbsp;Monitor&nbsp;</span><span>implements</span><span>&nbsp;Runnable&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_41_463_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_41_463_Open_Text"><span>{<br /></span><span>&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>private</span><span style="color: #000000">&nbsp;</span><span>volatile</span><span>&nbsp;Thread&nbsp;blinker;<br /></span><span>&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>boolean</span><span>&nbsp;isRunning&nbsp;</span><span>=</span><span style="color: #000000">&nbsp;</span><span>false</span><span>;<br /></span><span>&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>&nbsp;6</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /></span><span>&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_138_325_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_325_Open_Text.style.display='none'; Codehighlighter1_138_325_Closed_Image.style.display='inline'; Codehighlighter1_138_325_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_138_325_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_138_325_Closed_Text.style.display='none'; Codehighlighter1_138_325_Open_Image.style.display='inline'; Codehighlighter1_138_325_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span style="color: #000000">&nbsp;</span><span>void</span><span>&nbsp;run()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_138_325_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_138_325_Open_Text"><span>{<br /></span><span>&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>10</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thisThread&nbsp;</span><span>=</span><span>&nbsp;Thread.currentThread();<br /></span><span>11</span><span style="color: #000000"><img id="Codehighlighter1_219_321_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_321_Open_Text.style.display='none'; Codehighlighter1_219_321_Closed_Image.style.display='inline'; Codehighlighter1_219_321_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_219_321_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_219_321_Closed_Text.style.display='none'; Codehighlighter1_219_321_Open_Image.style.display='inline'; Codehighlighter1_219_321_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>while</span><span>&nbsp;(blinker&nbsp;</span><span>==</span><span>&nbsp;thisThread)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_219_321_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_219_321_Open_Text"><span>{<br /></span><span>12</span><span style="color: #000000"><img id="Codehighlighter1_228_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_228_259_Open_Text.style.display='none'; Codehighlighter1_228_259_Closed_Image.style.display='inline'; Codehighlighter1_228_259_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_228_259_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_228_259_Closed_Text.style.display='none'; Codehighlighter1_228_259_Open_Image.style.display='inline'; Codehighlighter1_228_259_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_228_259_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_228_259_Open_Text"><span>{<br /></span><span>13</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thisThread.sleep(</span><span>50</span><span>);<br /></span><span>14</span><span style="color: #000000"><img id="Codehighlighter1_292_297_Open_Image" onclick="this.style.display='none'; Codehighlighter1_292_297_Open_Text.style.display='none'; Codehighlighter1_292_297_Closed_Image.style.display='inline'; Codehighlighter1_292_297_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_292_297_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_292_297_Closed_Text.style.display='none'; Codehighlighter1_292_297_Open_Image.style.display='inline'; Codehighlighter1_292_297_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span>catch</span><span>&nbsp;(InterruptedException&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_292_297_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_292_297_Open_Text"><span>{<br /></span><span>15</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span>16</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//</span><span>To&nbsp;do&nbsp;you&nbsp;task</span><span style="color: #008000"><br /></span><span>17</span><span style="color: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span>18</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>19</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span>20</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>21</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>22</span><span style="color: #000000"><img id="Codehighlighter1_357_409_Open_Image" onclick="this.style.display='none'; Codehighlighter1_357_409_Open_Text.style.display='none'; Codehighlighter1_357_409_Closed_Image.style.display='inline'; Codehighlighter1_357_409_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_357_409_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_357_409_Closed_Text.style.display='none'; Codehighlighter1_357_409_Open_Image.style.display='inline'; Codehighlighter1_357_409_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span style="color: #000000">&nbsp;</span><span>void</span><span>&nbsp;startMonitor()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_357_409_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_357_409_Open_Text"><span>{<br /></span><span>23</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blinker&nbsp;</span><span>=</span><span style="color: #000000">&nbsp;</span><span>new</span><span>&nbsp;Thread(</span><span>this</span><span>);<br /></span><span>24</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blinker.start();<br /></span><span>25</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span>26</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>27</span><span style="color: #000000"><img id="Codehighlighter1_439_460_Open_Image" onclick="this.style.display='none'; Codehighlighter1_439_460_Open_Text.style.display='none'; Codehighlighter1_439_460_Closed_Image.style.display='inline'; Codehighlighter1_439_460_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_439_460_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_439_460_Closed_Text.style.display='none'; Codehighlighter1_439_460_Open_Image.style.display='inline'; Codehighlighter1_439_460_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span style="color: #000000">&nbsp;</span><span>void</span><span>&nbsp;stopMonitor()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_439_460_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_439_460_Open_Text"><span>{<br /></span><span>28</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blinker&nbsp;</span><span>=</span><span style="color: #000000">&nbsp;</span><span>null</span><span>;<br /></span><span>29</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span>30</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" /><br /></span><span>31</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" /></span><span>}</span></span></div><br /><br /><br /><br /><br /></font></span></span></div>
<div style="list-style: disc outside none; background-image: none; position: static; text-align: left; padding: 0px; line-height: normal; overflow: visible; text-transform: none; background-color: transparent; font-variant-ligatures: normal; font-variant-caps: normal; font-style: normal; text-indent: 0pt; background-attachment: scroll; display: block; font-family: &quot;MS Shell Dlg&quot;; background-position: 0% 0%; float: none; letter-spacing: normal; visibility: inherit; color: #000000; clear: none; font-size: 12px; text-decoration: none;"><font face="Verdana"></font>&nbsp;</div><img src ="http://www.blogjava.net/silvermyth/aggbug/352316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/silvermyth/" target="_blank">Gavin Li</a> 2011-06-14 22:53 <a href="http://www.blogjava.net/silvermyth/articles/352316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中List的安全删除</title><link>http://www.blogjava.net/silvermyth/articles/351944.html</link><dc:creator>Gavin Li</dc:creator><author>Gavin Li</author><pubDate>Wed, 08 Jun 2011 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/silvermyth/articles/351944.html</guid><wfw:comment>http://www.blogjava.net/silvermyth/comments/351944.html</wfw:comment><comments>http://www.blogjava.net/silvermyth/articles/351944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/silvermyth/comments/commentRss/351944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/silvermyth/services/trackbacks/351944.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;对于Java集合中的List来讲，删除是一个常见的操作，但是也是最容易犯错误的地方,尤其对于新手更是如此。笔者在工作中也经常看到一些工作了很长时间的老程序员在这个问题上犯错误；在这里，我将通过一个例子，给大家展示如何从List中安全的删除元素。先看下面的例子：<br />&nbsp;&nbsp;&nbsp;&nbsp;假如我有一个List,其中包含了6个元素，我想删除其中的前面4个，应该如何做；好多程序员不加思索，写下了下面的代码：<br />&nbsp;&nbsp;&nbsp;&nbsp; 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_47_200_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_200_Open_Text.style.display='none'; Codehighlighter1_47_200_Closed_Image.style.display='inline'; Codehighlighter1_47_200_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_47_200_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_47_200_Closed_Text.style.display='none'; Codehighlighter1_47_200_Open_Image.style.display='inline'; Codehighlighter1_47_200_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;unSafeDeleteTopByCount(List&nbsp;list)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_47_200_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_47_200_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_55_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_121_Open_Text.style.display='none'; Codehighlighter1_55_121_Closed_Image.style.display='inline'; Codehighlighter1_55_121_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_55_121_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_55_121_Closed_Text.style.display='none'; Codehighlighter1_55_121_Open_Image.style.display='inline'; Codehighlighter1_55_121_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_55_121_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_55_121_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img id="Codehighlighter1_92_117_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_117_Open_Text.style.display='none'; Codehighlighter1_92_117_Closed_Image.style.display='inline'; Codehighlighter1_92_117_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_92_117_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_92_117_Closed_Text.style.display='none'; Codehighlighter1_92_117_Open_Image.style.display='inline'; Codehighlighter1_92_117_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;4;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_92_117_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_92_117_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(i);<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_143_171_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_171_Open_Text.style.display='none'; Codehighlighter1_143_171_Closed_Image.style.display='inline'; Codehighlighter1_143_171_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_143_171_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_143_171_Closed_Text.style.display='none'; Codehighlighter1_143_171_Open_Image.style.display='inline'; Codehighlighter1_143_171_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_143_171_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_143_171_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_181_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_181_197_Open_Text.style.display='none'; Codehighlighter1_181_197_Closed_Image.style.display='inline'; Codehighlighter1_181_197_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_181_197_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_181_197_Closed_Text.style.display='none'; Codehighlighter1_181_197_Open_Image.style.display='inline'; Codehighlighter1_181_197_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span></span></div>&nbsp;&nbsp;&nbsp;&nbsp;大家可以新建一个List,然后新建一个类在main中调用一下这个方法，看看结果会如何：看到了吧<span style="color: red">，程序抛出了异常，如下：</span><br /><span style="color: red">&nbsp;&nbsp;&nbsp;&nbsp;java.lang.IndexOutOfBoundsException: Index: 3, Size: 3</span><br /><span style="color: red">&nbsp;at java.util.ArrayList.RangeCheck(Unknown Source)</span><br /><span style="color: red">&nbsp;at java.util.ArrayList.remove(Unknown Source)</span><br /><span style="color: red">&nbsp;at com.lpx.collection.TestArrayDeletion.unSafeDeleteTopByCount(TestArrayDeletion.java:59)</span><br /><span style="color: red">&nbsp;at com.lpx.collection.TestArrayDeletion.main(TestArrayDel</span>etion.java:26)<br />&nbsp;&nbsp;&nbsp;&nbsp;看到这里，可能大家已经明白了；对了，在删除的过程中，List的size发生了变化，但是index没有变化，就会造成index&gt;=size的情况发生，抛出IndexOutOfBoundsException是一定的。这还算好的，至少你知道有异常，但是还有一种更隐蔽的情况，如果你删除的个数是3个，IndexOutOfBoundsException是不会发生的，但是删除后的List不是你想要的结果。具体是 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_47_200_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_200_Open_Text.style.display='none'; Codehighlighter1_47_200_Closed_Image.style.display='inline'; Codehighlighter1_47_200_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_47_200_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_47_200_Closed_Text.style.display='none'; Codehighlighter1_47_200_Open_Image.style.display='inline'; Codehighlighter1_47_200_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;unSafeDeleteTopByCount(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_47_200_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_47_200_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_55_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_121_Open_Text.style.display='none'; Codehighlighter1_55_121_Closed_Image.style.display='inline'; Codehighlighter1_55_121_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_55_121_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_55_121_Closed_Text.style.display='none'; Codehighlighter1_55_121_Open_Image.style.display='inline'; Codehighlighter1_55_121_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_55_121_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_55_121_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_92_117_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_117_Open_Text.style.display='none'; Codehighlighter1_92_117_Closed_Image.style.display='inline'; Codehighlighter1_92_117_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_92_117_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_92_117_Closed_Text.style.display='none'; Codehighlighter1_92_117_Open_Image.style.display='inline'; Codehighlighter1_92_117_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_92_117_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_92_117_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(i);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_143_171_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_171_Open_Text.style.display='none'; Codehighlighter1_143_171_Closed_Image.style.display='inline'; Codehighlighter1_143_171_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_143_171_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_143_171_Closed_Text.style.display='none'; Codehighlighter1_143_171_Open_Image.style.display='inline'; Codehighlighter1_143_171_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_143_171_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_143_171_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><img id="Codehighlighter1_181_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_181_197_Open_Text.style.display='none'; Codehighlighter1_181_197_Closed_Image.style.display='inline'; Codehighlighter1_181_197_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_181_197_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_181_197_Closed_Text.style.display='none'; Codehighlighter1_181_197_Open_Image.style.display='inline'; Codehighlighter1_181_197_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_181_197_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_181_197_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print();<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br /><img id="Codehighlighter1_224_287_Open_Image" onclick="this.style.display='none'; Codehighlighter1_224_287_Open_Text.style.display='none'; Codehighlighter1_224_287_Closed_Image.style.display='inline'; Codehighlighter1_224_287_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_224_287_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_224_287_Closed_Text.style.display='none'; Codehighlighter1_224_287_Open_Image.style.display='inline'; Codehighlighter1_224_287_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_224_287_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_224_287_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_252_284_Open_Image" onclick="this.style.display='none'; Codehighlighter1_252_284_Open_Text.style.display='none'; Codehighlighter1_252_284_Closed_Image.style.display='inline'; Codehighlighter1_252_284_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_252_284_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_252_284_Closed_Text.style.display='none'; Codehighlighter1_252_284_Open_Image.style.display='inline'; Codehighlighter1_252_284_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(String&nbsp;str&nbsp;:&nbsp;list)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_252_284_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_252_284_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br /><img id="Codehighlighter1_355_383_Open_Image" onclick="this.style.display='none'; Codehighlighter1_355_383_Open_Text.style.display='none'; Codehighlighter1_355_383_Closed_Image.style.display='inline'; Codehighlighter1_355_383_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_355_383_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_355_383_Closed_Text.style.display='none'; Codehighlighter1_355_383_Open_Image.style.display='inline'; Codehighlighter1_355_383_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">6</span><span style="color: #000000">;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_355_383_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_355_383_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span style="color: #000000">"</span><span style="color: #000000">str</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />unSafeDeleteTopByCount(</span><span style="color: #000000">3</span><span style="color: #000000">);</span></div>&nbsp;&nbsp;&nbsp;什么意思呢，大家可以看一下上面的代码，如果运行的话，打印出的结果是：<br />&nbsp;&nbsp;&nbsp;&nbsp;str1<br />&nbsp;&nbsp;&nbsp;&nbsp;str3<br />&nbsp;&nbsp;&nbsp;&nbsp;str5<br />&nbsp;&nbsp; 为什么呢，当我们删除了index为0的元素【str0】后，由于List的size变化，index为0的元素会变为str1,而index为1的元素会变为str2,这时由 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_54_205_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_205_Open_Text.style.display='none'; Codehighlighter1_54_205_Closed_Image.style.display='inline'; Codehighlighter1_54_205_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_54_205_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_54_205_Closed_Text.style.display='none'; Codehighlighter1_54_205_Open_Image.style.display='inline'; Codehighlighter1_54_205_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;safeDeletionTopByCountMethod1(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_54_205_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_54_205_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">*********safeDeletionTopByCountMethod1*********</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img id="Codehighlighter1_168_191_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_191_Open_Text.style.display='none'; Codehighlighter1_168_191_Closed_Image.style.display='inline'; Codehighlighter1_168_191_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_168_191_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_168_191_Closed_Text.style.display='none'; Codehighlighter1_168_191_Open_Image.style.display='inline'; Codehighlighter1_168_191_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">--</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_168_191_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_168_191_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(i);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print();<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br /><img id="Codehighlighter1_263_409_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_409_Open_Text.style.display='none'; Codehighlighter1_263_409_Closed_Image.style.display='inline'; Codehighlighter1_263_409_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_263_409_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_263_409_Closed_Text.style.display='none'; Codehighlighter1_263_409_Open_Image.style.display='inline'; Codehighlighter1_263_409_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;safeDeletionTopByCountMethod2(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_263_409_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_263_409_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">*********safeDeletionTopByCountMethod2*********</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img id="Codehighlighter1_372_395_Open_Image" onclick="this.style.display='none'; Codehighlighter1_372_395_Open_Text.style.display='none'; Codehighlighter1_372_395_Closed_Image.style.display='inline'; Codehighlighter1_372_395_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_372_395_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_372_395_Closed_Text.style.display='none'; Codehighlighter1_372_395_Open_Image.style.display='inline'; Codehighlighter1_372_395_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_372_395_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_372_395_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(</span><span style="color: #000000">0</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print();<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br /><img id="Codehighlighter1_467_706_Open_Image" onclick="this.style.display='none'; Codehighlighter1_467_706_Open_Text.style.display='none'; Codehighlighter1_467_706_Closed_Image.style.display='inline'; Codehighlighter1_467_706_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_467_706_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_467_706_Closed_Text.style.display='none'; Codehighlighter1_467_706_Open_Image.style.display='inline'; Codehighlighter1_467_706_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;safeDeletionTopByCountMethod3(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_467_706_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_467_706_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">*********safeDeletionTopByCountMethod3*********</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;localList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br /><img id="Codehighlighter1_628_663_Open_Image" onclick="this.style.display='none'; Codehighlighter1_628_663_Open_Text.style.display='none'; Codehighlighter1_628_663_Closed_Image.style.display='inline'; Codehighlighter1_628_663_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_628_663_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_628_663_Closed_Text.style.display='none'; Codehighlighter1_628_663_Open_Image.style.display='inline'; Codehighlighter1_628_663_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_628_663_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_628_663_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localList.add(list.get(i));<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.removeAll(localList);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print();<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br /><img id="Codehighlighter1_764_1024_Open_Image" onclick="this.style.display='none'; Codehighlighter1_764_1024_Open_Text.style.display='none'; Codehighlighter1_764_1024_Closed_Image.style.display='inline'; Codehighlighter1_764_1024_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_764_1024_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_764_1024_Closed_Text.style.display='none'; Codehighlighter1_764_1024_Open_Image.style.display='inline'; Codehighlighter1_764_1024_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;safeDeletionTopByCountMethod4(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_764_1024_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_764_1024_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">*********safeDeletionTopByCountMethod4*********</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;localList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localList.addAll(list);<br /><img id="Codehighlighter1_951_1010_Open_Image" onclick="this.style.display='none'; Codehighlighter1_951_1010_Open_Text.style.display='none'; Codehighlighter1_951_1010_Closed_Image.style.display='inline'; Codehighlighter1_951_1010_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_951_1010_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_951_1010_Closed_Text.style.display='none'; Codehighlighter1_951_1010_Open_Image.style.display='inline'; Codehighlighter1_951_1010_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_951_1010_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_951_1010_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;localList.get(i);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(str);<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print();<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>于index为1，所以str2会被删除；你可以自己去推算一下结果。<br />如何解决这个问题呢，笔者在上面给出了4种方法供大家参考，最后给出了完整的代码。<br />*****************************************************************************<br />
<p><font face="Verdana">package com.lpx.collection;</font></p>
<p><font face="Verdana">import java.util.ArrayList;<br />import java.util.List;</font></p>
<p><font face="Verdana">public class TestArrayDeletion {</font></p>
<p><font face="Verdana">&nbsp;private List&lt;String&gt; list = null;<br />&nbsp;public static String[] array = { "str0", "str1", "str2", "str3", "str4",<br />&nbsp;&nbsp;&nbsp;"str5" };</font></p>
<p><font face="Verdana">&nbsp;public TestArrayDeletion() {<br />&nbsp;&nbsp;super();<br />&nbsp;&nbsp;list = new ArrayList&lt;String&gt;();<br />&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;/**<br />&nbsp; * @param args<br />&nbsp; */<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;TestArrayDeletion arrayDeletion = new TestArrayDeletion();<br />&nbsp;&nbsp;arrayDeletion.initList();<br />&nbsp;&nbsp;arrayDeletion.unSafeDeleteTopByCount(3);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;arrayDeletion.initList();<br />&nbsp;&nbsp;arrayDeletion.unSafeDeleteTopByCount(4);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;arrayDeletion.initList();<br />&nbsp;&nbsp;arrayDeletion.safeDeletionTopByCountMethod1(4);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;arrayDeletion.initList();<br />&nbsp;&nbsp;arrayDeletion.safeDeletionTopByCountMethod2(4);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;arrayDeletion.initList();<br />&nbsp;&nbsp;arrayDeletion.safeDeletionTopByCountMethod3(4);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;arrayDeletion.initList();<br />&nbsp;&nbsp;arrayDeletion.safeDeletionTopByCountMethod4(4);</font></p>
<p><font face="Verdana">&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;private void initList() {<br />&nbsp;&nbsp;list.clear();<br />&nbsp;&nbsp;for (String str : array) {<br />&nbsp;&nbsp;&nbsp;list.add(str);<br />&nbsp;&nbsp;}<br />&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;private void print() {<br />&nbsp;&nbsp;for (String str : list) {<br />&nbsp;&nbsp;&nbsp;System.out.println(str);<br />&nbsp;&nbsp;}<br />&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;private void unSafeDeleteTopByCount(int count) {<br />&nbsp;&nbsp;System.out.println("*********unSafeDeleteTopByCount*********");<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; count; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;list.remove(i);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;} finally {<br />&nbsp;&nbsp;&nbsp;print();<br />&nbsp;&nbsp;}<br />&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;private void safeDeletionTopByCountMethod1(int count) {<br />&nbsp;&nbsp;System.out.println("*********safeDeletionTopByCountMethod1*********");<br />&nbsp;&nbsp;for (int i = count - 1; i &gt;= 0; i--) {<br />&nbsp;&nbsp;&nbsp;list.remove(i);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;print();<br />&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;private void safeDeletionTopByCountMethod2(int count) {<br />&nbsp;&nbsp;System.out.println("*********safeDeletionTopByCountMethod2*********");<br />&nbsp;&nbsp;for (int i = 0; i &lt; count; i++) {<br />&nbsp;&nbsp;&nbsp;list.remove(0);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;print();<br />&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;private void safeDeletionTopByCountMethod3(int count) {<br />&nbsp;&nbsp;System.out.println("*********safeDeletionTopByCountMethod3*********");<br />&nbsp;&nbsp;List&lt;String&gt; localList = new ArrayList&lt;String&gt;();<br />&nbsp;&nbsp;for (int i = 0; i &lt; count; i++) {<br />&nbsp;&nbsp;&nbsp;localList.add(list.get(i));<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;list.removeAll(localList);<br />&nbsp;&nbsp;print();<br />&nbsp;}</font></p>
<p><font face="Verdana">&nbsp;private void safeDeletionTopByCountMethod4(int count) {<br />&nbsp;&nbsp;System.out.println("*********safeDeletionTopByCountMethod4*********");<br />&nbsp;&nbsp;List&lt;String&gt; localList = new ArrayList&lt;String&gt;();<br />&nbsp;&nbsp;localList.addAll(list);<br />&nbsp;&nbsp;for (int i = 0; i &lt; count; i++) {<br />&nbsp;&nbsp;&nbsp;String str = localList.get(i);<br />&nbsp;&nbsp;&nbsp;list.remove(str);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;print();<br />&nbsp;}<br />}<br /></font></p><img src ="http://www.blogjava.net/silvermyth/aggbug/351944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/silvermyth/" target="_blank">Gavin Li</a> 2011-06-08 23:28 <a href="http://www.blogjava.net/silvermyth/articles/351944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>