Java解惑

1.奇数性. %运算符,求奇数 i%2==1,在i为负数时结果错误,改成i%2 !=0或 (i&1)!=0
2.找零时间 . 2-1.1的结果非0.9的问题,在精确计算时尽量避免使用float,double,使用BigDecimal(String)
3.长整除,long类型的除法,long micros_of_day = 24*60*60*1000*1000;//产生了溢出,都是int在相乘,超过了int的范围
    当操作大数字时,提防溢出
4.el——ementary问题,初级问题;System.out.println(12345+5432l);//17777  --避免使用l来表示long,要用L
5.16进制问题  避免混合类型的计算

System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));//正确值1cafebabe
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));//错误值  cafebabe


6.多重转型 (int)(char)(byte)-1 //65535  
byte类型的-1转化为char,由ascii码表,-1是不在表范围之内,因为默认char占2个字节,即8个bit,所能存的最大值是65536个,所以char的数字范围是0-65535,把-1转为char,会倒着找,就是最大值65535
7.互换内容   在单个的表达式中不要对相同的变量赋值两次,java中操作符的操作数是从左向右求值的

参考:https://blog.csdn.net/wangsr4java/article/details/23831949

  //交换变量请使用如下方式
  int a=3,int b=5;
  a=a+b;
  b=a-b;
  a=a-b;                                                                                                                                       
  printf("a=%d\n,b=%d\n",a,b)


8.三目运算  x='x' i=0 (true ?x:0) (false ? i:x) 的问题,避免混合类型的计算
9.复合表达式 x+=i,x=x+i,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型
10.复合表达式  
------字符之谜
11.字符和字符串相加  将char提升为int,当且仅当+操作符的操作数中至少有一个string类型时,才会执行字符串的连接操作
12.将一个char数据转换成字符串时,需要用string.valueof(char[])
13.("print out:"+a==b)-->输出 a==b的结果,相当于进行了(("print out:"+a)==b)
    修改成 ("print out:"+(a==b))
    经验:在使用字符串连接操作符时,总是将不平凡的操作数用括号括起来
14.转义字符 java对在字符串字面常量中的unicode转义字符没有提供任何特殊处理
    在字符串和字符字面量中优先选择的是转义字符序列,而不是unicode转义字符
15.注释中的\units 是无效的,无法通过编译...\u 是unicode转义字符的开始,unicode转义字符必须是良构的,即使出现在注释中也是如此
    在javadoc注释中,应该使用html实体转义字符来代替unicode转义字符.
16.\u000A ,unicode的换行符,与'\n'换行。   经验:除非确实必须的,否则就不要使用unicode转义字符
17.只有在要向程序中插入用其它任何方式都无法表示的字符时,unicode转义字符才是必须的,除此之外的任何情况都应该避免使用它们
18.每当要将一个byte序列转换成一个string时,都在使用一个字符集,不管是否显示地指定了它.
    使用String(byte[],encode)构造器
19.块注释 块注释不能嵌套
20.String.replaceAll(".",",");  .匹配任意字符.. 注意使用转义字符
21.在使用不熟悉的类库时一定要小心,注意正则表达式
22.标号(标记)问题 http://www.baiud.com .//后面是注释,http:是标记.这句话通过编译,但是没有实际用途
    经验:仔细地写注释,去除那些已遭废弃的代码.
23.  当心栅栏柱错误,在处理长度,范围或模数时,仔细确定其端点是否应该包括在内
     switch 中注意break;
     不熟悉的API要参看文档
     char 不是string,更像int
24.注意byte的符号位扩展.
25.自增长运算的陷阱    不要在单个的表达式中对相同的变量赋值超过一次
26.无论在何时使用了一个整数类型,都要意识到边界条件
27.移位操作符
28.使用一个double或float的值来表示无穷大是可以的,将一个很小的浮点数加到一个很大的浮点数上时,将不会改变大浮点数的值.
    二进制浮点算术只是对实际算术的一种近似
