文章目录
1.Java创始人 JameGosling詹姆斯高斯林
2.原码 反码 补码
- 正数的原码反码补码都相同
- 例如正数6原码为0110 反码0110 补码0110
- 正数和负数在存储时以补码存储
- 负数的反码为原码除符号位外 其他各位全部取反(0变1,1变0)
- 负数的补码为原码完成取反后加1,也就是负数的反码加1
- 例如:
- 负数-6原码为1000 0110
- 负数-6反码为1111 1001
- 负数-6补码为1111 1010
3.栈 堆 方法区
3.1栈
- 存取速度快
- 数据可以共享
- 数据大小和生命周期必须确定,不够灵活
3.2堆
- 运行时数据区
- 运行时动态分配内存
- 自动回收垃圾
- 存取速度较慢
3.3方法区
- 用来存储类型信息
- 常量池:用来存储某类型的常量信息(常量池在方法区中)
4.基本数据类型(1字节byte = 8位bit)
- 类型 长度 默认值
- byte 1字节 0
- short 2字节 0
- int 4字节 0
- long 8字节 0
- float 4字节 0.0
- double 8字节 0.0
- char 2字节 \u0000
- boolean 1字节 false
5.数据类型转换
5.1自动类型转换
- 从小到大自动转:
- byte->short->int->long->float->double
- char->int->long->float->double
5.2隐式转换(小转大)
从范围小的类型转换为范围大的类型
5.3显式转换(大转小)强制转换
- 语法:目标类型 转换后的变量=(目标类型)变量或值;
- 注意:数值类型和boolean类型无法转换,强转也不行
6.float和double的大小比较
- 1.0F 1.0D相比较 肯定是1.0D比较大,因为double的精度高
- 0.3F 0.3D相比较 却是0.3F比较大,这是因为float和double的存储有差异。
- float是4字节,32位(1位符号位,8位指数位,23位尾数部分)
- double是8字节,64位(1位符号位,11位指数位,52位尾数部分)
- 二进制在表示小数时,采用了零舍一入的规则。
- float和double都有一个隐含整数位,第24位和第53位
- float第24位由零舍一入得到,double第53位由零舍一入得到
- float进一位比double进一位要大的多,所以float更大
7.十进制小数转为二进制
- 十进制0.2 --> 二进制0.0011001
- 步骤如下:(取整数部分,用小数部分继续乘2,直到小数部分为0)
- 0.2 X 2 = 0.4 0
- 0.4 X 2 = 0.8 0
- 0.8 X 2 = 1.6 1
- 0.6 X 2 = 1.2 1
- 0.2 X 2 = 0.4 0
- 0.4 X 2 = 0.8 0
- 0.8 X 2 = 1.6 1
8.位运算符
8.1与 &
- 15&6 结果为6 为什么呢?
- 运算时以二进制数进行运算
- 15的二进制为1111
- 6的二进制位0110
- 二者进行"“与”"运算,1&0 为0,1&1 为1,0&0 为0
- 结果为 0110 所以 15&6 结果为6
8.2异或 ^
- 当符号左右两侧不相等时返回1 相等返回0
8.3取反 ~
- ~6 对正数6进行取反,结果为 -7 为什么呢?
- 6的二进制数为 0000 0110
- 计算机中,正数负数都是以补码形式存储的
- 6为正数,补码也为0000 0110
- 取反得到 1111 1001
- 系统认定这是负数的补码
- 负数的补码转换为原码即为输出结果
- 即减一,然后再除符号位外各位取反
- 减一得到 1111 1000
- 除符号位外各位取反 1000 0111
- 即 -7
8.4左移位 <<
- m<<n 表示m左移n位 即m乘2的n次方
- 例如: 16<<2 表示16左移2位,即16乘2的2次方 也就是16乘4 结果为64
8.5右移位 >>
- m>>n 表示m右移n位 即m除2的n次方
- 例如: 16>>2 表示16右移2位,即16除2的2次方 也就是16除4 结果为4
8.6无符号右移位 >>>
- 正数的无符号右移与普通的右移没有区别,我们主要说说负数的无符号右移
- -16>>>3 表示负数 -16右移3位 我们猜结果应该为-2 但是结果却为536870910
- 为什么相差这么多?
- 首先我们要知道,整型数据int的长度为4字节,也就是32位
- -16的二进制原码为 1000 0000 0000 0000 0000 0000 0001 0000
- 正数负数都是以补码形式存储的
- -16的二进制补码为原码除符号位外各位取反 并 加1
- 也就是 1111 1111 1111 1111 1111 1111 1111 0000
- 无视符号进行右移3位变为了
- 1111 1111 1111 1111 1111 1111 1111 0
- 右边的3个0被挤掉了,为了保证32位,系统自动在左侧添加上3个0
- 000 1111 1111 1111 1111 1111 1111 1111 0
- 也就是
- 0001 1111 1111 1111 1111 1111 1111 1110
- 转换为十进制数 就是结果536870910
8.7短路与 && 短路或 ||
- 短路与 && 如果符号左侧为假,则不再执行符号右侧的内容
- 短路或 || 如果符号左侧为真,则不再执行符号右侧的内容
- 因为与&是左右两侧有一个为假时,结果为假
- 因为或&是左右两侧有一个为真时,结果为真
- 当你使用了短路与或,就是告诉系统,你可以偷懒了
9.三元运算符
- 语法:判断条件?表达式1:表达式2
- 例1: a>b?正确:错误
- 意思就是 a>b如果为true,返回正确;如果为false,返回错误
- 例2: int max = m>n?m:n;
- 意思就是 m>n如果为true,将m的值赋给max;如果为false,将n的值赋给max
10.创建字符串的两种方式
//字符串的两种创建方式
String str1 = "HelloWorld";
String str2 = new String("HelloWorld");
System.out.println(str1==str2);
请你猜一下输出结果
正确答案:false
两个字符串明明都是HelloWorld,为什么结果却是false呢?
原因:
(1)首先我们要知道,引用类型在使用"=="符号进行比较时,比较的是地址值
(2)通过双引号直接创建str1和通过创建字符串对象创建str2存储的地址值是不同的。
(3)下面请看两种情况的内存图(图中的地址值只是为了便于理解,并非真正的地址值)
备注:str1和str2存储的地址值不同,str1存储的是字符串常量池中HelloWorld的地址值,str2存储的是这个对象的地址值,对象中又存储着字符串常量池中的地址值。