Java解惑[一]

/**
* 谜题一:奇数性
*/
@Test
public void testJs(){
/**
* 错误的方法 虽然这个方法可以返回奇数,但是当传的值是负数的时候就不适用了
*/
System.out.println(isOdd(1));
System.out.println(isOdd(-12));
/**
* 正确的解决方案
*/
System.out.println(isOdd2(1));
System.out.println(isOdd3(-12));
}
private boolean isOdd(int val){
return val % 2 == 1;
}
private boolean isOdd2(int val){
return val % 2 != 0;
}
private boolean isOdd3(int val){
return (val & 1) != 0;
}

/**
* 谜题二: 找零时刻
* 提示:对于要求精确的计算,应该避免适用Double和float,要使用int,long,BigDecimal
*/
@Test
public void testDouble(){
/**
* 错误的答案
*/
System.out.println(2.0-1.10);
/**
* 解决方案
*/
System.out.printf("%.2f\n",2.0-1.10);
System.out.println(new BigDecimal(String.valueOf(2.0)).
subtract(new BigDecimal(String.valueOf(1.10))));
}
/**
* 谜题三: 长整除
* 描述:之所以称之为长整除是因为他涉及的程序是有关两个long类型数值整除的
*   被除数表示的是一天里面的微秒数 除数表示一天的毫秒数
*/
@Test
public void LongDivision(){
final long micros_per_day = 24*60*60*1000*1000;
final long miclic_per_day = 24*60*60*1000;
/**
* 正确的答案应该是1000,但是程序给出一个错误的答案5
* 因为程序以Int类型运算 ,导致计算溢出 ,为什么程序以
* Int类型运行 因为赋值的时候 所有乘在一起的因子都是Int类型
* Java不具有目标确定类型的特性
*/
System.out.println(micros_per_day/miclic_per_day);
/**
* 正确的做法:
* 把乘在一起的第一个因子 以L类型出现
*/
final long micros_per_day2 = 24l*60*60*1000*1000;
final long miclic_per_day2 = 24l*60*60*1000;
System.out.println(micros_per_day2/miclic_per_day2);
}
/**
* 谜题四: 初级问题
*/
@Test
public void testCjwt(){
/**
* 为什么答案不是66666 而是17777
* 因为第二个参数是5432L 因为l小写了 让人第一感觉是1
*/
System.out.println(12345+5432l);

}
/**
* 谜题五: 十六进制的趣事
*/
@Test
public void testJoyOfHex(){
/*
* 正确输出值应该是1cafebabe 但你会发现输出的结果是cafebabe
*/
System.out.println(Long.toHexString(0X100000000L+0xcafebabe));
/*
* 正确
*/
System.out.println(Long.toHexString(0X100000000L+0xcafebabeL));
}
/**
* 谜题六: 多重转型
*/
@Test
public void testMultiCast(){
System.out.println((int)(char)(byte)-1);
}
/**
* 谜题七: 互换内容
*/
@Test
public void testCleverSwap(){
/*
* C++ 中适用的互换内容Java并不支持
*/
int x = 1984;
int y = 2001;
x ^= y ^= x ^= y;
System.out.println("x : "+ x + " y:" + y);
}
/**
* 谜题八: Dos Equis
* 这个谜题将测试你对条件修饰符的掌握程度 三元运算符
*/
@Test
public void testDosEquis(){
char x = 'X';
int i = 0;
/*
*正确的答案应是XX 但是当你运行时会发现程序打印的应该是X88 
*/
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
/*
* 答案就在规范有关条件表达式部分的一个阴暗的角落里 
* 请注意这两个表达式第二个参数和第三个参数类型 都是不同的 x是char类型 而0和i都是Int类型
* 混合类型的计算会引发混乱 而在表达式里面会更加的明显
*/
}
/**
* 谜题九: 半斤 
*/
@Test
public void testBanJin(){
short x = 0;
int i = 123456;
x+=i;
/*
* 许多程序员以为x+=i 是x = x + i的简写方式,但是这
* 并不十分准确 ,这两种表达式都称为赋值表达式。x = x + i 使用的是
* 简易赋值操作符,而x+=i使用的是复合赋值操作符(+=,-+,*=,/=,%=,<<=,>>=,>>>=,&=,^=)
* Java语言规范讲到 复合赋值操作 Ep1 += Ep2 等于简易赋值Ep1=(T)((Ep1)+(Ep2))
* 其中T是Ep1的类型
* 换句话说,复合赋值表达式自动将结果转化成左侧变量的类型
* 
* 结果输出的是-7616 因为123456对于short类型来说太大了 溢出
*/
System.out.println(x);
}

你可能感兴趣的:(Java解惑[一])