29.Double.NaN   当i = Double.NaN 时,i !=i 为true
    一旦一个计算产生NaN时,它就被破坏了
30. i !=i+0 为true,当i="aaaa" string类型时.  注意"+"对字符串的运算
31.不要在short,byte或char类型的变量上使用复合赋值操作符
32.当两个操作数都是包装的数字类型时,数值比较操作符和判等操作符的行为存在着根本的差异,数值比较操作符执行的是值比较,而判等操作符执行的是
引用标识的比较
33.数值的溢出.
34.不要使用浮点数作为循环索引
35.不要使用空格来表示分组,要使用括号  m % 60*1000  --> m % (60*1000)
36.不要用return,break,continue或throw来退出finally块,不允许让受检查的异常传播到finally块之外
37.如果一个catch子句要捕获一个类型为E的受检查异常,而其对应的try子句不能抛出E的某种子类型的异常,那么会发生编译期错误
    捕获exception或throwable的catch子句是合法的,不管其对应的try子句的内容为何
    一个方法可以抛出的受检查异常集合是它所适用的所有类型声明要抛出的受检查异常集合的交集,而不是合集
38. 如果必须重构一个程序,以消除由明确赋值规则所引发的错误,那么应该考虑添加一个新方法
39.system.exit(0)在try块内     会终止try,而不再执行finally
40.调用一个构造器时,实例变量的初始化操作将先于构造器的程序体而运行,
    实例初始化时抛出的任何异常都会传播给构造器,如果初始化操作抛出的是受检查异常,那么构造器必须声明也会抛出这些异常,
    但是应该避免这样做,对于设计的类,如果其实例包含同样属于这个类的其它实例,那么对这种无限递归要格外当心
41.对finally块中受检查的异常要处理,不能传播出去
42.不要使用异常控制循环,应该只为异常条件而使用异常
    &和&&,|和||,区分清楚
43.java的异常检查机制并不是虚拟机强制执行的,不要忽视编译器给出的警告信息
44.捕获error及其子类型几乎是完全不恰当的.
45.指数,递归..
46.    new Confusing(null) 调用哪个构造器   Confusing(Object o) ,Confusing(double[] ary)..
    java的重载机制:
    在测试哪一个方法或构造器最精确时,这些测试没有使用实参
    要想强制要求编译器选择一个精确的重载版本,需要将实参转型为形参所声明的类型
47.静态域由声明它的类及其所有子类共享
    类设计时优先选择组合而不是继承
48.对静态方法的调用不存在任何动态的分派机制
49.在final类型的静态域被初始化之前,存在着读取其值的可能
   要想改正一个类初始化循环,需要重新对静态域的初始器进行排序,使得每个初始器都出现在任何依赖于它的初始器之前.
50.instanceof 操作符.
51.不要在构造器中调用可覆盖的方法
52.要么使用积极初始化,要么使用惰性初始化,千万不要同时使用二者
   考虑类初始化的顺序,特别是当初始化显得很重要的时候
53.私有构造器捕获惯用法...一个private 构造器,在public构造器中调用private构造器
54.null和void,有一个Null类,static void greet()方法,  ((Null)null).greet();
    静态方法调用的限定表态式是可以计算的,但是它的值将被忽略
    要么用某种类型来限定静态方法,要么不限定,不要用表达式限定静态方法
55.一个本地变量声明不能用作for,while,do循环中的重复执行语句,它作为一条语句只能出现在一个语句块中.
    for(i....)
        A a = new A
    不允许,要加括号.
    另外,要使用long来对实例的创建计数,防止溢出.
56.BigInteger实例不可变...string,bigdecimal,以及基本类型包装类都不可变
    不要被类的方法误导,认为不可变类型是可变的
