来自Java编程思想
1、奇数性:判断一个数是否是奇数的时候要注意负数时的情况。
可以用 x % 2 != 0 来判定。
也可以用(x & 1) != 0;位操作来判定。
2、找零时刻:System.out.println(2.00-1.10);想要的输出结果为0.99但是实际结果为0.8999999999999999
解决方法:(1) System.out.printf("%.2f%n",2.00-1.10);
(2) System.out.println(200-110+"cents");
(3) System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
方法评价:第一种计算原理相同只是显示的结果不一样。
第二种比较可取。
第三种如果有大量的计算则会存在效率问题。
3、长整数:注意不要让数据溢出,如果可能溢出,则使用长整形来提前处理。
4、1和l注意区分,如果要使用长整形的时候一定要把l写成大写的L这样才能明确的区开来。
5、十六进制加法的时候出现的问题。十六进制数的最高位如被占用,那么他就是一个负数,例如
int的最高为4个字节32位,如果有一个0xcafebabe那么这个数就是一个负数-889275714。
如果为long那么就是一共8个字节64位。
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
左操作数为一个long型,右操作数为int类型,为一个负的十六进制,如果转换为long型,
则还为与原来等值的负数。左操作数的高32位是一,右操作数的高32位是负一,所以
相加之后高32位就变成了0。
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
这样就不会出现问题了。
(注意相加的进制的最高为是否被占用)。
6、多重转型:System.out.println( (int )(char )(byte ) -1);
先把int类型的-1转换为byte型的-1,在转换为char型在转换为int类型之后的结果为65535。
不可思议的结果。int 到 byte的转换,int32位byte8位,int的-1所有的32位都置位转换到byte
的时候,执行窄化原始类型转化直接把高24位丢掉。留下一个8位的都被置位的byte类型,
还表示-1。从byte到char,char16位且无符号。从byte到char发生符号扩展,因此就是16个1,
转换为char之后就是2的16次方减一,即65535.从char到int执行零扩展,因此还是65535.所以最终
结果是65535.
如果想把char转换为宽度更宽的类型,并且希望有符号扩展的话,就先把char转换为short然后再转换。
如果你在将一个byte类型的数值b转换为char,并不希望有符号扩展,那么你必须使用一个位掩码
来限制它。例如
char c = (char) (b & 0xff)
7、互换内容:x^=y^=x^=y;在Java中并不能完成内容互换,最简单的方法就是声明一个中间变量。
8、dogEquis,问号冒号操作符。
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x );
规则:
(1)如果第二个和第三个操作数的类型相同,那么他就是条件表达式的类型。
(2) 如果一个类型为T,T代表byte/short/char,另一个是int常量,那么表达式类型
的类型就是T;
(3)否则对操作数类型进行二进制提升,而表达式的类型就是提升后的类型。
第一个符合第二点,所以为char,输出X
第二个符合第三点所以为int,输出88;(X对应的ascll码)
编程是应该注意的问题,尽量让第二和第三个操作数有相同的类型,这样程序看起来更清晰。
9、半斤
使用复合赋值操作符的时候,默认把类型强制转换为操作符左边的,如果左边的类型比右边的
窄,就会出现强制类型转换,可能出现溢出的现象,这就会给程序带来一定的不确定性。
因此,在编写程序的时候尽量要是左边的宽度比右边大,或者是相等,这样就不会出现问题。
short x = 0;
int i = 123456;//short的范围为-32768~32768
x += i; //把类型强制转换为左边的类型。会出现溢出现象
10、八两
复合赋值操作符要求两百年必须是原始类型(int)或包装了的原始类型(Integer)(似乎不是这样);
简单复制操作符允许左侧对象是引用类型,要保证左右兼容;
Object x ="Buy";
String i = "Effective Java";
int j = 10 ;
x = x + i; //合法
System.out.println("10、八两");
System.out.println(x);
x = "Buy";
//x += j;//不合法
x += i;//如果右侧不是String类型则不合法,如果是int\char\long等则合法。
System.out.println(x);
package Java_JieHuo;
import java.math.BigDecimal;
public class test_JieHuo {
public static void main(String [] args){
SearchZero();
longInteger();
l_And_1();
JoyOfhex();
Mulitcast();
CleverSwap();
DogEquis();
BanJin();
BaLiang();
}
//2--找零时刻
public static void SearchZero(){
System.out.println(2.00-1.10);
//笨拙的方法
System.out.printf("%.2f%n",2.00-1.10);
System.out.println(200-110+"cents");
System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
//System.out.println(new BigDecimal(2.00).subtract(new BigDecimal(1.10)));
}//end SearchZero
//3--长整数
public static void longInteger(){
long ms_Per_Day = 24L * 60 *60 *1000;
long mms_Per_Day = 24L * 60 * 60 * 1000 * 1000;
System.out.println("每天的毫秒数"+ms_Per_Day);
System.out.println("每天的微秒数"+mms_Per_Day);
System.out.println(mms_Per_Day/ms_Per_Day);
}//end longInteger
//4注意 1 和 l
public static void l_And_1(){
System.out.println("注意1和:");
System.out.println(12345+5432l);
System.out.println(12345+54321);
}//end l_And_1
//5 16进制加法时出现的问题
public static void JoyOfhex(){
int a = 0xcafebabe;
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
System.out.println(a);
System.out.println((long)a);
}//end JoyOfHex
//6多重转型
public static void Mulitcast(){
System.out.println( "6、多重转型");
System.out.println( (int )(char )(byte ) -1);
}//end Mulitcast
//7、互换内容
public static void CleverSwap(){
int x = 1984;
int y = 2001;
x^=y^=x^=y;
System.out.println("7、互换内容");
System.out.println("x ="+x+"y="+y);
int tmp;
x = 1984;
y = 2001;
tmp =x;
x = y;
y = tmp;
System.out.println("x ="+x+"y="+y);
}//end CleverSwap
//8、dogEquis
public static void DogEquis(){
char x = 'X';
int i = 0;
System.out.println("8、dogEqius");
System.out.println(true ? x : 0);
System.out.println(false ? i : x );
}//end DogEqius
//9、半斤
public static void BanJin(){
short x = 0;
int i = 123456;//short的范围为-32768~32768
x += i; //把类型强制转换为左边的类型。
System.out.println("9、半斤");
System.out.println(x);
/*x = x + i; //不能通过编译
System.out.println(x);*/
}//end BanJin
//8、八两
public static void BaLiang(){
Object x ="Buy";
String i = "Effective Java";
int j = 10;
x = x + i;
System.out.println("10、八两");
System.out.println(x);
x = "Buy";
x += i;
//x += j;//不合法
System.out.println(x);
}//end BaLiang
}