最近确实有点忙,但也反思了很多东西,学的东西很多,ssh,设计模式,hadoop等等,什么样的基本都学了,追求学的东西多,但是却也明白了一个道理,盲目的学习并不一定好,当然我也不是说学习这些东西不好,只是我们需要对于基础知识的把我握更加更牢固一点,学了一个东西,必须知道,为什么要选择他,他有什么好处,有什么坏处,我们从中又能够学习到什么,糊里糊涂的还没明白一个东西能够干什么,就开始用,那样就有点多学无益了,这是本人的一些总结,希望能够帮助你,下面,话不多说,我们聊下java的基本类型。
java的基本类型分为四大类,八种,分别是整型,浮点型,逻辑型,字符型
整型:
byte short int long
浮点型
float double
逻辑型
boolean
字符型
char
既然知道java的八种基本类型了,我们不能就只限于基本知道吧。那么我们拿int来聊。
当我们需要一个无穷大的数的时候,我们有的人会这么做:
int a=Integer.MAX_VALU 或者 int a=(int) Math.pow(2, 100);
但是有没有想过,他真的是无穷大呢?
当我们出错的时候,发现a的最大值总是2147483647,即2^31-1,这是为什么呢?明明定义了2^100。
这就需要我们了解到int 默认支持4个字节,每个字节表示8个位,位是二进制的最小单位。
换句话说我们可以把int的最大值表示为0111 1111 1111 1111 1111 1111 1111 1111,16进制表示为:0x7fffffff;
这就是我们所说的2^31-1,那为什么不是2^32-1呢,这就牵扯到二进制位的最高一位为符号位,0代表正数,1代表负数,
那么我们的最小值呢?是多少呢?会是-(2^31-1)么?不少人会这么推测,但是事实却是-2^31,为什么呢?这就牵扯到我们二进制的知识。
负数的二进制一般用补码表示,int的最小值为1000 0000 0000 0000 0000 0000 0000 0000,16进制为0x80000000,
对二进制不熟的人会认为int最小值那不是出了最高a位的符号位外,就是0么,但是我们零的表示为0000 0000 0000 0000 0000 0000 0000 0000。
因此我们可以把他当成一个特殊来对待,即源码和补码一样,所以int的最小值为-2^31,另外我说下二进制的补码怎么求。
正数的补码是他本身,负数的补码是先得出正数的二进制,然后取反,即0变成1,1变为0,在最后一位再加1.
说到这里了,就需要整体来总结一下了。
整型:
byte 1字节 short 2字节 int 4字节 long 8字节 float 4字节 double 8字节 boolean 1字节 char 2字节
取值范围:
byte(-2^7---2^7-1)<pre name="code" class="html"><pre name="code" class="html">short(-2^15---2^15-1)
int(-2^31---2^31-1)<pre name="code" class="html">long(-2^61---2^61-1)
浮点型
float(-2^31---2^31-1)
double(-2^61---2^61-1)
逻辑型
boolean(-2^7---2^7-1)
字符型
char(-2^15---2^15-1)
下面我们说下java和基本类型有关的一些知识。大家都知道java的传递类型包括引用传递和值传递吧,不知道的该面壁了,
那么什么时候是引用传递,什么时候是值传递?下面举个例子:
public void testD(){
int a=10;
print(a);
System.out.println("a:"+a);
}
public void print(int a){
a=100;
}
这个a的输出大家会毫不犹豫的说是10;但是下面的这个呢?
public void testD(){
int[] a={1,2,3,4,5};
print(a);
System.out.println("a:"+a[0]);
}
public void print(int[] a){
a[0]=100;
}
这个的输出貌似就没有那么简单了,可能会有一部分人觉得这个输出是1,实际是100;这就是引用传递和值传递。
那么什么时候是引用传递,什么时候是值传递,一般情况来说,java的基本类型是值传递,其余的是引用传递。
当然也有别人说java只有值传递,不过不妨碍大家理解。
这个又牵扯到jvm的设计了,即常量池,堆和栈,就不一一细说了。就到这里了,希望对我有帮助的对你也有帮助,
助人助己。