JavaSE Demo02基础语法


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.0和1.0000在大小上是没有区别的。
  • 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存储的是这个对象的地址值,对象中又存储着字符串常量池中的地址值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值