总结梳理java八股文及其延展相关知识点(内容来源于各讲解文档的梳理总结)
1.1 byte(8)
8位、有符号(最高位0为+,1为-)的以二进制补码表示的整数 min : -128(-2^7) max: 127(2^7-1) default: 0 对应包装类:Byte 能够表示258(2^8)个数据
1.1.1计算机基础知识补充
<1>计算机存储有符号的整数是都是存储它们的补码。Java语言都是有符号位的。
(所以按照计算机处理1111 1111的过程,首位是1,自然是负数,而且这是补码,那么对应的原码就是,先减1,变成1111 1110,符号位不变,其他取反,变成1000 0001,也就是-1!所以从10000001到11111111依次表示-127到-1)
<2>正数和0的补码、反码是本身原码;所以对于正数来说,可以理解为不存在反码和补码。
<3>负数的反码是是符号位不变,其它位取反;补码是在负数的基础上加1(符号位不变)。
<4>计算机中用补码进行加法运算。
( 在原码、反码、补码相互转换以及求对应的十进制求值时,符号位是绝不参与的,但是在加减过程中,是参与位运算的。)
1.1.2为什么会有补码、反码
反码是为了解决减法运算,补码是为了解决反码产生的±0的问题
1.1.3为什么最小值是-128而不是-127
8位二进制,使用原码或者反码表示的范围是[-127–127],而使用补码表示的范围为[-128~ 127]
那么-128为什么可以用100000000表示?
这里我分析的是byte,它就8位。在无符号位的二进制中128的表示为1000 0000。有符号位的情况下byte好像无法表示+128或-128。
如果我们假设byte不是占用8位,而是9位,最高位是符号位。你们-128的表示为1 10000 0000,计算其补码也是1 1000 0000,很神奇吧,一样的。-128补码尾8位就是1000 0000。那就规定1000 0000是-128的补码,而-128是没有原码和反码的,即不能利用10000 0000反推其反码和原码。
补码产生总结: 1、对于如果大于8位的有符号整数数据类型,-128的补码尾八位刚好是1000 0000 2、比如127(0111 1111)加1(0000 0001)刚好得到-128(1000 0000),-128(1000 0000)加1(0000 00001)等于-127(1000 0001)这样从-128~127的反码首尾相连,形成了一个闭环,就像时钟一样。 3、在计算机中减法运算可以转换成加法运算 ,比如8-1——>8+(-1)——>补码运算:(0000 1000) + (1111 1111) = (0000 0111) 刚好是7。-128+127——>(1000 0000) + (0111 1111) = (1111 1111)刚好是-1,-128的补码完美的适用于减法。 同理byte的最小值-128、short的最小值-32768、int的最小值-2147483648都是用对应的-0的原码来进行表示
1.2 short(16)
16位、有符号的以二进制补码表示的整数 min : -32768(-2^15) max: 32767(2^15 - 1) default: 0 对应包装类:Short
1.3 int(32)
32位、有符号的以二进制补码表示的整数 min : -2,147,483,648(-2^31) max: 2,147,483,647(2^31 - 1) default: 0 对应包装类:Integer
1.4 long(64)
64位、有符号的以二进制补码表示的整数 min : -9,223,372,036,854,775,808(-2^63) max: 9,223,372,036,854,775,807(2^63 -1) default: 0 对应的包装类:Long
2.1float(32)
单精度、32位、符合IEEE 754标准的浮点数 float 在储存大型浮点数组的时候可节省内存空间 浮点数不能用来表示精确的值,如货币 default: 0.0f 对应的包装类:Float
2.2double(64)
双精度、64位、符合IEEE 754标准的浮点数 浮点数的默认类型为double类型 double类型同样不能表示精确的值,如货币 default: 0.0d 对应的包装类:Double
boolean数据类型表示一位的信息 只有两个取值:true 和 false 这种类型只作为一种标志来记录 true/false 情况 对应的包装类:Boolean
char类型是一个单一的 16 位 Unicode 字符 最小值是 \u0000(即为0) 最大值是 \uffff(即为65,535) char 数据类型可以储存任何字符 对应的包装类:Character
5.1自动类型转换
自动类型转换,也称隐式类型转换
转换规则:从存储范围小的类型到存储范围大的类型。
具体规则为:byte→short(char)→int→long→float→double
byte b=10;
short sh=b;
5.2强制类型转换
强制类型转换,也称显式类型转换
转换规则:从存储范围大的类型到存储范围小的类型。
具体规则为:double→float→long→int→short(char)→byte
语法格式为:(转换到的类型)需要转换的值
double d=3.14;
int i=(int) d;
5.3包装类过渡类型转换
xx.intValue(),xx.doubleValue()
5.4字符串与其它类型间的转换
5.4.1其它类型向字符串的转换
①调用类的串转换方法:X.toString(); ②自动转换:X+""; ③使用String的方法:String.volueOf(X);
5.4.2字符串作为值,向其它类型的转换
①先转换成相应的封装器实例,再调用对应的方法转换成其它类型 ②静态parseXXX方法 String s = "1"; byte b = Byte.parseByte( s ); short t = Short.parseShort( s ); int i = Integer.parseInt( s ); long l = Long.parseLong( s ); Float f = Float.parseFloat( s ); Double d = Double.parseDouble( s ); ③Character的getNumericValue(char ch)方法
6.1十六进制整型常量:以十六进制表示时,需以0x或0X开头,如0xff,0X9A。 6.2八进制整型常量:八进制必须以0开头,如0123,034。 6.3长整型:长整型必须以L作结尾,如9L,342L。 6.4浮点数常量:由于小数常量的默认类型是double型,所以float类型的后面一定要加f(F)。同样带小数的变量默认为double类型。 如:float f; f=1.3f;//必须声明f。 6.5字符常量:字符型常量需用两个单引号括起来(注意字符串常量是用两个双引号括起来)。Java中的字符占两个字节。一些常用的转义字符: ①\r表示接受键盘输入,相当于按下了回车键; ②\n表示换行; ③\t表示制表符,相当于Table键; ④\b表示退格键,相当于Back Space键; ⑤\'表示单引号; ⑥\''表示双引号; ⑦\\表示一个斜杠\。
Java有 5种引用类型(对象类型):类 接口 数组 枚举 标注
引用类型:底层结构和基本类型差别较大
JVM的内存空间:
(1). Heap 堆空间:分配对象 new Student()
(2). Stack 栈空间:临时变量 Student stu
(3).Code 代码区 :类的定义,静态资源 Student.class
eg:Student stu = new Student(); //new 在内存的堆空间创建对象 stu.study(); //把对象的地址赋给stu引用变量 上例实现步骤: a.JVM加载Student.class 到Code区 b.new Student()在堆空间分配空间并创建一个Student实例; c.将此实例的地址赋值给引用stu, 栈空间;