??xml version="1.0" encoding="utf-8" standalone="yes"?>
* 一个是字面字符Ԍq个可以从池中取Q或者生成新字符串对象,q扣留到池中Q,然后在将q个字符串对?br /> * 的glnew出来的字W串对象的构造器Q生成一个新字符串对象(q个字符串是没有扣留到池中的Q,Cnew关键字L生成了对象?br /> * 而我们给q个new出的字符串调用intern()ҎQ就会把q个字符串对象扣留到池中Q而且如果池中有相同的字面值的字符Ԍ
* ׃q回池中的字W串Q如果我们将该字W串引用赋给原先字符串的引用变量Q那么我们就会省M个对象,原先的字W串对象׃被某一个时dӞ
* 如果池中没有相同值的字符串就q回该对象自w?img src ="http://www.aygfsteel.com/vagasnail/aggbug/301146.html" width = "1" height = "1" />
]]>
我的理解Q?/span>
1
Q尽量不要在发布的程序中使用打印调用栈的信息处理异常Q因样在发布的程序中Ҏ不可见,如同忽略处理异怸栗而是要么其处理Q要么将其包装后抛出Q我们对于客L不能处理Q也没必要处理的异常通常包装?/span>
RuntimeExcepion
?span style="COLOR: #3f7f5f">q样客户E序可以选择是否获取其异怿息,l客L序一个选择处理的机会。如Q显C到客户端。更不要忽略异常Q记住只打印调用堆栈和忽略异常是{h的,当然开发及调试的时候除外?/span>
2
Q因为异常是非常消耗资源的Q所以不要用异常做程控制?/span>
3
QL优先使用
UnCheckedException
?/span>
4
Q不要自定义q多的异常类Q因?/span>
Java
的异怿息已l将q个异常描述得够清晰了。要么ɘq个异常cL担更多的责Q?/span>
5.
不要过多的代码写入C?/span>
try
语句中,通常
try
语句只包含需要处理的代码?/span>
6. Checked
异常只是Z使程序员写出更健壮的代码而发明的。但是由于设计的p对于一些无法恢复,或者很难恢复的异常也作?/span>
Checked
异常
Q?span style="COLOR: #3f7f5f">是一个错误的军_。事实证明不适用?/span>
Checked
异常?/span>
C++
?/span>
C#
的异常处理机制比
Java
更成功?/span>
7.
不要在程序中包含q多的异常处理语句,q样会你的语句难以理解Q会使你的程序的效率变慢。只在需要的处理的地方处理异?/span>
8.
不要把底层的异常抛给业务层,要么处理要么包装后抛l业务层。因Z务层不关心这个?/span>
9. 对于能处理的异常量处理Q否则抛出。优先考虑 RuntimeExcepion 包装?/span>
ClassLoader的机Ӟ
Bootstrap ClassLoader/启动cd载器
主要负责jdk_home/lib目录下的核心 api ?-Xbootclasspath 选项指定的jar包装入工作?
Extension ClassLoader/扩展cd载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作?
System ClassLoader/pȝcd载器
主要负责java -classpath/-Djava.class.path所指的目录下的cMjar包装入工作?
User Custom ClassLoader/用户自定义类加蝲?java.lang.ClassLoader的子c?
在程序运行期? 通过java.lang.ClassLoader的子cd态加载class文g, 体现java动态实时类装入Ҏ?/p>
//getResourceAsStream和ClassLoader.getSystemResourceAsStream的关p?br /> //首先getResourceAsStream调用自己的ClassLoader加蝲Q如果没有就是用ClassLoader.getSystemResourceAsStream
//来加载资源。getSystemResourceAsStream从当前ClassLoader的类加蝲搜烦路径中查找资源。所以用getResourceAsStream
//也可以加载当前Classpath中的资源?/p>
5、volatile 保证M一个线E在d一个域的时候都会看到最q刚刚被写入的倹{?br /> 单的说volatile提供synchronized的可见性,而不提供互斥性?br /> * 我想volatileQ是q用关键字volatile修饰q的变量Q放在主内存中而不是线E的工作内存
* q样每次当该变量的值改变的时候,׃在主内存中改变?br /> * 而一般的变量Q将会在U程的工作内存中保持一份拷贝,然后只在适当的时机,才会变化写入到d?br /> * 对于同步块而言Q这个时机就是同步块开始或l束Q而其它的时机Q我x在当前用该变量语句后?br /> * 当然volatile变量不保证原子性(也就是volatile变量的用,可能被其它的U程q扰Q比如两个线E同时对该变量操作,但是要在高压的情况下才能出现,要实现原子性必d该变量加锁。)Q仅保证可见性(L得到最C改的|?/p>
6、计机无法q行正确的Q点运,因ؓ计算机是二进制的Q我们在 Java 中可以用BigDecimal、int或者longq行点q算Q这样可以得到准的l果?br />7、不要用字W串q接操作W来q接字符Ԍ除非性能无关紧要Q否则用StringBuffer中的appendҎQ或者用更好的StringBuilder?br /> (通常应该优先使用 StringBuilder c,因ؓ它支持所有相同的操作Q但׃它不执行同步Q所以速度更快)?br />8、添加join后当前线E必要{待该线E结束后在执行,也就是将该线E加入到当前U程q行周期之内
9、如果不惌恶意dQ请使用U有的对象监视器。永q不要用线E组ThreadGroup?br />10、serialVersionUID 表示一个可序列化的cȝ版本信息Q我们应该L提供一个手动的serialVersionUIDQ而不是由pȝ自动生成。这样可以保?br /> cȝ兼容性和节省略微的性能开销?br />11、应该L实现自定义的序列化,除非一个对象的物理l构和逻辑l构式一LQ即使是q样我们最好也用自定义的序列化Q提供一个readObjectҎ?br /> 保证U束关系和安全性?br />12、ؓ了实现序列化的SingletonQ那么我们应当提供一个readResolveҎ?br />13、从本质上来ԌreadResolveҎreadObject从事实上的公有构造函数变成事实上的公有静态工厂(针对于反序列化是产生的对象)。 ?