一、数字存储
-
数据在计算机底层都是使用二进制存储的。
-
快速计算一个数据的二进制形式的方法是除二取余法。
-
-
数据在计算机底层存储的基本单元是字节(byte,B)。
-
数据在计算机底层存储的最小单位是比特(bit,b)。
-
1B=8bit
二、文字存储
-
字符存的是ASCII编码表中对应的数字的二进制形式。
-
字符‘0’对应的数字是48。
-
字符‘A’对应的数字是65。
-
字符‘a’对应的数字是97。
-
图片、声音、视频等等 内容在计算机中都是想办法转为二进制存储的。
三、类型转换
数据类型 | 数据范围 | 占用字节(B) |
---|---|---|
byte 整型 | -128~127 | 1 |
short 整型 | -32768~32767 | 2 |
int (默认) 整型 | -2147483648~2147483647 (10位数,大概21亿多) | 4 |
long 整型 | -9223372036854775808~ 9223372036854775807(19位数) | 8 |
float 浮点型 | 1.401298 E -45 到 3.4028235 E +38 | 4 |
double(默认) 浮点型 | 4.9000000 E -324 到1.797693 E +308 | 8 |
char 字符型 | 0~65535 | 2 |
boolean 布尔型 | true、false | 1 |
3.1 自动类型转换
类型范围小的变量,可以直接赋值给类型范围大的变量。
byte a = 12;
int b = a;
System.out.println(b);//12
3.2 表达式的自动类型转换
在表达式中,小范围类型的变量,会自动转换成表达式中较大范围的类型,再参与运算。
-
表达式的最终结果类型由表达式中的最高类型决定。
-
在表达式中,byte、short、char是直接转换成int类型参与运算的。
3.3 强制类型转换
强行将类型范围大的变量、数据赋值给类型范围小的变量。
*数据类型 变量2 = (数据类型)变量1、数据
注意:
-
强制类型转换可能会造成数据的丢失(溢出)。
-
浮点型强转成整型,直接丢掉小数部分,保留整数部分返回。
int a = 20;
byte b = (byte)a;//强制类型转换
System.out.println(b);//20
//强转会造成数据的丢失(溢出)
int i = 1500;
byte j = (byte)i;
System.out.println(j);//-36
//3.小数转整数
double a3 = 3.14;
int b3 = (int)a3;
System.out.println(b3);
//4.
byte a2 = 5;
byte b2 = 6;
byte c2 = (byte)(a2+b2);
System.out.println(c2);
四、(重点)运算符
4.1 基本的算术运算符
符号 | 作用 | 说明 |
---|---|---|
+ | 加 | 可做连接符,能加就加,不能加就连在一起 |
- | 减 | |
* | 乘 | |
/ | 除 | 在Java中两个整数相除结果还是整数 |
% | 取余 | 获取的是两个数据做除法的余数 |
public class Demo1 {
public static void main(String[] args) {
int a = 10;
int b = 3;
//能加就加,不能加就连接在一起
System.out.println("hello"+a+b);//hello103
System.out.println(a-b);//7
System.out.println(a*b);//30
System.out.println(a/b);//3
System.out.println(a%b);//1
}
}
练习:数值拆分
/*
* 求x的个十百千......位数值
* 个位:a%10
* 十位:a/10%10
* 百位:a/100%10
* 千位:a/1000%10
* ......
* */
public class Demo2 {
public static void main(String[] args) {
int b = 9098;
int qian = b/1000%10;
int bai = b/100%10;
int shi = b/10%10;
int ge = b%10;
System.out.println(b+"的个位是" + ge);
System.out.println(b+"的十位是" + shi);
System.out.println(b+"的百位是" + bai);
System.out.println(b+"的百位是" + qian);
}
}
4.2 自增自减运算符
符号 | 作用(只能操作变量,不能操作字面量) |
---|---|
自增:++ | 放到某个变量的前面或后面,对变量自身的值加1 |
自减:-- | 放到某个变量的前面或后面,对变量自身的值减1 |
注意事项:
-
单独使用:++、--放到某个变量的前后面效果一样
-
不单独使用(表达式、打印):自增、自减在变量前后效果不同
变量前:++a:先对变量+1,在使用
例如:int a =10;int b = ++a;//a=11,b=11
变量后:a++:先使用变量,再对变量+1
例如:int a =10;int b = a++;//a=11,b=10
/*
自增(++)自减(--)
*/
public class Demo3 {
public static void main(String[] args) {
//单独使用
int a1 = 10;
a1++;
++a1;
System.out.println(a1);//12
//变量前:先操作,在使用
int a2 = 10;
int b2 = ++a2;//a2 = a2 + 1;int b2 = a2;
System.out.println(b2);//11
//变量后:先使用,在操作
int a3 = 10;
int b3 = a3++;//int b3 = a3; a3 = a3 + 1
System.out.println(b3);//10
int a4 = 10;
System.out.println(a4++);//10 sout(a4); a4 = a4 + 1;
}
}
4.3 赋值运算符
1.基本赋值运算符: =符号含义: 把右边的值赋值给左边的变量 2.扩展赋值运算符: += -= *= /= %=符号含义:将右边的数据和左边的变量相加、相减、相乘、相除、取余数后,将结果重新赋值给左边的变量。
符号 | 用法 | 作用 | 底层代码形式(内部对运算结果进行强制转换) |
---|---|---|---|
+= | a+=b | 加后赋值 | a=(a的类型)(a+b) |
-= | a-=b | 减后赋值 | a=(a的类型)(a-b) |
*= | a*=b | 乘后赋值 | a=(a的类型)(a*b) |
/= | a/=b | 除后赋值 | a=(a的类型)(a/b) |
%= | a%=b | 取余后赋值 | a=(a的类型)(a%b) |
//扩展赋值运算符,内部对运算结果进行强制转换
byte by = 4;
//by = by + 1;报错,因为byte会直接转换为int型再参与运算
by+=1;//等价于by = (byte)(by+1),添加了强转,所以不会报错
扩展赋值运算符的作用是什么?有什么特点
-
+=可以实现数据的累加,把别人的数据加给自己。
-
扩展的赋值运算符自带强制类型转换。
4.4 关系运算符
符号 | 例子 | 作用 | 结果 |
---|---|---|---|
> | a>b | 判断a是否大于b | 成立返回true、不成立返回false |
>= | a>=b | 判断a是否大于或者等于b | 成立返回true、不成立返回false |
< | a<b | 判断a是否小于b | 成立返回true、不成立返回false |
<= | a<=b | 判断a是否小于或者等于b | 成立返回true、不成立返回false |
== | a==b | 判断a是否等于b | 成立返回true、不成立返回false |
!= | a != b | 判断a是否不等于b | 成立返回true、不成立返回false |
注意:在Java中判断是否相等一定是“==”,千万不要把“==”误写成“=”
4.5 逻辑运算符
符号 | 叫法 | 例子 | 运算逻辑 |
---|---|---|---|
& | 逻辑与 | 2 > 1 & 3 > 2 | 多个条件必须都是true, 结果才是true; 有一个是false,结果就是false |
| | 逻辑或 | 2 > 1 | 3 < 5 | 多个条件中只要有一个是true, 结果就是true; |
! | 逻辑非 | ! (2 > 1) | 就是取反:你真我假,你假我真。!true == false、!false == true |
4.6 短路运算符(效率更高)
符号 | 叫法 | 例子 | 运算逻辑 |
---|---|---|---|
&& | 短路与 | 2 > 10 && 3>2 | 判断结果与“&”一样,过程不同:左边为 false**,右边则不执行。** |
|| | 短路或 | 2 > 1 | | 3 < 5 | 判断结果与“|”一样,过程不同:左边为 true**, 右边则不执行。** |
int a = 3;
int b = 0;
int b1 = 0;
System.out.println(a > 4 & b++ > 0);//左边false,右边继续不执行
System.out.println(b);//1
System.out.println(a > 4 && b1++ > 0);//左边false,右边短路不执行
System.out.println(b1);//0
4.7 三元运算符
三元运算符格式:
关系表达式 ?值1 : 值2
三元运算的执行流程:
首先计算关系表达式的值,如果关系表达式的值为true,则返回值1;
如果关系表达式的值为false, 则返回值2;
// 需求3:找3个整数中的较大值。
int i = 10;
int j = 45;
int k = 34;
// 找出2个整数中的较大值。
int temp = i > j ? i : j;
// 找出temp与k中的较大值。
int max2 = temp > k ? temp : k;
System.out.println(max2);
4.8 运算符的优先级
&&的优先级大于||
//这里&&先算 相当于 true || false 结果为true
System.out.println(10 > 3 || 10 > 3 && 10 < 3); // true
五、获取用户键盘输入的数据
【第1步】:在class类上导包:一般不需要我们自己做,idea工具会自动帮助我们 导包的。
import java.util.Scanner;
【第2步】:得到一个用于键盘扫描器对象(照抄代码就行,固定格式)
//Scanner是键盘扫描器对象(你就把它理解成一个东西),这个东西有录入的功能
//sc是给这个东西取的名字
Scanner sc = new Scanner(System.in);
【第3步】:开始调用sc的功能,来接收用户键盘输入的数据。
//next() : 获取键盘输入的字符串
//nextInt() : 获取键盘输入的整数
int age = sc.nextInt();
System.out.println("我的年龄是:"+age);
String name = sc.next();
System.out.println("我的姓名是:"+name);
关于昨天的JDK组成补充:JVM+核心类库=JRE,JRE+开发者工具=JDK。