﻿<?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-tbwshc</title><link>http://www.blogjava.net/tbwshc/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 06 May 2026 08:45:06 GMT</lastBuildDate><pubDate>Wed, 06 May 2026 08:45:06 GMT</pubDate><ttl>60</ttl><item><title>Java调用SQL Server的存储过程详解</title><link>http://www.blogjava.net/tbwshc/archive/2013/10/24/405615.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 24 Oct 2013 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/10/24/405615.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/405615.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/10/24/405615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/405615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/405615.html</trackback:ping><description><![CDATA[<p>1使用不带参数的存储过程</p>
<p>　　1</p>
<p>　　{call procedure-name}</p>
<p>　　作为实例，在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程：</p>
<p>　　CREATE PROCEDURE GetContactFormalNames</p>
<p>　　AS BEGIN SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName</p>
<p>　　FROM Person.Contact END</p>
<p>　　此存储过程返回单个结果集，其中包含一列数据(由 Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。</p>
<p>　　在下面的实例中，将向此函数传递 AdventureWorks 示例<strong><a style="color: #000000" href="http://www.tbwshc.com"><strong>tb</strong></a></strong>数据库的打开连接，然后使用 executeQuery 方法调用 GetContactFormalNames 存储过程。</p>
<p>　　public static void executeSprocNoParams(Connection con)</p>
<p>　　&#8230;{</p>
<p>　　try &#8230;{</p>
<p>　　Statement stmt = con.createStatement();</p>
<p>　　ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");</p>
<p>　　while (rs.next())</p>
<p>　　&#8230;{</p>
<p>　　System.out.println(rs.getString("FormalName"));</p>
<p>　　}</p>
<p>　　rs.close();</p>
<p>　　stmt.close();</p>
<p>　　}</p>
<p>　　catch (Exception e)</p>
<p>　　&#8230;{</p>
<p>　　e.printStackTrace();</p>
<p>　　}</p>
<p>　　}</p>
<p>　　2使用带有输入参数的存储过程</p>
<p>　　使用 JDBC 驱动程序调用带参数的存储过程时，必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。带有 IN 参数的 call 转义序列的语法如下所示：</p>
<p>　　{call procedure-name[([parameter][,[parameter]]&#8230;)]}http://jie.baijiale.94ibc.com</p>
<p>　　构造 call 转义序列时，请使用 ?(问号)字符来指定 IN 参数。此字符充当要传递给该存储过程的参数值的占位符。可以使用 SQLServerPreparedStatement 类的 setter 方法之一为参数指定值。可使用的 setter 方法由 IN 参数的数据类型决定。</p>
<p>　　向 setter 方法传递值时，不仅需要指定要在参数中使用的实际值，还必须指定参数在存储过程中的序数位置。例如，如果存储过程包含单个 IN 参数，则其序数值为 1.如果存储过程包含两个参数，则第一个序数值为 1,第二个序数值为 2.</p>
<p>　　作为如何调用包含 IN 参数的存储过程的实例，使用 SQL Server 2005 AdventureWorks 示例数据库中的 uspGetEmployeeManagers 存储过程。此存储过程接受名为 EmployeeID 的单个输入参数</p><img src ="http://www.blogjava.net/tbwshc/aggbug/405615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-10-24 17:05 <a href="http://www.blogjava.net/tbwshc/archive/2013/10/24/405615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中生成文件的10项建议</title><link>http://www.blogjava.net/tbwshc/archive/2013/10/24/405614.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 24 Oct 2013 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/10/24/405614.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/405614.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/10/24/405614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/405614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/405614.html</trackback:ping><description><![CDATA[<p>1. 记住 - "越少越好"并非总是如此(Keep in Mind &#8211; "Less is more" is not always better)。 &#8211; 高效率的代码是件好事，但很多情况下，并非代码行数越少效率就越高</p>
<p>　　2. 不要把简单事情复杂化(Do not complicate things)。 &#8211; 我曾经这么做过，我相信你也一样。开发者都倾向于采用复杂方式解决简单问题。我们在一个只有5个用户的系统中引入EJB,为一个并不需要框架的应用实现一套框架，采用属性文件、采用面向<a style="color: #000000" href="http://www.tbwshc.com">tb</a>对象解决方案、使用线程，而这些根本用不着。为什么会这么做？一些人可能不知道有更好的解决方案，但另一些人可能故意这样做来学习新知识，或仅仅是因为有趣。对那些不知道更好解决方案的人，要多听有经验程序员的建议。对于那些纯粹出于个人目的而将设计复杂化的人，我建议你要更加专业一点。<br />　　3. 不要"硬编码"(No hard coding please)。 &#8211; 由于时间紧迫，开发者总是会忘记或故意忽略这一条。然而另一种可能是，遵循这条戒律，我们就不会陷入"时间紧迫"的困境。定义一个static final 变量，增加一行代码，又能花多长时间呢？</p>
<p>　　4. 为代码添加注释(Add comments to your code)。 &#8211; 每个人都知道这一点，但不是每个人都会这么做。你有多少次"忘记"添加注释了？确实，注释不会为你的程序增加任何函数功能。但是，有多少次，看到2周前写的代码，你都记不起它是干什么的？你很幸运，那些未注释的代码是你自己写的，你脑海中还会有残存的印象。非常不幸，大多时候，代码是别人写的，并且那个人很可能已经离开公司了。有句谚语说的好："有来有往，互惠互利",因此程序员应该体谅彼此(还有你自己)，给你的代码加上注释。</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/tbwshc/aggbug/405614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-10-24 17:04 <a href="http://www.blogjava.net/tbwshc/archive/2013/10/24/405614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>针对Java Excel API及详细教程</title><link>http://www.blogjava.net/tbwshc/archive/2013/10/24/405613.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 24 Oct 2013 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/10/24/405613.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/405613.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/10/24/405613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/405613.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/405613.html</trackback:ping><description><![CDATA[<p>时在java开发中会操作excel表格，其实操作起来也特别简单。这里把前期操作步骤说一下，本文会简单的介绍一个开放源码项目：Java Excel Api，使用它大家就可以方便的操作Excel文件了。</p>
<p>　　首先下载好：Java Excel Api，这个文件我已经和 JAVA+Excel+API详细教程。pdf一并压缩上传了，感兴趣的朋友可以下载!</p>
<p>　　我这里用的开发平台是Eclipse，这里我把操作简单说一下：</p>
<p>　　1， 建，立java项目，在这个项目在建立一个新的文件夹lib;</p>
<p>　　2， 将jxl.jar，即Java Excel Ap，复制到lib</p>
<p>　　3，然后右键点击这个java项目，<a style="color: #000000" href="http://www.tbwshc.com">tb</a>选择Propertieshttp://jie.baijiale.ibc198.com</p>
<p>　　4，在左侧列表里选中Java Build Path ，右侧选中Libraries</p>
<p>　　5，点击Add JARs</p>
<p>　　6， 然后去选择这个项目中lib文件夹中的jxl.jar，点击确定</p>
<p>　　成功后，项目中会多一个文件夹为：Referenced Libraries</p>
<p>　　准备工作完成后，就可以去操作excel了，</p><img src ="http://www.blogjava.net/tbwshc/aggbug/405613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-10-24 17:02 <a href="http://www.blogjava.net/tbwshc/archive/2013/10/24/405613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>框架Quart在Java中任务调度的使用</title><link>http://www.blogjava.net/tbwshc/archive/2013/09/17/404183.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 17 Sep 2013 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/09/17/404183.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/404183.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/09/17/404183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/404183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/404183.html</trackback:ping><description><![CDATA[<p>&nbsp; Quartz框架是一个全功能、开源的任务调度服务，可以集成几乎任何的java应用程序&#8212;从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。</p>
<p>　　核心概念</p>
<p>　　Quartz核心的概念：scheduler任务调度、Job任务、Trigger触发器、JobDetail任务细节</p>
<p>　　Job任务：其实Job是接口，其中只有一个execute方法：</p>
<p>　　package org.quartz;</p>
<p>　　public abstract interface Job</p>
<p>　　{</p>
<p>　　public abstract void execute(JobExecutionContext paramJobExecutionContext)</p>
<p>　　throws JobExecutionException;</p>
<p>　　}</p>
<p>　　我们开发者只要实现此接口，实现execute方法即可。把我们想做的事情，在execute中执行即可。</p>
<p>　　JobDetail：任务细节，Quartz执行Job时，需要新建个Job实例，但是不能直接操作Job类，所以通过JobDetail来获取Job的名称、描述信息。</p>
<p>　　Trigger触发器：执行任务的规则;比如每天，每小时等。</p>
<p>　　一般情况使用SimpleTrigger，和CronTrigger，这个触发器实现了Trigger接口。</p>
<p>　　对于复杂的时间表达式来说，比如每个月15日上午几点几分，使用CronTrigger</p>
<p>　　对于简单的时间来说，比如每天执行几次，使用SimpleTrigger</p>
<p>　　scheduler任务调度：是最核心的概念，需要把JobDetail和Trigger注册到scheduler中，才可以执行。</p>
<p>　　注意：</p>
<p>　　不同的版本的jar包，具体的操作不太相同，但是<strong><a style="color: #000000" href="http://www.tbwshc.com"><strong>tbw</strong></a></strong>思路是相同的;比如1.8.6jar包中，JobDetail是个类，直接通过构造方法与Job类关联。SimpleTrigger和CornTrigger是类;在2.0.2jar包中，JobDetail是个接口，SimpleTrigger和CornTrigger是接口</p>
<p>　　不同版本测试：</p>
<p>　　1.8.6jar包：</p>
<p>　　[html]</p>
<p>　　package com.test;</p>
<p>　　import java.util.Date;</p>
<p>　　import org.quartz.Job;</p>
<p>　　import org.quartz.JobExecutionContext;</p>
<p>　　import org.quartz.JobExecutionException;</p>
<p>　　/**</p>
<p>　　* 需要执行的任务</p>
<p>　　* @author lhy</p>
<p>　　*</p>
<p>　　*/</p>
<p>　　public class MyJob implements Job {</p>
<p>　　@Override</p>
<p>　　//把要执行的操作，写在execute方法中</p>
<p>　　public void execute(JobExecutionContext arg0) throws JobExecutionException {</p>
<p>　　System.out.println("测试Quartz"+new Date());</p>
<p>　　}</p>
<p>　　}</p>
<p>　　package com.test;</p>
<p>　　import java.util.Date;</p>
<p>　　import org.quartz.Job;</p>
<p>　　import org.quartz.JobExecutionContext;</p>
<p>　　import org.quartz.JobExecutionException;</p>
<p>　　/**</p>
<p>　　* 需要执行的任务</p>
<p>　　* @author lhy</p>
<p>　　*</p>
<p>　　*/</p>
<p>　　public class MyJob implements Job {</p>
<p>　　@Override</p>
<p>　　//把要执行的操作，写在execute方法中</p>
<p>　　public void execute(JobExecutionContext arg0) throws JobExecutionException {</p>
<p>　　System.out.println("测试Quartz"+new Date());</p>
<p>　　}</p>
<p>　　}</p>
<p>　　使用SimpleTrigger触发器</p>
<p>　　[html]</p>
<p>　　package com.test;</p>
<p>　　import java.util.Date;</p>
<p>　　import org.quartz.JobDetail;</p>
<p>　　import org.quartz.Scheduler;</p>
<p>　　import org.quartz.SchedulerException;</p>
<p>　　import org.quartz.SchedulerFactory;</p>
<p>　　import org.quartz.SimpleTrigger;</p>
<p>　　import org.quartz.impl.StdSchedulerFactory;</p>
<p>　　/**</p>
<p>　　* 调用任务的类</p>
<p>　　* @author lhy</p>
<p>　　*</p>
<p>　　*/</p>
<p>　　public class SchedulerTest {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　//通过schedulerFactory获取一个调度器</p>
<p>　　SchedulerFactory schedulerfactory=new StdSchedulerFactory();</p>
<p>　　Scheduler scheduler=null;</p>
<p>　　try{</p>
<p>　　// 通过schedulerFactory获取一个调度器</p>
<p>　　scheduler=schedulerfactory.getScheduler();</p>
<p>　　// 创建jobDetail实例，绑定Job实现类</p>
<p>　　// 指明job的名称，所在组的名称，以及绑定job类</p>
<p>　　JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);</p>
<p>　　// 定义调度触发规则，比如每1秒运行一次，共运行8次</p>
<p>　　SimpleTrigger simpleTrigger=new SimpleTrigger("simpleTrigger","triggerGroup");</p>
<p>　　// 马上启动</p>
<p>　　simpleTrigger.setStartTime(new Date());</p>
<p>　　// 间隔时间</p>
<p>　　simpleTrigger.setRepeatInterval(1000);</p>
<p>　　// 运行次数</p>
<p>　　simpleTrigger.setRepeatCount(8);</p>
<p>　　// 把作业和触发器注册到任务调度中</p>
<p>　　scheduler.scheduleJob(jobDetail, simpleTrigger);</p>
<p>　　// 启动调度</p>
<p>　　scheduler.start();</p>
<p>　　}catch(SchedulerException e){</p>
<p>　　e.printStackTrace();</p>
<p>　　}</p>
<p>　　}</p>
<p>　　}</p>
<p>　　package com.test;</p>
<p>　　import java.util.Date;</p>
<p>　　import org.quartz.JobDetail;</p>
<p>　　import org.quartz.Scheduler;</p>
<p>　　import org.quartz.SchedulerException;</p>
<p>　　import org.quartz.SchedulerFactory;</p>
<p>　　import org.quartz.SimpleTrigger;</p>
<p>　　import org.quartz.impl.StdSchedulerFactory;</p>
<p>　　/**</p>
<p>　　* 调用任务的类</p>
<p>　　* @author lhy</p>
<p>　　*</p>
<p>　　*/</p>
<p>　　public class SchedulerTest {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　//通过schedulerFactory获取一个调度器</p>
<p>　　SchedulerFactory schedulerfactory=new StdSchedulerFactory();</p>
<p>　　Scheduler scheduler=null;</p>
<p>　　try{</p>
<p>　　// 通过schedulerFactory获取一个调度器</p>
<p>　　scheduler=schedulerfactory.getScheduler();</p>
<p>　　// 创建jobDetail实例，绑定Job实现类</p>
<p>　　// 指明job的名称，所在组的名称，以及绑定job类<br />　JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);</p>
<p>　　// 定义调度触发规则，比如每1秒运行一次，共运行8次</p>
<p>　　SimpleTrigger simpleTrigger=new SimpleTrigger("simpleTrigger","triggerGroup");</p>
<p>　　// 马上启动</p>
<p>　　simpleTrigger.setStartTime(new Date());</p>
<p>　　// 间隔时间</p>
<p>　　simpleTrigger.setRepeatInterval(1000);</p>
<p>　　// 运行次数</p>
<p>　　simpleTrigger.setRepeatCount(8);</p>
<p>　　// 把作业和触发器注册到任务调度中</p>
<p>　　scheduler.scheduleJob(jobDetail, simpleTrigger);</p>
<p>　　// 启动调度</p>
<p>　　scheduler.start();</p>
<p>　　}catch(SchedulerException e){</p>
<p>　　e.printStackTrace();</p>
<p>　　}</p>
<p>　　}</p>
<p>　　} 若使用CornTrigger触发器：</p>
<p>　　[html]</p>
<p>　　package com.test;</p>
<p>　　import java.util.Date;</p>
<p>　　import org.quartz.CronTrigger;</p>
<p>　　import org.quartz.JobDetail;</p>
<p>　　import org.quartz.Scheduler;</p>
<p>　　import org.quartz.SchedulerException;</p>
<p>　　import org.quartz.SchedulerFactory;</p>
<p>　　import org.quartz.SimpleTrigger;</p>
<p>　　import org.quartz.impl.StdSchedulerFactory;</p>
<p>　　/**</p>
<p>　　* 调用任务的类</p>
<p>　　* @author lhy</p>
<p>　　*</p>
<p>　　*/</p>
<p>　　public class CronTriggerTest {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　//通过schedulerFactory获取一个调度器</p>
<p>　　SchedulerFactory schedulerfactory=new StdSchedulerFactory();</p>
<p>　　Scheduler scheduler=null;</p>
<p>　　try{</p>
<p>　　// 通过schedulerFactory获取一个调度器</p>
<p>　　scheduler=schedulerfactory.getScheduler();</p>
<p>　　// 创建jobDetail实例，绑定Job实现类</p>
<p>　　// 指明job的名称，所在组的名称，以及绑定job类</p>
<p>　　JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);</p>
<p>　　// 定义调度触发规则，每天上午10：15执行</p>
<p>　　CronTrigger cornTrigger=new CronTrigger("cronTrigger","triggerGroup");</p>
<p>　　// 执行规则表达式</p>
<p>　　cornTrigger.setCronExpression("0 15 10 * * ? *");</p>
<p>　　// 把作业和触发器注册到任务调度中</p>
<p>　　scheduler.scheduleJob(jobDetail, cornTrigger);</p>
<p>　　// 启动调度</p>
<p>　　scheduler.start();</p>
<p>　　}catch(Exception e){</p>
<p>　　e.printStackTrace();</p>
<p>　　}</p>
<p>　　}</p>
<p>　　}</p>
<p>　　package com.test;</p>
<p>　　import java.util.Date;</p>
<p>　　import org.quartz.CronTrigger;</p>
<p>　　import org.quartz.JobDetail;</p>
<p>　　import org.quartz.Scheduler;</p>
<p>　　import org.quartz.SchedulerException;</p>
<p>　　import org.quartz.SchedulerFactory;</p>
<p>　　import org.quartz.SimpleTrigger;</p>
<p>　　import org.quartz.impl.StdSchedulerFactory;</p>
<p>　　/**</p>
<p>　　* 调用任务的类</p>
<p>　　* @author lhy</p>
<p>　　*</p>
<p>　　*/</p>
<p>　　public class CronTriggerTest {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　//通过schedulerFactory获取一个调度器</p>
<p>　　SchedulerFactory schedulerfactory=new StdSchedulerFactory();</p>
<p>　　Scheduler scheduler=null;</p>
<p>　　try{</p>
<p>　　// 通过schedulerFactory获取一个调度器</p>
<p>　　scheduler=schedulerfactory.getScheduler();</p>
<p>　　// 创建jobDetail实例，绑定Job实现类</p>
<p>　　// 指明job的名称，所在组的名称，以及绑定job类</p>
<p>　　JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);</p>
<p>　　// 定义调度触发规则，每天上午10：15执行</p>
<p>　　CronTrigger cornTrigger=new CronTrigger("cronTrigger","triggerGroup");</p>
<p>　　// 执行规则表达式</p>
<p>　　cornTrigger.setCronExpression("0 15 10 * * ? *");</p>
<p>　　// 把作业和触发器注册到任务调度中</p>
<p>　　scheduler.scheduleJob(jobDetail, cornTrigger);</p>
<p>　　// 启动调度</p>
<p>　　scheduler.start();</p>
<p>　　}catch(Exception e){</p>
<p>　　e.printStackTrace();</p>
<p>　　}</p>
<p>　　}</p>
<p>　　}</p>
<p>　　对于2.0.2jar包如下：</p>
<p>　　其中的job类不变，主要是调度类如下：</p>
<p>　　[html]</p>
<p>　　package com.test;</p>
<p>　　import java.util.Date;</p>
<p>　　import org.quartz.CronScheduleBuilder;</p>
<p>　　import org.quartz.JobBuilder;</p>
<p>　　import org.quartz.JobDetail;</p>
<p>　　import org.quartz.Scheduler;</p>
<p>　　import org.quartz.SchedulerException;</p>
<p>　　import org.quartz.SchedulerFactory;</p>
<p>　　import org.quartz.SimpleScheduleBuilder;</p>
<p>　　import org.quartz.Trigger;</p>
<p>　　import org.quartz.TriggerBuilder;</p>
<p>　　import org.quartz.impl.StdSchedulerFactory;</p>
<p>　　/**</p>
<p>　　* 调用任务的类</p>
<p>　　* @author lhy</p>
<p>　　*</p>
<p>　　*/</p>
<p>　　public class SchedulerTest {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　//通过schedulerFactory获取一个调度器</p>
<p>　　SchedulerFactory schedulerfactory=new StdSchedulerFactory();</p>
<p>　　Scheduler scheduler=null;</p>
<p>　　try{</p>
<p>　　// 通过schedulerFactory获取一个调度器</p>
<p>　　scheduler=schedulerfactory.getScheduler();</p>
<p>　　// 创建jobDetail实例，绑定Job实现类</p>
<p>　　// 指明job的名称，所在组的名称，以及绑定job类</p>
<p>　　JobDetail job=JobBuilder.newJob(MyJob.class).withIdentity("job1", "jgroup1").build();</p>
<p>　　// 定义调度触发规则</p>
<p>　　// 使用simpleTrigger规则</p>
<p>　　// Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")</p>
<p>　　// .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withRepeatCount(8))</p>
<p>　　// .startNow().build();</p>
<p>　　// 使用cornTrigger规则 每天10点42分</p>
<p>　　Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")</p>
<p>　　.withSchedule(CronScheduleBuilder.cronSchedule("0 42 10 * * ? *"))</p>
<p>　　.startNow().build();</p>
<p>　　// 把作业和触发器注册到任务调度中</p>
<p>　　scheduler.scheduleJob(job, trigger);</p>
<p>　　// 启动调度</p>
<p>　　scheduler.start();</p>
<p>　　}catch(Exception e){</p>
<p>　　e.printStackTrace();</p>
<p>　　}</p>
<p>　　}</p>
<p>　　}</p>
<p>　　package com.test;</p>
<p>　　import java.util.Date;</p>
<p>　　import org.quartz.CronScheduleBuilder;</p>
<p>　　import org.quartz.JobBuilder;</p>
<p>　　import org.quartz.JobDetail;</p>
<p>　　import org.quartz.Scheduler;</p>
<p>　　import org.quartz.SchedulerException;</p>
<p>　　import org.quartz.SchedulerFactory;</p>
<p>　　import org.quartz.SimpleScheduleBuilder;</p>
<p>　　import org.quartz.Trigger;</p>
<p>　　import org.quartz.TriggerBuilder;</p>
<p>　　import org.quartz.impl.StdSchedulerFactory;</p>
<p>　　/**</p>
<p>　　* 调用任务的类</p>
<p>　　* @author lhy</p>
<p>　　*</p>
<p>　　*/</p>
<p>　　public class SchedulerTest {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　//通过schedulerFactory获取一个调度器</p>
<p>　　SchedulerFactory schedulerfactory=new StdSchedulerFactory();</p>
<p>　　Scheduler scheduler=null;</p>
<p>　　try{</p>
<p>　　// 通过schedulerFactory获取一个调度器</p>
<p>　　scheduler=schedulerfactory.getScheduler();</p>
<p>　　// 创建jobDetail实例，绑定Job实现类</p>
<p>　　// 指明job的名称，所在组的名称，以及绑定job类</p>
<p>　　JobDetail job=JobBuilder.newJob(MyJob.class).withIdentity("job1", "jgroup1").build();</p>
<p>　　// 定义调度触发规则</p>
<p>　　// 使用simpleTrigger规则</p>
<p>　　// Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")</p>
<p>　　// .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withRepeatCount(8))</p>
<p>　　// .startNow().build();</p>
<p>　　// 使用cornTrigger规则 每天10点42分</p>
<p>　　Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")</p>
<p>　　.withSchedule(CronScheduleBuilder.cronSchedule("0 42 10 * * ? *"))</p>
<p>　　.startNow().build();</p>
<p>　　// 把作业和触发器注册到任务调度中</p>
<p>　　scheduler.scheduleJob(job, trigger);</p>
<p>　　// 启动调度</p>
<p>　　scheduler.start();</p>
<p>　　}catch(Exception e){</p>
<p>　　e.printStackTrace();</p>
<p>　　}</p>
<p>　　}</p>
<p>　　}</p>
<p>　　上述demo下载：1.8版本demo下载</p>
<p>　　2.0版本demo下载</p>
<p>　　对于CornExpress讲解如下：</p>
<p>　　字段 允许值 允许的特殊字符</p>
<p>　　秒 0-59 , - * /</p>
<p>　　分 0-59 , - * /</p>
<p>　　小时 0-23 , - * /</p>
<p>　　日期 1-31 , - * ? / L W C</p>
<p>　　月份 1-12 或者 JAN-DEC , - * /</p>
<p>　　星期 1-7 或者 SUN-SAT , - * ? / L C #</p>
<p>　　年(可选) 留空, 1970-2099 , - * /</p>
<p>　　表达式 意义</p>
<p>　　"0 0 12 * * ?" 每天中午12点触发</p>
<p>　　"0 15 10 ? * *" 每天上午10:15触发</p>
<p>　　"0 15 10 * * ?" 每天上午10:15触发</p>
<p>　　"0 15 10 * * ? *" 每天上午10:15触发</p>
<p>　　"0 15 10 * * ? 2005" 2005年的每天上午10:15触发</p>
<p>　　"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发</p>
<p>　　"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发</p>
<p>　　"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发</p>
<p>　　"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发</p>
<p>　　"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发</p>
<p>　　"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发</p>
<p>　　"0 15 10 15 * ?" 每月15日上午10:15触发</p>
<p>　　"0 15 10 L * ?" 每月最后一日的上午10:15触发</p>
<p>　　"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发</p>
<p>　　"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发</p>
<p>　　"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发</p>
<p>　　特殊字符 意义</p>
<p>　　* 表示所有值;</p>
<p>　　? 表示未说明的值，即不关心它为何值;</p>
<p>　　- 表示一个指定的范围;</p>
<p>　　, 表示附加一个可能值;</p>
<p>　　/ 符号前表示开始时间，符号后表示每次递增的值;</p>
<p>　　L("last") ("last") "L" 用在day-of-month字段意思是 "这个月最后一天";用在 day-of-week字段, 它简单意思是 "7" or "SAT"。 如果在day-of-week字段里和数字联合使用，它的意思就是 "这个月的最后一个星期几" &#8211; 例如： "6L" means "这个月的最后一个星期五". 当我们用&#8220;L&#8221;时，不指明一个列表值或者范围是很重要的，不然的话，我们会得到一些意想不到的结果。</p>
<p>　　W("weekday") 只能用在day-of-month字段。用来描叙最接近指定天的工作日(周一到周五)。例如：在day-of-month字段用&#8220;15W&#8221;指&#8220;最接近这个月第15天的工作日&#8221;，即如果这个月第15天是周六，那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日，那么触发器将会在这个月第16天即周一触发;如果这个月第15天是周二，那么就在<strong><a style="color: #000000" href="http://www.tbwshc.com"><strong>tbw</strong></a></strong>触发器这天触发。注意一点：这个用法只会在当前月计算值，不会越过当前月。&#8220;W&#8221;字符仅能在day-of-month指明一天，不能是一个范围或列表。也可以用&#8220;LW&#8221;来指定这个月的最后一个工作日。</p>
<p>　　# 只能用在day-of-week字段。用来指定这个月的第几个周几。例：在day-of-week字段用"6#3"指这个月第3个周五(6指周五，3指第3个)。如果指定的日期不存在，触发器就不会触发。</p>
<p>　　C 指和calendar联系后计算过的值。例：在day-of-month 字段用&#8220;5C&#8221;指在这个月第5天或之后包括calendar的第一天;在day-of-week字段用&#8220;1C&#8221;指在这周日或之后包括calendar的第一天</p><img src ="http://www.blogjava.net/tbwshc/aggbug/404183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-09-17 15:15 <a href="http://www.blogjava.net/tbwshc/archive/2013/09/17/404183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>序列化在IO中读写对象的使用</title><link>http://www.blogjava.net/tbwshc/archive/2013/09/17/404182.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 17 Sep 2013 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/09/17/404182.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/404182.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/09/17/404182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/404182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/404182.html</trackback:ping><description><![CDATA[<p>　&nbsp;&nbsp; 序列化就是一种用来处理对象流的机制，所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作，也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。</p>
<p>　　序列化的实现：将需要被序列化的类实现Serializable接口，然后使用一个输出流(如：FileOutputStream)来构造一个ObjectOutputStream(对象流)对象，接着，使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态)，要恢复的话则用输入流。<br />　写对象和读对象的时候一定要使用序列化：</p>
<p>　　import java.io.*;</p>
<p>　　class Product implements Serializable {</p>
<p>　　private static final long serialVersionUID = 1L;</p>
<p>　　private float price;</p>
<p>　　private float tax;</p>
<p>　　public Product(float price) {</p>
<p>　　this.price = price;</p>
<p>　　tax = (float)(price*0.20);</p>
<p>　　}</p>
<p>　　public String toString() {</p>
<p>　　return "price:"+price+",tax:"+tax;</p>
<p>　　}</p>
<p>　　}</p>
<p>　　public class CmdDemo {</p>
<p>　　public static void main(String[] str<a style="color: #000000" href="http://www.tbwshc.com">tb</a>) throws Exception {</p>
<p>　　Product p1 = new Product(100);</p>
<p>　　ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream</p>
<p>　　("d:\product.txt"));</p>
<p>　　os.writeObject(p1);</p>
<p>　　os.close();</p>
<p>　　ObjectInputStream is = new ObjectInputStream(new FileInputStream</p>
<p>　　("d:\product.txt"));</p>
<p>　　Product p2 = (Product) is.readObject();</p>
<p>　　System.out.println(p2.toString());</p>
<p>　　}</p>
<p>　　}</p><img src ="http://www.blogjava.net/tbwshc/aggbug/404182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-09-17 15:12 <a href="http://www.blogjava.net/tbwshc/archive/2013/09/17/404182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java数组使用实用的技巧</title><link>http://www.blogjava.net/tbwshc/archive/2013/09/17/404181.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 17 Sep 2013 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/09/17/404181.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/404181.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/09/17/404181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/404181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/404181.html</trackback:ping><description><![CDATA[<p>&nbsp; 本文分享了关于Java数组最顶级的11大方法，帮助你解决工作流程问题，无论是运用在团队环境或是在私人项目中，你都可以直接拿来用！ </p>
<p>0.&nbsp; 声明一个数组（Declare an array） <br />&nbsp;<br />String[] aArray = new String[5];<br />String[] bArray = {"a","b","c", "d", "e"};<br />String[] cArray = new String[]{"a","b","c","d","e"};</p>
<p>1.&nbsp; 在Java中输出一个数组（Print an array in Java）<br />&nbsp;<br />int[] intArray = { 1, 2, 3, 4, 5 };<br />String intArrayString = Arrays.toString(intArray);<br />&nbsp; <br />// print directly will print reference value<br />System.out.println(intArray);<br />// [I@7150bd4d<br />&nbsp; <br />System.out.println(intArrayString);<br />// [1, 2, 3, 4, 5]</p>
<p>2. 从数组中创建数组列表（Create an ArrayList from an array）<br />&nbsp;<br />String[] stringArray = { "a", "b", "c", "d", "e" };<br />ArrayList&lt;String&gt; arrayList = new ArrayList&lt;String&gt;(Arrays.asList(stringArray));<br />System.out.println(arrayList);<br />// [a, b, c, d, e]</p>
<p>3. 检查<strong><a style="color: #000000" href="http://www.itbshc.com"><strong>爱淘宝</strong></a></strong>数组中是否包含特定值（Check if an array contains a certain value）<br />&nbsp;<br />String[] stringArray = { "a", "b", "c", "d", "e" };<br />boolean b = Arrays.asList(stringArray).contains("a");<br />System.out.println(b);<br />// true<br />&nbsp;<br />4. 连接两个数组（ Concatenate two arrays）<br />&nbsp;<br />int[] intArray = { 1, 2, 3, 4, 5 };<br />int[] intArray2 = { 6, 7, 8, 9, 10 };<br />// Apache Commons Lang library<br />int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2);<br />5. 声明一个数组内链（Declare an array inline ）<br />&nbsp;<br />method(new String[]{"a", "b", "c", "d", "e"});<br />&nbsp;<br />6. 将数组元素加入到一个独立的字符串中（Joins the elements of the provided array into a single String）</p>
<p>// containing the provided list of elements<br />// Apache common lang<br />String j = StringUtils.join(new String[] { "a", "b", "c" }, ", ");<br />System.out.println(j);<br />// a, b, c<br />&nbsp; <br />7. 将数组列表转换成一个数组 （Covnert an ArrayList to an array） <br />&nbsp; <br />String[] stringArray = { "a", "b", "c", "d", "e" };<br />ArrayList&lt;String&gt; arrayList = new ArrayList&lt;String&gt;(Arrays.asList(stringArray));<br />String[] stringArr = new String[arrayList.size()];<br />arrayList.toArray(stringArr);<br />for (String s : stringArr)<br />&nbsp;&nbsp;&nbsp; System.out.println(s);<br />&nbsp;<br />8. 将数组转换成一个集合（Convert an array to a set） <br />&nbsp;<br />Set&lt;String&gt; set = new HashSet&lt;String&gt;(Arrays.asList(stringArray));<br />System.out.println(set);<br />//[d, e, b, c, a]<br />&nbsp;<br />9. 反向数组（Reverse an array）<br />&nbsp;<br />int[] intArray = { 1, 2, 3, 4, 5 };<br />ArrayUtils.reverse(intArray);<br />System.out.println(Arrays.toString(intArray));<br />//[5, 4, 3, 2, 1]<br />&nbsp;<br />10. 删除数组元素（Remove element of an array）<br />&nbsp;<br />int[] intArray = { 1, 2, 3, 4, 5 };<br />int[] removed = ArrayUtils.removeElement(intArray, 3);<br />//create a new array<br />System.out.println(Arrays.toString(removed));<br />&nbsp;<br />One more &#8211; convert int to byte array <br />&nbsp;<br />byte[] bytes = ByteBuffer.allocate(4).putInt(8).array();<br />&nbsp; <br />for (byte t : bytes) {<br />&nbsp;&nbsp; System.out.format("0x%x ", t);<br />}</p><img src ="http://www.blogjava.net/tbwshc/aggbug/404181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-09-17 15:08 <a href="http://www.blogjava.net/tbwshc/archive/2013/09/17/404181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java动态代理设计模式</title><link>http://www.blogjava.net/tbwshc/archive/2013/09/10/403910.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 10 Sep 2013 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/09/10/403910.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/403910.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/09/10/403910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/403910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/403910.html</trackback:ping><description><![CDATA[<p>&nbsp;所谓动态代理类是在运行时生成的class，在生成它时，你必须提供一组interface给它，则动态代理类就宣称它实现了这些interface。当然，动态代理类就充当一个代理，你不要企图它会帮你干实质性的工作，在生成它的实例时你必须提供一个handler，由它接管实际的工作。<br />　　下面通过实例来说明：<br />　　Subject.java 抽象借口：声明代理对象和真实对象的共同接口<br />　　[java]<br />　　public interface Subject {<br />　　public void doSomething();<br />　　}<br />　　public interface Subject {<br />　　public void doSomething();<br />　　}<br />　　RealSubject.java 真实被<a style="color: #000000" href="http://www.tbwshc.com"><strong>tb</strong></a>代理对象<br />　　[java]<br />　　public class RealSubject implements Subject {<br />　　@Override<br />　　public void doSomething() {<br />　　System.out.println("RealSubject.doSomething");<br />　　}<br />　　}<br />　　public class RealSubject implements Subject {<br />　　@Override<br />　　public void doSomething() {<br />　　System.out.println("RealSubject.doSomething");<br />　　}<br />　　}</p>
<p>　　DynamicProxy.java 代理对象<br />　　[java]<br />　　import java.lang.reflect.InvocationHandler;<br />　　import java.lang.reflect.Method;<br />　　public class DynamicProxy implements InvocationHandler {<br />　　private Object object;<br />　　public DynamicProxy(Object object) {<br />　　this.object = object;<br />　　}<br />　　@Override<br />　　public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {<br />　　System.out.println("Before Invoke ! method : " + method);<br />　　//我们可以再代理方法调用前后添加功能<br />　　Object result = method.invoke(object, args);<br />　　System.out.println("object : " + object + " result : " + result + " args : " + args);<br />　　System.out.println("After Invoke !");<br />　　return result;<br />　　}<br />　　}<br />　　import java.lang.reflect.InvocationHandler;<br />　　import java.lang.reflect.Method;<br />　　public class DynamicProxy implements InvocationHandler {<br />　　private Object object;<br />　　public DynamicProxy(Object object) {<br />　　this.object = object;<br />　　}<br />　　@Override<br />　　public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {<br />　　System.out.println("Before Invoke ! method : " + method);<br />　　//我们可以再代理方法调用前后添加功能<br />　　Object result = method.invoke(object, args);<br />　　System.out.println("object : " + object + " result : " + result + " args : " + args);<br />　　System.out.println("After Invoke !");<br />　　return result;<br />　　}<br />　　}<br />　　Client.java 测试<br />　　[java]<br />　　import java.lang.reflect.InvocationHandler;<br />　　import java.lang.reflect.Proxy;<br />　　public class Client {<br />　　public static void main(String[] args) throws Exception {<br />　　//创建目标对象，也就是被代理对象<br />　　RealSubject realSubject = new RealSubject();<br />　　//将目标对象交给代理<br />　　InvocationHandler handler = new DynamicProxy(realSubject);<br />　　// Class proxyClass = Proxy.getProxyClass(Subject.class.getClassLoader()<br />　　// , new Class[]{Subject.class});<br />　　// Subject subject = (Subject)proxyClass.getConstructor(new Class[]{InvocationHandler.class})<br />　　// .newInstance(new Object[]{handler});<br />　　//返回代理对象，相当于上面两句<br />　　Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),<br />　　realSubject.getClass().getInterfaces(),<br />　　handler);<br />　　//叫代理对象去doSomething()，其实在代理对象中的doSomething()中还是会<br />　　//用handler来调用invoke(proxy, method, args) 参数proxy为调用者subject(this)，<br />　　//method为doSomething()，<strong><a style="color: #000000" href="http://www.tbwshc.com"><strong>tb</strong></a></strong>参数为方法要传入的参数，这里没有<br />　　subject.doSomething();<br />　　}<br />　　}<br />　　import java.lang.reflect.InvocationHandler;<br />　　import java.lang.reflect.Proxy;<br />　　public class Client {<br />　　public static void main(String[] args) throws Exception {<br />　　//创建目标对象，也就是被代理对象<br />　　RealSubject realSubject = new RealSubject();<br />　　//将目标对象交给代理<br />　　InvocationHandler handler = new DynamicProxy(realSubject);<br />　　// Class proxyClass = Proxy.getProxyClass(Subject.class.getClassLoader()<br />　　// , new Class[]{Subject.class});<br />　　// Subject subject = (Subject)proxyClass.getConstructor(new Class[]{InvocationHandler.class})<br />　　// .newInstance(new Object[]{handler});<br />　　//返回代理对象，相当于上面两句<br />　　Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),<br />　　realSubject.getClass().getInterfaces(),<br />　　handler);<br />　　//叫代理对象去doSomething()，其实在代理对象中的doSomething()中还是会<br />　　//用handler来调用invoke(proxy, method, args) 参数proxy为调用者subject(this)，<br />　　//method为doSomething()，参数为方法要传入的参数，这里没有<br />　　subject.doSomething();<br />　　}<br />　　}<br />　　打印结果：<br />　　Before Invoke ! method : public abstract void Subject.doSomething()<br />　　RealSubject.doSomething<br />　　object : RealSubject@ec6b00 result : null args : null<br />　　After Invoke !<br />　　注意：<br />　　Java动态代理涉及到的两个类：<br />　　InvocationHandler：该接口中仅定义了一个Object : invoke(Object proxy, Method method, Object[] args);参数proxy指代理类，method表示被代理的方法，args为method中的参数数组，返回值Object为代理实例的方法调用返回的值。这个抽象方法在代理类中动态实现。<br />　　Proxy：所有动态代理类的父类，提供用于创建动态代理类和实例的静态方法。</p><img src ="http://www.blogjava.net/tbwshc/aggbug/403910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-09-10 17:08 <a href="http://www.blogjava.net/tbwshc/archive/2013/09/10/403910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>30条有用的 Java 编程规则</title><link>http://www.blogjava.net/tbwshc/archive/2013/08/23/403247.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Fri, 23 Aug 2013 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/08/23/403247.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/403247.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/08/23/403247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/403247.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/403247.html</trackback:ping><description><![CDATA[<p>　(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符，其中包含的所有单词都应紧靠在一起，而且大写中间单词的首字 母。例如：<br />　　ThisIsAClassName<br />　　thisIsMethodOrFieldName<br />　　若在定义中出现了常数初始化字符，则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。<br />　　Java包(Package)属于一种特殊情况：它们全都是小写字母，即便中间的单词亦是如此。对于域名扩展名称，如com，org，net或者edu 等，全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。<br />　　(2) 为了常规用途而创建一个类时，请采取&#8220;<strong><a style="color: #000000" href="http://www.tbwshc.com"><strong>tb</strong></a></strong>经典形式&#8221;，并包含对下述元素的定义：<br />　　equals()<br />　　hashCode()<br />　　toString()<br />　　clone()(implement Cloneable)<br />　　implement Serializable<br />　　(3) 对于自己创建的每一个类，都考虑置入一个main()，其中包含了用于测试那个类的代码。为使用一个项目中的类，我们没必要删除测试代码。若 进行了任何形式的改动，可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。<br />　　(4) 应将方法设计成简要的、功能性单元，用它描述和实现一个不连续的类接口部分。理想情况下，方法应简明扼要。若长度很大，可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候，方法必须非常大，但它们仍应只做同样的一件事情)。 (5) 设计一个类时，请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后，再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改，想想用什么方法可把它们变得更简单)。<br />　　(6) 使类尽可能短小精悍，而且只解决一个特定的问题。下面是对类设计的一些建议：<br />　　&#9632;一个复杂的开关语句：考虑采用&#8220;多形&#8221;机制<br />　　&#9632;数量众多的方法涉及到类型差别极大的操作：考虑用几个类来分别实现<br />　　&#9632;许多成员变量在特征上有很大的差别：考虑使用几个类 。<br />　　(7) 让一切东西都尽可能地&#8220;私有&#8221;&#8212;&#8212;private。可使库的某一部分&#8220;公共化&#8221;(一个方法、类或者一个字段等等)，就永远不能把它拿出。若强行拿出，就可能破坏其他人现有的代码，使他们不得不重新编写和设计。若只公布自己必须公布的，就可放心大胆地改变其他任何东西。在多线程环境中，隐私是特别重要的一个因素&#8212;&#8212;只有private字段才能在非同步使用的情况下受到保护。<br />　　(8) 谨惕&#8220;巨大对象综合症&#8221;。对一些习惯于顺序编程思维、且初涉OOP领域的新手，往往喜欢先写一个顺序执行的程序，再把它嵌入一个或两个巨大的 对象里。根据编程原理，对象表达的应该是应用程序的概念，而非应用程序本身。<br />　　(9) 若不得已进行一些不太雅观的编程，至少应该把那些代码置于一个类的内部。<br />　　(10) 任何时候只要发现类与类之间结合得非常紧密，就需要考虑是否采用内部类，从而改善编码及维护工作(参见第14章14.1.2小节的&#8220;用内部 类改进代码&#8221;)。<br />　　(11) 尽可能细致地加上释，并用javadoc注释文档语法生成自己的程序文档。<br />　　(12) 避免使用&#8220;魔术数字&#8221;，这些数字很难与代码很好地配合。如以后需要修改它，无疑会成为一场噩梦，因为根本不知道&#8220;100&#8221;到底是指&#8220;数组大小&#8221;还是&#8220;其他全然不同的东西&#8221;。所以，我们应创建一个常数，并为其使用具有说服力的描述性名称，并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。<br />　　(13) 涉及构建器和异常的时候，通常希望重新丢弃在构建器中捕获的任何异常&#8212;&#8212;如果它造成了那个对象的创建失败。这样一来，调用者就不会以为那个 对象已正确地创建，从而盲目地继续。<br />　　(14) 当客户程序员用完对象以后，若你的类要求进行任何清除工作，可考虑将清除代码置于一个良好定义的方法里，采用类似于cleanup()这样的名字，明确表明自己的用途。除此以外，可在类内放置一个boolean(布尔)标记，指出对象是否已被清除。在类的finalize()方法里，请确定对象已被清除，并已丢弃了从RuntimeException继承的一个类(如果还没有的话)，从而指出一个编程错误。在采取象这样的方案之前，请确定 finalize()能够在自己的系统中工作(可能需要调用System.runFinalizersonExit(true)，从而确保 这一行为)。<br />　　(15) 在一个特定的作用域内，若一个对象必须清除(非由<a style="color: #000000" href="http://www.tbwshc.com"><strong>tb</strong></a>垃圾收集机制处理)，请采用下述方法：初始化对象;若成功，则立即进入一个含有 finally从句的try块，开始清除工作。<br />　　(16) 若在初始化过程中需要覆盖(取消)finalize()，请记住调用super.finalize()(若Object属于我们的直接超类，则无此必要)。在对finalize()进行覆盖的过程中，对super.finalize()的调用应属于最后一个行动，而不应是第一个行动，这样可确保在需要基础类组件的时候它们依然有效。<br />　　(17) 创建大小固定的对象集合时，请将它们传输至一个数组(若准备从一个方法里返回这个集合，更应如此操作)。这样一来，我们就可享受到数组在编 译期进行类型检查的好处。此外，为使用它们，数组的接收者也许并不需要将对象&#8220;造型&#8221;到数组里。<br />　　(18) 尽量使用interfaces，不要使用abstract类。若已知某样东西准备成为一个基础类，那么第一个选择应是将其变成一个 interface(接口)。只有在不得不使用方法定义或者成员变量的时候，才需要将其变成一个abstract(抽象)类。接口主要描述了客户希望做什么事情，而一个类则致力于(或允许)具体的实施细节。<br />　　(19) 在构建器内部，只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法，因为那些方法可能被其他人覆盖或取消，从而在构建过程 中产生不可预知的结果(参见第7章的详细说明)。<br />　　(20) 对象不应只是简单地容纳一些数据;它们的行为也应得到良好的定义。<br />　　(21) 在现成类的基础上创建新类时，请首先选择&#8220;新建&#8221;或&#8220;创作&#8221;。只有自己的设计要求必须继承时，才应考虑这方面的问题。若在本来允许新建的场 合使用了继承，则整个设计会变得没有必要地复杂。<br />　　(22) 用继承及方法覆盖来表示行为间的差异，而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色，这是绝对应该避免 的：应直接使用一个&#8220;颜色&#8221;字段。</p>
<p>　　(23) 为避免编程时遇到麻烦，请保证在自己类路径指到的任何地方，每个名字都仅对应一个类。否则，编译器可能先找到同名的另一个类，并报告出错消 息。若怀疑自己碰到了类路径问题，请试试在类路径的每一个起点，搜索一下同名的.class文件。<br />　　(24) 在Java 1.1 AWT 中使用事件&#8220;适配器&#8221;时，特别容易碰到一个陷阱。若覆盖了某个适配器方法，同时拼写方法没有特别讲究，最后的结果就是新添加一个方法，而不是覆盖现成方法。然而，由于这样做是完全合法的，所以不会从编译器或运行期系统获得任何出错提示&#8212;&#8212;只不过代码的工作就变得不正常了。<br />　　(25) 用合理的设计方案消除&#8220;伪功能&#8221;。也就是说，假若只需要创建类的一个对象，就不要提前限制自己使用应用程序，并加上一条&#8220;只生成其中一个 &#8221; 注释。请考虑将其封装成一个&#8220;独生子&#8221;的形式。若在主程序里有大量散乱的代码，用于创建自己的对象，请考虑采纳一种创造性的方案，将些代码封装起来。<br />　　(26) 警惕&#8220;分析瘫痪&#8221;。请记住，无论如何都要提前了解整个项目的状况，再去考察其中的细节。由于把握了全局，可快速认识自己未知的一些因素，防 止在考察细节的时候陷入&#8220;死逻辑&#8221;中。<br />　　(27) 警惕&#8220;过早优化&#8221;。首先让它运行起来，再考虑变得更快&#8212;&#8212;但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候， 才应进行优化。除非用专门的工具分析瓶颈，否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解，而且难于维护。<br />　　(28) 请记住，阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序，但注释、细致的解释以及一些示例往往具有不可估量的价 值。无论对你自己，还是对后来的人，它们都是相当重要的。如对此仍有怀疑，那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折，这样或许能 将你说服。<br />　　(29) 如认为自己已进行了良好的分析、设计或者实施，那么请稍微更换一下思维角度。试试邀请一些外来人士&#8212;&#8212;并不一定是专家，但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的工作，看看是否能找出你一度熟视无睹的问题。采取这种方式，往往能在最适合修改的阶段找出一些关键性的问题，避免产品发行后再解决问题而造成的金钱及精力方面的损失。<br />　　(30) 良好的设计能带来最大的回报。简言之，对于一个特定的问题，通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法，以后的工作就轻松多了，再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报(甚至无可估量)。而且由于自己倾注了大量心血，最终获得一个出色的设计方案，成功的快感也是令人心动的。坚持抵制草草完工的诱惑&#8212;&#8212;那样做往往得不偿失</p><img src ="http://www.blogjava.net/tbwshc/aggbug/403247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-08-23 16:56 <a href="http://www.blogjava.net/tbwshc/archive/2013/08/23/403247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单多线程Java算法相比较</title><link>http://www.blogjava.net/tbwshc/archive/2013/08/23/403246.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Fri, 23 Aug 2013 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/08/23/403246.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/403246.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/08/23/403246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/403246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/403246.html</trackback:ping><description><![CDATA[<p>1进程和线程的概念<br />　　1.1什么是进程<br />　　一个进程就是在一个运行的程序,它有自己独立的内存空间,一组系统资源,每个进程的内部数据和状态都是独立的,例如在window是同时打开多个记事本,虽然它们所运行的程序代码都是一样的,但是所使用的内存空间是独立的,互不干扰.<br />　　1.2什么是线程<br />　　线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈<br />　　1.3进程与线程的区别<br />　　1. 进程:每个进程都有独立的代码和数据空间(进程上下文) ,<strong><a style="color: #000000" href="http://www.tbwshc.com"><strong>tb</strong></a></strong>进程切换的开销大.<br />　　2. 线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小.<br />　　3. 多进程:在操作系统中,能同时运行多个任务程序.<br />　　4. 多线程:在同一应用程序中,有多个顺序流同时执行.<br />　　1.4线程创建的两种方式<br />　　采用继承Thread类创建线程<br />　　该方法比较简单,主要是通过继承java.lang.Thread类,并覆盖Thread类的run()方法来完成线成的创建.Thread 类是一个具体的类,即不是抽象类,该类封装了线程的行为.要创建一个线程,程序员必须创建一个从 Thread 类导出的新类.Thread类中有两个最重要的函数run()和start().<br />　　通过实现Runnable接口创建线程<br />　　该方法通过生成实现java.lang.Runnable接口的类.该接口只定义了一个方法run(),所以必须在新类中实现它.但是 Runnable 接口并没有任何对线程的支持,我们还必须创建 Thread 类的实例,这一点通过 Thread 类的构造函数<br />　　public Thread(Runnable target);来实现.<br />　　2 单线程和多线程性能比较<br />　　以使用蒙特卡罗概率算法求&#960;为例,进行单线程和多线程时间比较<br />　　2.1什么是蒙特卡罗概率算法</p>
<p>　　蒙特卡罗法(Monte Carlo method)是以概率和统计的理论、方法为基础的一种计算方法,将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解,故又称统计模拟法或统计试验法. --百度百科<br />　　蒙特卡罗求算法求&#960;<br />　　第一步<br />　　画正方形和内切圆<br />　　第二步<br />　　变换表达式<br />　　正方形面积As=(2R)^2<br />　　圆的面积Ac=&#960;R^2<br />　　Ac/As=(2R)^2/&#960;R^2<br />　　&#960;=4As/Ac<br />　　令P=As/Sc,则&#960;=4P<br />　　第三步<br />　　重复N次实验求平均值<br />　　在正方形区域内随机生成一个点A,若A落在圆区域内,M++<br />　　P=M/N<br />　　&#960;=4P,N的取值越大,&#960;的值越精确<br />　　2.2 java代码实现算法<br />　　N取值为10000万,多线程的数为100,每个线程执行100万次模拟实验<br />　　线程实现<br />　　import java.util.concurrent.CountDownLatch;<br />　　public class ProModel implements Runnable {<br />　　public int N;//随机实验的总次数<br />　　public static int M;//随机点落在圆中的次数<br />　　private int id;<br />　　private final CountDownLatch doneSignal;<br />　　OBJ semaphore;<br />　　public ProModel(int id,CountDownLatch doneSignal,int N,OBJ semaphore2){<br />　　this.id=id;<br />　　this.doneSignal=doneSignal;<br />　　this.N=N;<br />　　this.semaphore=semaphore2;<br />　　M=0;<br />　　}<br />　　public void run(){<br />　　int tempM=0;<br />　　for(int i=0;i<br />　　if(isInCircle()){<br />　　tempM++;<br />　　}<br />　　}<br />　　synchronized (semaphore) {<br />　　add(tempM);<br />　　}<br />　　doneSignal.countDown();//使end状态减1<br />　　}<br />　　public void add(int tempM){<br />　　System.out.println(Thread.currentThread().getName());<br />　　M=M+tempM;<br />　　System.out.println(M);<br />　　}<br />　　//随机产生一个在正方形区域的点,判断它是否在圆中<br />　　public boolean isInCircle(){<br />　　double x=Math.random();<br />　　double y=Math.random();<br />　　if((x-0.5)*(x-0.5)+(y-0.5)*(y-0.5)&lt;0.25)<br />　　return true;<br />　　else<br />　　return false;<br />　　}<br />　　public static int getTotal(){<br />　　return M;<br />　　}<br />　　}<br />　　多线程Main实现<br />　　import java.util.concurrent.CountDownLatch;<br />　　import java.util.concurrent.ExecutorService;<br />　　import java.util.concurrent.Executors;<br />　　public class MutliThread {<br />　　public static void main(String[] args) throws InterruptedException {<br />　　long begin=System.currentTimeMillis();<br />　　int threadSize=100;<br />　　int N=1000000;<br />　　OBJ semaphore = new OBJ();<br />　　CountDownLatch doneSignal = new CountDownLatch(threadSize);<br />　　ProModel[] pros=new ProModel[threadSize];<br />　　//设置特定的线程池,大小为threadSizde<br />　　System.out.println(&#8220;begins!&#8221;);<br />　　ExecutorService exe = Executors.newFixedThreadPool(threadSize);<br />　　for(int i=0;i<br />　　exe.execute(new ProModel(i+1,doneSignal,N,semaphore));<br />　　try{<br />　　doneSignal.await(); //等待end状态变为0, }catch (InterruptedException e) {<br />　　// TODO: handle exception35<br />　　e.printStackTrace();<br />　　}finally{<br />　　System.out.println(&#8220;ends!&#8221;);<br />　　System.out.println(4*(float)ProModel.getTotal()/(float)(threadSize*N));<br />　　}<br />　　exe.shutdown();<br />　　long end=System.currentTimeMillis();<br />　　System.out.println(&#8220;used time(ms):&#8221;+(end-begin));<br />　　}<br />　　}<br />　　class OBJ{}<br />　　单线程Main实现<br />　　import java.util.concurrent.CountDownLatch;<br />　　import java.util.concurrent.ExecutorService;<br />　　import java.util.concurrent.Executors;<br />　　public class SingleThread {<br />　　public static void main(String[] args) {<br />　　long begin=System.currentTimeMillis();<br />　　int threadSize=1;<br />　　int N=100000000;<br />　　OBJ semaphore = new OBJ();<br />　　CountDownLatch doneSignal = new CountDownLatch(threadSize);<br />　　ProModel[] pros=new ProModel[threadSize];<br />　　//设置特定的线程池,大小为5<br />　　System.out.println(&#8220;begins!&#8221;);<br />　　ExecutorService exe = Executors.newFixedThreadPool(threadSize);<br />　　for(int i=0;i<br />　　exe.execute(new ProModel(i+1,doneSignal,N,semaphore));<br />　　try{<br />　　doneSignal.await(); //等待end状态变为0, }catch (InterruptedException e) {<br />　　// TODO: handle exception35<br />　　e.printStackTrace();<br />　　}finally{<br />　　System.out.println(&#8220;ends!&#8221;);<br />　　System.out.println(4*(float)ProModel.getTotal()/(float)(threadSize*N));<br />　　}<br />　　exe.shutdown();<br />　　long end=System.currentTimeMillis();<br />　　System.out.println(&#8220;used time(ms):&#8221;+(end-begin));<br />　　}<br />　　}</p><img src ="http://www.blogjava.net/tbwshc/aggbug/403246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-08-23 16:54 <a href="http://www.blogjava.net/tbwshc/archive/2013/08/23/403246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Arrays.asList方法 学习记录</title><link>http://www.blogjava.net/tbwshc/archive/2013/07/15/401594.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Mon, 15 Jul 2013 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/07/15/401594.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/401594.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2013/07/15/401594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/401594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/401594.html</trackback:ping><description><![CDATA[<p>Arrays工具类提供了一些比较实用的方法，比如sort, binarySearch, fill等。其中还有一个asList方法，此方法能够将一个变长参数或者数组转换成List。<br />　　但是，这个生成的List，它是固定长度的，如果对其进行add或者remove的操作，会抛出UnsupportedOperationException，为什么会这样呢?<br />　　带着疑问，查看一下Arrays的源码，可以得到问题的结果。<br />　　Java代码<br />　　/**<br />　　* Returns a fixed-size list backed by the specified array. (Changes to<br />　　* the returned list "write through" to the array.) This method acts<br />　　* as bridge between array-based and collection-based APIs, in<br />　　* combination with Collection.toArray. The returned list is<br />　　* serializable and implements <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#123;&#64;&#108;&#105;&#110;&#107;">{@link</a> RandomAccess}.<br />　　*<br />　　*<br />　　This method also provides a convenient way to create a fixed-size<br />　　* list initialized to contain several elements:<br />　　*<br />　　* List stooges = Arrays.asList("Larry", "Moe", "Curly");<br />　　*<br />　　*<br />　　* @param a the array by which the list will be backed.<br />　　* @return a list view of the specified array.<br />　　* @see Collection#toArray()<br />　　*/<br />　　public static List asList(T... a) {<br />　　return new ArrayList(a);</p>
<p>　　方法asList返回的是new ArrayList(a)。但是，这个ArrayList并不是java.util.ArrayList，它是一个Arrays类中的重新定义的内部类。<br />　　具体的实现如下：<br />　　Java代码<br />　　/**<br />　　* @serial include<br />　　*/<br />　　private static class ArrayList extends AbstractList<br />　　implements RandomAccess, java.io.Serializable<br />　　{<br />　　private static final long serialVersionUID = -2764017481108945198L;<br />　　private Object[] a;<br />　　ArrayList(E[] array) {<br />　　if (array==null)<br />　　throw new NullPointerException();<br />　　a = array;<br />　　}<br />　　public int size() {<br />　　return a.length;<br />　　}<br />　　public Object[] toArray() {<br />　　return (Object[])a.clone();<br />　　}<br />　　public E get(int index) {<br />　　return (E)a[index];<br />　　}<br />　　public E set(int index, E element) {<br />　　Object oldValue = a[index];<br />　　a[index] = element;<br />　　return (E)oldValue;<br />　　}<br />　　public int indexOf(Object o) {<br />　　if (o==null) {<br />　　for (int i=0; i<br />　　if (a[i]==null)<br />　　return i;<br />　　} else {<br />　　for (int i=0; i<br />　　if (o.equals(a[i]))<br />　　return i;<br />　　}<br />　　return -1;<br />　　}<br />　　public boolean contains(Object o) {<br />　　return indexOf(o) != -1;<br />　　}<br />　　}<br />　　从这个内部类ArrayList的实现可以看出，它继承了类AbstractList,但是没有重写add和remove方法，没有给出具体的实现。查看一下AbstractList类中对add和remove方法的定义，如果一个list不支持add和remove就会抛出UnsupportedOperationException。<br />　　Java代码<br />　　public abstract class AbstractList extends AbstractCollection implements List {<br />　　/**<br />　　* Sole constructor. (For invocation by subclass constructors, typically<br />　　* implicit.)<br />　　*/<br />　　protected AbstractList() {<br />　　}<br />　　/**<br />　　* Appends the specified element to the end of this List (optional<br />　　* operation).<br />　　*<br />　　* This implementation calls add(size(), o).<br />　　*<br />　　* Note that this implementation throws an<br />　　* UnsupportedOperationException unless add(int, Object)<br />　　* is overridden.<br />　　*<br />　　* @param o element to be appended to this list.<br />　　*<br />　　* @return true (as per the general contract of<br />　　* Collection.add).<br />　　*<br />　　* @throws UnsupportedOperationException if the add method is not<br />　　* supported by this Set.<br />　　*<br />　　* @throws ClassCastException if the class of the specified element<br />　　* prevents it from being added to this set.<br />　　*<br />　　* @throws IllegalArgumentException some aspect of this element prevents<br />　　* it from being added to this collection.<br />　　*/<br />　　public boolean add(E o) {<br />　　add(size(), o);<br />　　return true;<br />　　}<br />　　/**<br />　　* Inserts the specified element at the specified position in this list<br />　　* (optional operation). Shifts the element currently at that position<br />　　* (if any) and any subsequent elements to the right (adds one to their<br />　　* indices).<br />　　*<br />　　* This implementation always throws an UnsupportedOperationException.<br />　　*<br />　　* @param index index at which the specified element is to be inserted.<br />　　* @param element element to be inserted.<br />　　*<br />　　* @throws UnsupportedOperationException if the add method is not<br />　　* supported by this list.<br />　　* @throws ClassCastException if the class of the specified element<br />　　* prevents it from being added to this list.<br />　　* @throws IllegalArgumentException if some aspect of the specified<br />　　* element prevents it from being added to this list.<br />　　* @throws IndexOutOfBoundsException index is out of range (index &lt;<br />　　* 0 || index &gt; size()).<br />　　*/<br />　　public void add(int index, E element) {<br />　　throw new UnsupportedOperationException();<br />　　}<br />　　/**<br />　　* Removes the element at the specified position in this list (optional<br />　　* operation). Shifts any subsequent elements to the left (subtracts one<br />　　* from their indices). Returns the element that was removed from the<br />　　* list.<br />　　*<br />　　* This implementation always throws an<br />　　* UnsupportedOperationException.<br />　　*<br />　　* @param index the index of the element to remove.<br />　　* @return the element previously at the specified position.<br />　　*<br />　　* @throws UnsupportedOperationException if the remove method is<br />　　* not supported by this list.<br />　　* @throws IndexOutOfBoundsException if the specified index is out of<br />　　* range (index &lt; 0 || index &gt;= size()).<br />　　*/<br />　　public E remove(int index) {<br />　　throw new UnsupportedOperationException();<br />　　}<br />　　}<br />　　至此，为什么Arrays.asList产生的List是不可添加或者删除，否则会产生UnsupportedOperationException，就可以得到解释了。<br />　　如果我们想把一个变长或者数据转变成List， 而且<a style="color: #000000" href="http://www.tbwshc.com"><strong>tb</strong></a>期望这个List能够进行add或者remove操作，那该怎么做呢?<br />　　我们可以写一个类似的方法，里面直接采用java.util.ArrayList即可。<br />　　比如：<br />　　Java代码<br />　　import java.util.ArrayList;<br />　　import java.util.Collections;<br />　　import java.util.List;<br />　　public class MyArrays {<br />　　public static List asList(T... a) {<br />　　List list = new ArrayList();<br />　　Collections.addAll(list, a);<br />　　return list;<br />　　}<br />　　}<br />　　测试代码如下：<br />　　Java代码<br />　　import java.util.ArrayList;<br />　　import java.util.Arrays;<br />　　import java.util.List;<br />　　public class Test {<br />　　@SuppressWarnings("unchecked")<br />　　public static void main(String[] args) {<br />　　List stooges = Arrays.asList("Larry", "Moe", "Curly");<br />　　print(stooges);<br />　　List&gt; seasonsList = Arrays.asList(retrieveSeasonsList());<br />　　print(seasonsList);<br />　　/*<br />　　* 自己实现一个asList方法，能够添加和删除。<br />　　*/<br />　　List list = MyArrays.asList("Larry", "Moe", "Curly");<br />　　list.add("Hello");<br />　　print(list);<br />　　}<br />　　private static void print(List list) {<br />　　System.out.println(list);<br />　　}<br />　　private static List retrieveSeasonsList() {<br />　　List seasonsList = new ArrayList();<br />　　seasonsList.add("Spring");<br />　　seasonsList.add("Summer");<br />　　seasonsList.add("Autumn");<br />　　seasonsList.add("Winter");<br />　　return seasonsList;<br />　　}<br />　　}<br />　　输出结果：<br />　　[Larry, Moe, Curly]<br />　　[[Spring, Summer, Autumn, Winter]]<br />　　[Larry, Moe, Curly, Hello] </p><img src ="http://www.blogjava.net/tbwshc/aggbug/401594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-07-15 17:08 <a href="http://www.blogjava.net/tbwshc/archive/2013/07/15/401594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>