??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
Q?QMultimap、Multiset{?br />
其中QImmutable集合可以方便建立不可变的数据容器。Multimap、Multiset使一些复杂的集合l合cd变得单优雅?br />
Multimap可以提供q囄型的数据存储?br />
目地址Qhttp://code.google.com/p/google-collections/
本博相关文章Q?br />
Google Collections之Multimap、Multiset
http://www.tkk7.com/hankchen/archive/2010/01/13/309257.html
Google Collections之Immutablec?/a>
http://www.tkk7.com/hankchen/archive/2010/01/13/309255.html
Q友情提C:本博文章Ƣ迎转蝲Q但h明出处:hankchenQ?/strong>http://www.tkk7.com/hankchenQ?/strong>
F2昄详细信息
F3跛_声明或定义的地方
Ctrl+1 快速修?/span>(最l典的快捷键,׃用多说了)
Ctrl+D删除当前?/span>
Ctrl+E 快速显C当?/span>Editer的下拉列?/span>(如果当前面没有昄的用黑体表示)
Ctrl+T 快速显C当前类的承结?/span>
Ctrl+O 快速显C?/span> OutLine
Ctrl+ F 查找/替换
Ctrl+ / 在代码窗口中是这U注释(推荐使用Ctrl +Shift + C注释Q?/span>
Ctrl+Q 定位到最后编辑的地方
Ctrl+L 定位在某?/span>
Ctrl+W 关闭当前Editer
Ctrl+K 参照选中?/span>Word快速定位到下一?/span>
Ctrl+-(键?/span>) 折叠当前cM的所有代?/span>
Ctrl++(键?/span>) 展开当前cM的所有代?/span>
Ctrl+J 正向增量查找(查看State Bar)(Ctrl+Shift+J 反向增量查找)
Shift+Enter 在当前行的下一行插入空?/span>(q时鼠标可以在当前行的Q一位置,不一定是最?/span>)
Alt+↓ 当前行和下面一行交互位|?/span>(特别实用,可以省去先剪?/span>,再粘贴了)
Alt+↑ 当前行和上面一行交互位|?/span>(同上)
Alt+← 前一个编辑的面
Alt+→ 下一个编辑的面(当然是针对上面那条来说了)
Alt+Enter 昄当前选择资源(工程/文g/文g)的属?/span>
Ctrl +Shift+C在代码窗口中是这U注释(再次按下Q取消注释)
Ctrl+Shift+F 格式化当前代?/span>
Ctrl+Shift+O作用是缺的Import语句被加入,多余?/span>Import语句被删?/span>
Ctrl+Shift+M(先把光标攑֜需导入包的cd?/span>) 作用是加Import语句
Ctrl +Shift+T打开cdQ查找文件很方便Q?/span>
Ctrl+Shift+W关闭当前所有打开文g
Ctrl+Shift+S 保存所有未保存的文?/span>
Ctrl+Shift+E 昄理当前打开的所有的View的管理器(可以选择关闭,Ȁzȝ操作)
Ctrl+Shift+X 把当前选中的文本全部变为大?/span>
Ctrl+Shift+Y 把当前选中的文本全部变为小?/span>
Ctrl+Shift+J 反向增量查找(Ctrl+J 正向增量查找)
Ctrl+Alt+↓ 复制当前行到下一?/span>(复制增加)
Ctrl+Alt+↑ 复制当前行到上一?/span>(复制增加)
下面的快捷键是重构里面常用的 (?/span>:一般重构的快捷键都?/span>Alt+Shift + 键类?/span>)
Alt+Shift+R 重命?/span>(当然Q?/span>F2也能有一L作用)
Alt+Shift+M抽取Ҏ (q是重构里面最常用的方法之一?/span>,其是对一大堆泥团代码有用)
Alt+Shift+L 抽取本地变量
Alt+Shift+C 修改Ҏl构(比较实用,有多个类中调用了q个Ҏ,修改一ơ搞?/span>)
Alt+Shift+F ?/span>Class中的local变量变ؓfield变量
Alt+Shift+I 分离本地变量Q与抽取本地变量相反Q?/span>
Alt+Shift+Z 重构的后悔药(Undo)
F2昄详细信息
F3跛_声明或定义的地方
Ctrl+1 快速修?/span>(最l典的快捷键,׃用多说了)
Ctrl+D删除当前?/span>
Ctrl +Shift+C在代码窗口中是这U注释(再次按下Q取消注释)
Ctrl+Shift+F 格式化当前代?/span>
Ctrl+Shift+O作用是缺的Import语句被加入,多余?/span>Import语句被删?/span>
Ctrl+E 快速显C当?/span>Editer的下拉列?/span>(如果当前面没有昄的用黑体表示)
Ctrl+T 快速显C当前类的承结?/span>
Ctrl+O 快速显C?/span> OutLine
Ctrl+ F 查找/替换
Ctrl +Shift+T(查找文g)
Alt+Shift+R 重命?/span>(当然Q?/span>F2也能有一L作用)
Alt+Shift+M抽取Ҏ (q是重构里面最常用的方法之一?/span>,其是对一大堆泥团代码有用)
Alt+Shift+L 抽取本地变量
同步的集合类Hashtable
?/span>Vector
Q以及同步的包装器类Collections.synchronizedMap
?/span>Collections.synchronizedList
QؓMap
?/span>List
提供了基本的有条件的U程安全的实现。然而,某些因素使得它们q不适用于具有高度ƈ发性的应用E序?/span>―?/span>它们的集合范围的单锁Ҏ对于可伸羃性来说是一个障,而且Q很多时候还必须在一D较长的旉内锁定一个集合,以防止出?/span>ConcurrentModificationException
s异常?/span>
ConcurrentHashMap
?/span>CopyOnWriteArrayList
实现提供了更高的q发性,同时q保住了U程安全性,只不q在对其调用者的承诺上打了点折扣?/span>ConcurrentHashMap
?/span>CopyOnWriteArrayList
q不是在您?/span>HashMap
?/span>ArrayList
的Q何地斚w一定有用,但是它们是设计用来优化某些特定的公用解决Ҏ的。许多ƈ发应用程序将从对它们的用中获得好处?/span>
ȝQ在多线Eƈ发情况下Qؓ了避?/span>ConcurrentModificationException
s异常Q徏议?/span>ConcurrentHashMap
?/span>CopyOnWriteArrayList
?br />
q有下面的几个可以考虑QConcurrentLinkedQueue、CopyOnWriteArraySet、LinkedBlockingQueue、ArrayBlockingQueue
二、高效的乘除q算
服务器计时Q对于乘除运,采用下面的方式:
A*2=a<<1
A/2=a>>1
q样可以提高q算效率?/span>
三、原子自增器
多线E环境下Q?/span>
AtomicInteger
可用在应用程序中Q如以原子方式增加的计数器)Qƈ且不能用于替?/span>
Integer
。但是,此类实扩展?/span>
Number
Q允讔R些处理基于数字类的工具和实用工具q行l一讉K?/span>
例如Q?/span>
private AtomicInteger bomdIdCreator = new AtomicInteger(); //自增序列?/span>
/**
*得到新的炸弹IDQ保持自?/span>
*@return
*/
public int getNewBombID(){
return bomdIdCreator.addAndGet(1);
}
四、多U程锁机制实?/span>
多线E环境下Qؓ了避免资源竞争,引入了锁机制。一般实现锁机制有下面几U方法:
1.
同步Ҏ、同步块Q?/span>
synchronized
2.
监视器方法:Q?/span>
wait
?/span>
notify
?/span>
notifyAll
Q?/span>
3. ReentrantLock
注意QReentrantLock是一个可重入的互斥锁Lock
Q它h与?/span>
synchronized
Ҏ和语句所讉K的隐式监视器锁相同的一些基本行为和语义Q但功能更强大?/span>
例如Q徏议L立即实践Q?/span>
lock
块来调用
try
Q在之前
/
之后的构造中Q最典型的代码如下:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
五、线E池的实现方?/span>
Doug Lea
~写了一个优U的ƈ发实用程序开放源码库
util.concurrent
Q它包括互斥、信号量、诸如在q发讉K下执行得很好的队列和散列表之c集合类以及几个工作队列实现。该包中?/span>
ThreadPoolExecutor
cL一U有效的、广泛用的以工作队列ؓ基础?span style="color: red">U程?/span>的正实现。您无须试~写您自qU程池,q样做容易出错,相反您可以考虑使用
util.concurrent
中的一些实用程序?/span>
U程池可以解决两个不同问题:׃减少了每个Q务调用的开销Q它们通常可以在执行大量异步Q务时提供增强的性能Qƈ且还可以提供l定和管理资源(包括执行集合d时用的U程Q的Ҏ?/span>
强烈E序员用较为方便的
Executors
工厂Ҏ
Executors.newCachedThreadPool()
Q无界线E池Q可以进行自动线E回Ӟ?/span>
Executors.newFixedThreadPool(int)
Q固定大线E池Q和
Executors.newSingleThreadExecutor()
Q单个后台线E)Q它们均为大多数使用场景预定义了讄?/span>
例如Q?/span>
public class ThreadPoolExecutorTest {
final static ExecutorService threadPool=Executors.newCachedThreadPool(); //单线E池实现
/**
* @param args
*/
public static void main(String[] args) {
for(int i=0;i<10;i++){
threadPool.execute(new Runnable(){
public void run() {
System.out.println("aaa"+this.getClass().getName());
//do other things
}
});
}
}
}
六、实现定时Q务的几种方式比较
1.
使用原始?/span>
Timer
c?/span>
2. ScheduledThreadPoolExecutor
Q?/span>
JDK 1.5
新增Q?/span>
3. Quatz
开源项?/span>
?/span>
Java 5.0
开始,
java.util.concurrent
包中增加了一?/span>
ScheduledThreadPoolExecutor
c,用来实现定时d和线E池的管理,比v
Timer
陋的实现是要强大得多。利?/span>
ScheduledThreadPoolExecutor
?/span>
scheduleAtFixedRate()
?/span>
scheduleWithFixedDelay()
两个Ҏ可以实CQ务调度的基本功能Q从前用
Timer
实现的功能应该要q移?/span>
scheduleWithFixedDelay()
上了?/span>
注意Q?/span>
ScheduledThreadPoolExecutor
是实?/span>
ScheduledExecutorService
接口的具体类?br />
1Qpublic static final ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(2);
2Qpublic static final ScheduledThreadPoolExecutor scheduledExecutor=new ScheduledThreadPoolExecutor(2);
q两U方式是一LQ都是得C个可调度的线E池?/font>
ScheduledThreadPoolExecutor
?/span>
Timer
的区别:
1.
Timer
的主要方法有Q?/span>
//
安排在指定的旉执行
void schedule(TimerTask task, Date time)
//
安排在指定的旉开始以
重复的g?/span>
执行
void schedule(TimerTask task, Date firstTime, long period)
//
安排在指定的延迟后执?/span>
void schedule(TimerTask task, long delay)
//
安排在指定的延迟后开始以重复的g时执?/span>
void schedule(TimerTask task, long delay, long period)
//
安排在指定的旉开始以
重复的速率
执行
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
//
安排在指定的延迟后开始以重复的速率执行
void scheduleAtFixedRate(TimerTask task, long delay, long period)
注:
重复的g?/span>
?/span>
重复的速率
的区别在于,前者是在前一个Q务的执行l束后间?/span>
period
旉再开始下一ơ执行;?/span>
scheduleAtFixedRate
则是会尽量按照Q务的初始旉来按照间?/span>
period
旉执行。如果一ơQ务执行由于某些原因被延迟了,?/span>
schedule()
调度的后lQ务同样也会被延迟Q而用
scheduleAtFixedRate()
则会快速的开始两ơ或者多ơ执行,是后lQ务的执行旉能够赶上来?/span>
2.
ScheduledThreadPoolExecutor
的主要方法:
//
在指定的延迟后执?/span>
<V>ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
//
在指定的延迟后执?/span>
ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
//
在指定的延迟后以固定速率执行
(
cM
Timer.scheduleAtFixedRate())
ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
//
在指定的延迟后以固定间隔执行
(
cM
Timer.schedule())
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
比较Q?/span>
Q?/span>
1
Q?/span>
Timer
对调度的支持是基于绝Ҏ间的Q因此Q务对pȝ旉的改变是敏感的;?/span>
ScheduledThreadPoolExecutor
支持相对旉?/span>
Q?/span>
2
Q?/span>
Timer
使用单线E方式来执行所有的
TimerTask
Q如果某?/span>
TimerTask
很耗时则会影响到其?/span>
TimerTask
的执行;?/span>
ScheduledThreadPoolExecutor
则可以构造一个固定大的U程池来执行d?/span>
Q?/span>
3
Q?/span>
Timer
不会捕获?/span>
TimerTask
抛出的未查异常,故当有异常抛出时Q?/span>
Timer
会终止,D未执行完?/span>
TimerTask
不再执行Q新?/span>
TimerTask
也不能被调度Q?/span>
ScheduledThreadPoolExecutor
对这个问题进行了妥善的处理,不会影响其他d的执行?/span>
l论Q?/span>
Timer
有这么多的缺点,如果是?/span>
JDK1.5
以上的话Q应该没什么理p使用
Timer
来进行调度?br />
Q友情提C:本博文章Ƣ迎转蝲Q但h明出处:陈新汉,http://www.tkk7.com/hankchenQ?br />
使用PowerDesigner设计数据库关pM后,可以生成HTML,供团队成员进行讨论?/span>
Step 1Q创Z?/span>new Report;
选择?/span>file?/span>---?/span>new?/span>---?/span>Multi-Model Report】,然后定义Report Name,q个主要?/span>HTML的名Uͼ选择Language?/span>
Step 2: 选择需要生成的Model;
?/span>Model Name 选择需要生?/span>HTML?/span>Model,然后选择一U?/span>Report template,q里选择?/span>Stand Physical Report】,然后点击【确定】?/span>
Step 3: 生成HTMLQ?/span>
选择刚刚新创建的Report,右键Q?/span>Generate?/span>---?/span>HTML】,选择存放路径。然后选择【保存】,大功告成?/span>
二、创建烦?/span>
1.双击TableQ弹?/span>Table PropertiesH口Q?/span>
2Q添加一个新的烦引?/span>
3Q选择uniqueQ把索引讄为唯一索引?/span>
4Q双ȝ引所在的行,弹出索引属性窗口(Index PropertiesQ?/span>
5Q双L加列按钮Q弹?/span>SelectionH口?/span>
6Q选择索引包含的表的列Qƈ单击OK?/span>
三、添加表注释和列注释
1.表注释:双击表,弹出Table PropertiesH口Q填?/span>comment
2.列注释:双击左边的树形菜单的中的列,弹出列属性窗口,填写comment
四、?/span>PowerDesigner设计建?/span>MySQL数据?/span>
Q?/span>1Q?/span>PowerDesigner制作建库脚本
1、设?/span>CDM(Conceptual Data Model)
2、选择 Tools -> Generate Physical Data Model Q选择对应?/span>DBMS?/span>MySQLQ生?/span>PDM
3、选择 Database -> Generate Database Q在弹出?/span> Database Generation 对话框中选择脚本存取路径及脚本文件名U?/span>
4、点ȝ定后生成数据库徏库脚?/span>(*.sql)
Q?/span>2Q用徏库脚本徏立数据库
1、登?/span> mysql -u root -p
2、徏立空?/span>databse create databse mydbse;
3、徏立用?/span> grant all on mydbse.* to username@192.168.1.100 identified by 'password'Q?/span>
4、退?/span> exit;
5、在l端中输?/span> mysql -h 192.168.1.100 -u username -p < Script.sql
6、回车后输入密码卛_
五?/span>PowerDesigner设计时表昄注释选项
PowerDesigner设计时表昄注释选项:
选定~辑的表,右键- >Properties- >Columns- >Customize Columns and Filter(或直接用快捷?/span>Ctrl+U)- >Comment(前面打勾)- >OK
六?/span>PowerDesigner使用MySQL?/span>auto_increment
打开table propertiesH口→ columns →选中id?/span>→打开columns propertiesH口→N?/span>identity卛_?/span>
七?/span>PowerDesignerLSQL脚本中的双引?/span>
?/span>Database → Edit Current DBMS → General → Script → Sql → Format → CaseSensitivityUsingQuote讄?/span>NO卛_
八?/span>PowerDesigner中设|?/span>Entity自动调整寸大小
?/span>Entity上点d?/span>→单击Format...菜单?/span>→选择size标签?/span>→N?/span>Auto adjust to text卛_
九?/span>Generate Name in Empty Comment
一直用PowerDesigner设计Qƈ生成Oracle表结构,对于生成Oracle表中列的Comment字段却要手工补充?/span>
今天同事提vPowerDesigner可以自动?/span>Name的说明替?/span>CommentQ在他的PD中可以看到效果,但他也忘记如何设|)?/span>
|上找下了资?/span>,很多都是说如何用RUN SCRIPT的方法。最后,l过查找PowerDesigner的帮忙,原来很简单。设|如下:
[Database]->[Database Generation]->[Options] ->Generate Name in Empty Comment
如果设计时没有写CommentQ就?/span>Name替代?/span>
十、修改表的字D?/span>Name的时候,Code不自动跟着变?
tools->General Options->Dialog:Operation Modes: NameToCodeMirroring(checked=false)
十一、去掉默认的新徏的表名和字段名加上双引号问题
打开Database -> Edit Current DBMS Q出C个编辑界面,在右边的框里Q找?/span>script分节点,再依ơ找?/span>sql -> format 节点Q下面有一个这L名称的属性:CaseSensitivityUsingQuoteQ把q个属性的D?/span>“QO”Q再看生成的scriptQ就全部双引号都L了?br />
Q友情提C:本博文章Ƣ迎转蝲Q但h明出处:陈新汉,http://www.tkk7.com/hankchenQ?br />
安装成功后,会在“开?-E序--Windows Live”中找到刚刚安装的Windows Live WriterE序?
打开E序后,输入您的Live ID和密码进入客L。Live ID可以是Live Spaces账号或者MSN账号{等。没有这些̎L话先L册一个?
在客L菜单栏中Q点?#8220;日志—添加日志̎?#8221;Q打开下面的窗口:
选择“其他日志服务”Q点?#8220;下一?#8221;Q?
输入blogjava的主地址http://www.tkk7.com/Q和你的账号密码{(hankchen是我的̎P。点?#8220;下一?#8221;Q?
q时候,C关键的地方,需要你输入日志cdQ和q程发布日志的URLQ这些信息不是ؕ填的。博客园开攄Windows Live Writer的日志类型API为Customer MetaWebQ远E提交的API链接是:
http://yourname.blogjava.net/services/metaweblog.aspx
例如Q我的远E提交地址?a >http://hankchen.blogjava.net/services/metaweblog.aspx
所以,填写内容如下Q?
点击下一步,会出现提C正在检查日志设|的操作Q完成后出现Q?
点击“完成”按钮。恭喜你Q设|完成!
现在Q点?#8220;文g—打开”Q就可以在客L查看你的所有日志了Q?
接下来,可以慢慢n受离U查看、编写blog日志的过E了Q插入图片,表格什么的Q一切就是这么简单?/p>
友情提示Q本博文章欢q{载,但请注明出处Q?a href="http://www.tkk7.com/hankchen">陈新?/a>