57.只要覆盖了equals()就要重写hashCode()
58.为了避免无意识地重载,应该机械地对想要覆写的每个超类方法都拷贝其声明 @Override
59.以0开头的整型字面常量将被解释成8进制数值
60.在每个新版本发布的时候,都有必要研究一下“新特性和提高”,了解类库中有些什么可以节省大量的时间和精力,并且可以提高程序的速度和质量
61.在使用Calendar或Date时一定要小心,查阅API
62.字符串常量是内存限定的...不要使用IdentityHashMap,除非需要基于标识的语义,它不是一个通用目的的Map实现
63.不要因为偶然地添加了一个返回类型,而将一个构造器声明变成了一个方法声明    
64.Math.abs不能保证一定会返回非负结果
65.不要使用基于减法的比较器,除非能够确保要比较的数值之间的差永远不会大于Integer.MAX_VALUE
   要意识到溢出
66.避免隐藏
   声明一个域,一个静态方法或嵌套类型时,如果其名字与基类中相对应的某个可访问的域,方法或类型相同,就会发生隐藏,
   隐藏容易发生混乱,要避免..
67.要避免重用平台类的名字,并且千万不要重用java.lang中的类名
68.当一个变量和一个类型具有相同的名字,并且它们位于相同的作用域时,变量名具有优先权,相似的,变量名和类型名可以遮掩包名.
   要按规范命名,避免这种情况的发生.
69.  ....要解决由类型被变量遮掩而引发的问题,需要按照标准的命名习惯来重命名类型和变量
70.一个包内私有方法不能被位于另一个包中的某个方法直接覆写
71.本身就属于某个范围的成员在该范围内与静态导入相比具有优先权,
    应该有节制地使用静态导入,只有在非常需要它的时候才使用它
72.final对于方法意味着该方法不能覆写或隐藏,对于域,意味着该域不能被赋值超过一次
    要避免在无关的变量或无关的概念之间重用名字
73.重用名字是危险的,应该避免隐藏,遮蔽和遮掩
74.如果你重载了一个方法,那么要确保所有的重载版本行为一致
75.应该升级到新版本的java平台...
76.调用线程start方法时不要弄错调成了run方法
77.永远不要假设类库会(或者不会)对它的锁做某些事情
78.访问位于其它包中的非公共类型的成员是不合法的
object.getClass().getMethod("methodName")这种习惯用法虽然常见,但是却有问题,它不应该被使用,
在使用反射访问某个类型时,使用表示某种可访问类型的class对象 Method m = Iterator.class.getMethod("hasNext");
79.注意无意间产生的遮蔽,使用thread(runnable)构造器来替代对thread的继承
80.除非确实需要一个外围实例,否则应该优先使用静态成员类而不是非静态成员类
避免使用反射来实例化内部类
81.System.out.write()的刷新问题
使用陌生的API时一定要查看文档
82.为了确保子进程能够结束,必须排空它的输出流,对于错误流也是一样
83.一个实现了serializable的单例类,必须有一个readResolve方法,用以返回它的唯一的实例
84.不要使用thread.interrupted方法,除非想要清除当前线程的中断状态.
85.在类的初始化期间等待鞭个后台线程很可能会造成死锁,让类的初始化尽可能简单.
86.有害的括号...int i = -(2147483648);会报错,去掉括号正常
87.要警惕float和double类型的拓宽原生类型转换所造成的损失
88.原生类型List和参数化类型List<Object>是不一样的
89.一个泛型类的内部类可以访问到它的外围类的类型参数
90.无论何时你写一个成员类,都要问问你自己,是否这个成员类真的需要使用外围类实例,如果答案是否定的,那么应该皀它设为静态成员。
扩展一个内部类的方式是很不恰当的,如果必须这样做的话,要好好考虑其外围类实例的问题
91.如果一个hashset,hashtable或hashmap被序列化,那么请确认它们的内容没有直接或间接地引用它们自身。
在readObject或readResolve方法中,避免直接或间接地在正在进行反序列化的对象上调用任何方法
92.私有成员不会被继承
如果你不能通过阅读代码来分辨程序会做什么,那么它很可能不会做你想让它做的事.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值