---------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
题记:
自从接触黑马以来,在论坛里也结识了很多志同道合的坛友,我知道梦想是什么含义了,就像电影《肖申克的救赎》里面的男主人公,监狱中一个六米厚的墙被一个小锤子给敲出一个逃生洞,还有一个鲜明的例子,张歆明大哥为了进黑马,熬战了整整两个月。这是黑马带给每一个有梦想的人的积极意义,黑马的目的不是为了工作而工作,而是为了磨练一个人,改变这个人对价值观,人生观,世界观的看法。不在扯了,进入正题。
1,负数的二进制表示
正数的二进制,很容易,不用多说,但是负数的二进制很多人都知道取反加一,但是就是容易错,
正确的步骤是:
a)不考虑符号位,用正数的方式求出二进制
b)对a中的二进制取反,加上符号位,
c)将b中的取反的值与1相加(二进制相加)
规律: 负数二进制的最高位为1 -6: 11111111111111111111111111111010
* 正数二进制的最高位为0 6: 00000000000000000000000000000110
-6的求取过程:
a)求出不带符号的二进制表示 00000000000000000000000000000110
b)对a结果求反 11111111111111111111111111111001
c)对b结果加1 11111111111111111111111111111010
用java代码验证,顺便给出求一个整整二进制的方法
public static void negative(){
int a = 6, b = -6;
String a1 = Integer.toBinaryString(a&0xffffffff);
String b1 = Integer.toBinaryString(b);
System.out.println(a1);
System.out.println(b1);
}
结果演示:
2,基本数据类型的大小
基本数据类型有八个,那么这些类型的大小是多少,容易混淆的是short,int,long,double,关键的一个类型char型,它是两个字节,用程序验证(程序方返回的是bit位数,需要除以8才行)。
public static void sizeOfType(){
//整形:4种
System.out.println("byte: \t"+Byte.SIZE/8+"字节");
System.out.println("short:\t"+Short.SIZE/8+"字节");
System.out.println("int:\t"+Integer.SIZE/8+"字节");
System.out.println("long:\t"+Long.SIZE/8+"字节");
//浮点型:2种
System.out.println("float:\t"+Float.SIZE/8+"字节");
System.out.println("double:\t"+Double.SIZE/8+"字节");
//布尔型:没有找到现实方法,在网上搜索,是1字节
System.out.println("boolean:1字节");
//字符型:char
System.out.println("char: \t"+Character.SIZE/8+"字节");
}
结果演示:
3,取模的问题
正数取模都会做,如果加上负数操作,那么怎么算呢?
诀窍:结果的符号和被模数同号,%前面的数字符号,如果是正号,则结果是正数,否则是负数
public static void method_mod(){
System.out.println(-7%5);
System.out.println(7%5);
System.out.println(7%-5);
System.out.println(-7%-5);
}
结果演示:
4,instanceof
instanceof 是运算符,返回结果是boolean型,主要用于类型检查,通常情况下instanceof类型检查检查类型的最终类型,不建议用超类去检查,instanceof的作用是在编译时就检查对象的合法性,所以第四句编译都无法通过。
public static void method_instanceof(){
//instanceof 是运算符,返回结果是boolean型
Integer a = 0;
System.out.println(a instanceof Object);
System.out.println(a instanceof Number);
System.out.println(a instanceof Integer);
//System.out.println(a instanceof String);
}
结果验证:
5,XOR操作
有些方法可以为程序带来节省空间的效果,交换两个数,一般的想法是申请一个临时变量,作为中转,这样空间开销就多一些。优化的方法就是异或操作,不需要申请变量,直接操作两个变量就可以,同时代码也会大大简化。异或可以交换数值类型中不带小数点的类型(float,double不可以),char,boolean也可以。包装类中Integer,Long,Boolean可以使用异或操作 。
public static void method_xor(){
Long a1 = 3l, a2 =5l;
System.out.println(a1+"\t"+a2);
a1^=a2;a2^=a1;a1^=a2;
System.out.println(a1+"\t"+a2);
Boolean b1 =true,b2 = false;
System.out.println(b1+"\t"+b2);
b1^=b2;b2^=b1;b1^=b2;
System.out.println(b1+"\t"+b2);
char c1 = 'A',c2 = 'D';
System.out.println(c1+"\t"+c2);
c1^=c2;c2^=c1;c1^=c2;
System.out.println(c1+"\t"+c2);
byte d1 = 34,d2 = 46;
System.out.println(d1+"\t"+d2);
d1^=d2;d2^=d1;d1^=d2;
System.out.println(d1+"\t"+d2);
}
结果验证:
6,三目运算符 ?:;
三目运算符的原型是根据if...else...方法进化而来,大大方便了代码的书写,可读性也提高了,也比较整洁。
注意:三目运算符不能单独使用,需要有返回值,否则编译不通过,简单说就是表达式前面要有“=”号,还有一个注意的地方就是“:”两边的表达式返回值不能为空,例如以下代码:
public static void method_if(){
boolean flag = true;
if(flag){
System.out.println("flag is "+flag);
}else{
System.out.println("flag is"+flag);
}
}
千万不能用三目运算符这样写:
flag == true ? System.out.println("flag is "+flag) : System.out.println("flag is"+flag);
原因是System.out.printin()方法返回void,下面给一个代码实例,顺便把类型提升融入进去,‘a’'被提升为int型,
public static void type_promotion(){
int x = 2,y;
System.out.println(y = x > 1 ? 'a' : 200);
}
验证结果:
7,精度范围问题
long a = 3;这句代码有问题吗,乍一看,没有问题,但是它确实有问题,编译器不通过了!问题出在哪呢?
原因出在精度上以及默认的情况各种常量值对应的数值类型!整形默认的是int型,带小数点的默认是double型,精度范围如下:
double > float > long > int > short > byte --> 在没有强制转换的情况下(cast),确保精度不损失是编译通过的必要条件
public static void assignment_statement(){
//正确:byte类型数据范围是-128~127
byte a = 2;
//Type mismatch: cannot convert from int to byte
//byte a1 = -129;
//byte a2 = 128;
//正确:short类型的数据范围是-32768~32767
short s = 30000;
//Type mismatch: cannot convert from int to short
//short s1 =-32769;
//short s2 = 32768;
//Type mismatch: cannot convert from long to int
//int i = 41l;
//Type mismatch: cannot convert from double to int
//int i1 = 3.2;
//Type mismatch: cannot convert from float to int
//int i2 = 3.2f;
//正确
int i4 = 41;
//Type mismatch: cannot convert from double to float
//float f1 = 2.3;
//正确
float f2 = 2.3f;
//正确
double d1 =2.3;
}
8,switch...case..方法
相对于if...else if....else if....else..方法来说,switch更有效率,.switch是计算一次地址值,然后直接跳转到执行语句,相当于索引,而if...else if....else...每个分支都要判断,直到找到符合条件为止,switch可以操作的对象有int,short,byte,char,Enum(boolean,long,string)还不支持。
public static void switch_case_type(){
int x = 1;
switch (x) {
case 1:
System.out.println("int");
break;
default:
break;
}
byte b = 1;
switch (b) {
case 1:
System.out.println("byte");
break;
default:
break;
}
short c = 1;
switch (c) {
case 1:
System.out.println("short");
break;
default:
break;
}
char d = 'a';
switch (d) {
case 'a':
System.out.println("char");
break;
default:
break;
}
//java5之后接受enum类型,
Color color = Color.red;
switch (color) {
case red:
System.out.println("enum");
break;
default:
break;
}
//java7之后接受String类型,自己版本低,无法实现
}
代码验证:
补充:default可以在任何地方。放在第一个位置也可以,但是却是最后一个被执行,如果条件都不满足的话!