Java基础知识整理

1.基本类型

    Java中的基本类型种类,大小以及对应的包装类如下表所示:

基本类型大小最小值最大值包装器类型
boolean-------------Boolean
char16bit\u0000\uffffCharacter
byte8bit-128+127Byte
short16bit-2^15+2^15 - 1Short
int32bit-2^31+2^31 -  1Integer
long64bit-2^63+2^63 -  1Long
float32bitIEEE754IEEE754Float
double64bitIEEE754IEEE754Double
void-------------------Void









    简单数据类型由低级到高级排列如下:(byte,short,char)----int-----long-----float-----double;括号内的同属于一个级别。它们之间的转换可以分为:

    1)自动类型转换。低级的类型变量可以直接转换为高级的类型变量,低级类型为char型,向高级类型转换时,会转换为对应的ASCII码值。对于byte,short,char三种类型而言,它们是相同级别的,因此不能相互自动转换,需要使用强制类型转换。

    byte b; int i=b;long l = b; float f=b;
    short s=100;char c=(char)i; 

    2)强制类型转换:将高级类型变量转换为低级类型变量时,需要使用强制类型转换。这种转换可能会导致溢出或者精度的下降。如下:

    int i=100;byte b=(byte)i;char c=(char)i;

    Java中默认的浮点数为double型,因此在定义float型变量时,需要指定该字面值为float型,否则无法通过编译,如下:

    float f = 1.0; //默认为double型,不能从double转换为float型,编译错误
    float f1 = 1.0f ; //在字面值后加“f”,指示该值为float型,编译通过

    Java中间缓存变量的机制:

public class Test{ 
    public static void main(String[] args){ 
         
        int j = 0; 
        for (int i = 0; i < 100; i++){ 
            j =  j++; 
        } 
         
        System.out.println(j); 
    } 
} 
    该代码输出的结果是:0
    因为java用了中间缓存变量的机制
    j=j++;可换成如下写法。
 temp=j; //j++结果
 j=j+1; //左侧计算完成后自加
 j=temp; //赋值

    所以结果为0;大胆预测前置自增操作的性能要比后置自增操作的性能要好,因为前置自增无需中间变量缓存。

    自增操作和自减操作:(自增和自减类似,这里只说明自增操作)

    Java中自增操作和C中的自增操作由于编译器的差异而表现出很大的差异。观察以下的语句:

int i=0, j=0;
i=i++;
j=++j;
  在Java中执行上述的语句后,i的值不变,还是1;j的值发生了变化,变为了1;  为何会有这样的差异呢?我们可以查看语句对应的字节码来找到答案。"i=i++"对应的字节码,如下:

ILOAD 1   //1指代的是变量i,java编译器为每个局部变量指定一个整形的ID号;该语句加载局部变量i到操作数栈中
IINC 1 1  //该指令给"1"代表的局部变量加1,相当于i加1,执行后i的值为1,注意此时栈顶的值仍然为0
ISTORE 1  //该指令从栈顶弹出一个int型后,存储到"1"代表的局部变量中
    我们可以发现,在加载变量i到栈顶以后,虽然执行了加1的操作,变量i也真正变成了1,但编译器此后没有重新加载变量i的值,导致栈顶的值仍然为未加1之前的值,即为0。因此,到写到变量i中,导致加1后的结果被覆盖为0;再来看看“j=++j"语句的执行,字节码如下:
IINC 2 1 //2代表的是变量j的ID号,首先执行加1操作
ILOAD 2  //将变量j的值加载到栈中
ISTORE 2 //弹出栈顶的值,并存储到变量j中

    我们可以发现,因为他首先执行的是加1操作,然后才加载变量的值,此时变量已经加1,因此最后的结果是加1之后的结果。这就是两个语句结果不一样的原因,加载和加1操作执行的前后关系不一样。

    注意三目运算符(?:)的类型转换:

  System.out.println(false?10.0:9); //该语句最后输出结果为9.0,注意到10.0为double类型,所以Java会自动进行类型的转换,最后条件运算的结果为double型
  System.out.println(false?b:'A'); //输出为65,其中b为byte型变量,'A'为char型,因此两者进行类型转换后为int型
  System.out.println(false?10:'A');//输出为'A',char型。Java编程规范中提:当后两个表达式有一个是常量表达式时,另外一个是类型T时,而常量表达式可以被T表示时,表达式的结果为T类型。这里我们可以用char型表示10,因此输出的结果为char型,即“A”

Java还提供了两个用于高精度计算的类:BigDecimal和BigInteger。BigInteger支持任意精度的整数,可表示任何大小的整数值。BigDecimal支持任意精度的定点数,可用于精确的货币运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值