java谜题读书笔记_java谜题读书笔记

1.//显示为0

int j = 0;

for (int i = 0; i 

j = j++;

System.out.println(j);

2.//死循环

public static final int END = Integer.MAX_VALUE;

public static final int START = END -100;

int n = 0;

for (int i = START; i <= END; i++) {

n++;

System.out.println(START+" "+END);

}

3.//位移规则

4.//double设置nan值

double i = 0.0/0.0;

or

double i =Double.NaN

so

i-i==0 = false

//5.在包含finally块的try|catch中,在try|catch中断操作,使用break.continue,return,总是会最终执行finally。

//6.静态常量,是可以通过static块来进行初始化的

public static final long USER_ID;

static{

USER_ID = 123l; //给予的值只能是常量或者是静态的

}

//7.当使用system.exit(0)来终止程序后,finally中不会再执行

//8.stackoverflowerror异常大多数情况

//9.不要依赖于NoClasDefFoundError,如果需要测试在程序中某一个类是否丢失,请使用反射来进行检测!

//10.当你在执行你的构造器的时候,程序会选择精准匹配来执行

public Test(Object obj){

System.out.println("obj");

}

public Test(String []arr){

System.out.println("arr");

}

new Test(null);//打印的是 “arr”

如果要打印"obj" 需要使用new Test((Object)null);

//10.当父类是有静态方法的时候,子类也有同名的静态方法,需要注意编译时的类型。因为多个子类对象可能共享一个静态对象。

//11.当使用instance的时候,如果前对象是一个空引用的时候,返回的是false.

//12.BigInteger是不可变的,特性(想通于String)

//13.不要在一个整型字面常量的前面加上一个0,这样会使它变成一个八进制的字面常量。在决定应该包含什么特性时,考虑其限制条件。

//14.Math.abs当在他的参数是Integer.MIN_VALUE或者是Long.MIN_VALUE时不一定会返回非负的结果,没有任何int类型可以表示Integer.MIN_VALUE的负值,long也一样不能表示Long.MIN_VALUE的负值。

//15.比较器在做两个int或者long数值的减法时,其结果可能会溢出。所以不要使用基于减法的比较器

//16.规则:当一个变量和一个类型具有相同名字,并且它们位于相同的作用域时,变量名具有优先权,变量名遮掩类型名。相似的,变量名和类型名可以遮掩包名。

//17.在使用Thread的时候,除非有关于某个类的详细说明作为保证,否则千万不要假设库中的这个类对它的实例或者类上的锁会做(或者不会做)某些事情。对于库的任何调用都可能会产生对wait,notify,notifyAll方法或者某个同步方法的调用。这些都是可能对应用级的代码产生影响。对于这样的问题的修复可以使用Object类型的私有域作为锁,并在所有同步方法上来进行这个锁的同步。

另一种方式就不使用Thread,而去实现Runnable,如果要防止新的线程创建,可是使用:

synchronized(Thread.class){

Thread.sleep(Long.MAX_VALUE);

}

//18. 名词:限定类型

PS:尽量的使用Type.class.xxx   而不是 type.getClass().xxxx

//19. 在我们的作为开发者来说,要小心无意间产生的方法或者变量和类型所产生的屏蔽。所以尽量的不要去使用具有相同的名字来命名我们的方法,变量和类型。

//20. 在开发中,尽量的使用熟悉的惯用法,如果要使用其陌生的api的时候,需要详细的阅读其说明文档!

//21. 在多线程中,为了确保子进程能够结束,你必须排空它的输出流;对于错误流也是,而且它可能更麻烦。

//22. 如果一个单例类实现了Serializable,就必须使用一个readResolve,用它返回唯一的实例,否则可以通过序列化来获取多个实例。如:

staitc public Object deepCopy(Object obj){

try{

ByteArrayOutputStream bos = new ByteArrayOutputStream();

new ObjectOutputStream(bos).writeObject(obj);

ByteArrayInputStream bin = new ByteArrayInputStream(bos.toByteArray());

return new ObjectInputStream(bin).readObject();

}catch(Exception e){

throw new IllegalArgumentExcetption(e);

}

}

如果要避免,则使用

private Object readResolve(){

retrun INSTANCE;

}

//23. 在多线程编程中 如果调用Thread.interrupted 方法会对线程的中断状态造成影响。因为在调用它的时候总是会清除当前线程的中断状态。

//24. 在类的初始期间,尽量的不要去启动其他的线程,要让类的初始化的动作尽量的简单。如果一定要这样做,最好是让主线程等待后台线程之前完成类的初始化。

//25. 如你需要实例化一个内部类,你则需要提供一个外部类的实例给构造器。而且需要注意的是,当一个类是外部类又是其他类的超类的方式是不合理的。

//26. 尽量的不要把静态变量编译到客户端中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值