目录
②当存储范围小的数据类型与存储范围大的数据类型混合运算,会按照范围大的计算
③当byte、short、char数据类型进行算术运算,按照int处理
一、四种进制
1.十进制
正常表示
System.out.println(10);
2.二进制
0b或0B开头
System.out.println(0b10);
3.八进制
0开头
System.out.println(010);
4.十六进制
0x或0X开头
System.out.println(0x10);
二、正负
1byte=8bit
1.表示方式
用最高位数字表示正负,0为正数,1为负数
负数:1000 0001 -1 1000 0000 -128
正数:0000 0000 0 0111 1111 127
2.原码、反码与补码
正数的原码,反码,补码相同
负数:
原码:转化为二进制,最高位取1
反码:除最高位,其余位取反
补码:反码+1
三、JAVA使用的字符集
Unicode字符集
1.转义字符
\n | \r | \t | \\ | \" | \' | \b |
换行 | 回车键 | Tab键 | \键 | "键 | '键 | 删除键 |
四、基本数据类型转换
1.自动类型转换(隐式类型转换)
将取值范围小的类型自动提升为取值范围大的数据类型
取值范围从小到大
byte<short=char<int<long<float<double
①把存储范围小的量赋给存储范围大的变量
public class Translation{
public static void main(String [] args){
double d = 10;
byte b = 130;//损坏 byte∈[-128,127]
long num = 12345;
long bigNum = 12345678912L;//右边超过int范围要加L
}
}
②当存储范围小的数据类型与存储范围大的数据类型混合运算,会按照范围大的计算
③当byte、short、char数据类型进行算术运算,按照int处理
2.强制类型转换
格式:数据类型 变量名 = (数据类型)被强制转换的数据
①把存储范围大的值赋给存储范围小的值,可能会损失精度或溢出
public class Date{
public static void main{
int i = (int)3.14;
double d = 1.2;
int num = (int)d;//损失精度
}
}
②boolean类型不参与转换
③当某个值想要提升数据类型时,也可以使用强制类型转换
public class Date{
public static void main{
int i = 1;
int d = 2;
double shang = (double)i/j;//无风险
}
}
3.特殊的数据类型转换
①任意数据类型与String类型数据进行“+”运算时
输出结果一定是String类型(其他类型在前先按其他类型运算方式计算)
public class Translation{
public static void main(String [] args){
System.out.println("" + 1 + 2);//12
System.out.println(5 + 10 + "abc");//15abc
}
}
可以通过""+……将其他类型的数据转化为String类型
②String类型不能通过强制类型转换转化为其他类型
五、运算符
1.算术运算符
+ | - | * | / | % | ++ | -- |
正/加/字符串连接 | 负/减 | 乘 | 除(取整) | 取余(取模) | 自增 | 自减 |
除数不能为0 如果不能整除,会自动舍弃小数部分 | 结果的正负与被模数正负一致,结果可能是小数 | ++在前,先运算后取值 a=2;b=++a a是3,b是3 ++在后先取值后运算 a=2;b=a++ a是3,b是2 | --在前,先运算后取值 a=2;b=--a a是1,b是1 --在后,先取值后运算 a=2;b=a-- a是1,b是2 |
2.赋值运算符 =
运算方向:从右到左
例:n += (n++) + (++n)
public class Give{
public static void main(String[] args){
int n = 10;
n += (n++) + (++n);
// 实际运行的结果是32
System.out.println(n);
}
}
借助字节码文件的分析:javap -c Give.class
public class Give {
public static void main(String[] args){
//short s = 2;
//①,错误:不兼容的类型,从int转换为short可能会有损失
//原因:byte、short、char做数学运算时就自动转换为int类型
//s+2是int类型
//s = s + 2;
//②,编译通过,说明+=有自动的类型转换
/* s += 2;
System.out.println(s);
int i = 1;
i *= 0.1;
System.out.println(i);
i ++;
System.out.println(i); */
/* int m =2;
int n = 3;
先取m=2,计算“n*=m”,再计算++
n *= m++;
System.out.println("m=" + m);
System.out.println("n=" + n); */
/*
0: bipush 10
2: istore_1 将10赋值给n
*/
int n=10;
/*
3: iload_1 读取变量n的值 [10+?]
4: iload_1 读取变量n的值 [10+10]
5: iinc 1, 1 执行自增1 n从10变成11
8: iinc 1, 1 执行自增1 n从11变成12
11: iload_1 读取变量n的值,n为12
12: iadd 执行加法10+10=20
13: iadd 执行加法12+20=32
14: istore_1 把最后一个加法的值32赋给n
*/
n += (n++) + (++n);
System.out.println(n);
}
}
除+=还有-=、*=、/=、%=
3.比较运算符
最终返回布尔值true/false
== | != | < | > | <= | >= | instanceof |
是否等于 | 是否不等于 | 是否小于 | 是否大于 | 是否小于等于 | 是否大于等于 | 是否是类的对象 |
public class Compare{
public static void main(String[] args){
System.out.println(5 == 6);
System.out.println("Hello" instanceof String);
boolean b1 = false;
if(b1 == true){
System.out.println("结果是真的");
}else{
System.out.println("结果为假");
}
}
}
4.逻辑运算符
& | && | | | || | ! | ^ |
逻辑与 | 短路与 | 逻辑或 | 短路或 | 取反 | 异或 |
前面即使判断出结果,后面还会执行 | 有短路效果 只要前面的表达式为false,整体就是false,后面不执行 | 前面即使判断出结果,后面还会执行 | 带短路效果 只要前面的表达式为true,整体就是true,后面不执行 | 相同为false 不同为true |
5.位运算符(二进制)
符号 | 含义 | 规则 | 例子 |
<< | 左移 | 空位补0,被移除的高位丢弃,空缺位补0 | 3<<2 12 |
>> | 右移 | 当最高位是0,右移后,空缺位补0 当最高位是1,右移后,空缺位补1 | 4>>1 2 |
>>> | 无符号右移 | 被移位二进制最高位无论是0或者是1,空缺位都用0补 | 3>>>1 1 |
& | 按位与 | 二进制位进行&运算,只有1&1时结果是1,否则是0 | 6&3 2 |
| | 按位或 | 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1 | 6|3 7 |
^ | 按位异或 | 二进制位相同是0,二进制位不同是1 | 6^3 5 |
~ | 按补码取反 | ~6 -7 |
6.三元运算符
格式:(条件表达式)?表达式1:表达式2;
true,结果为表达式1
false,结果为表达式2
public class Give{
public static void main(String[] args){
int i = 30;
int j = 20;
String result = (i>j)?"i比j大":"i比j小";
}
}
六、流程控制
1.顺序结构
使用scanner对象从控制台读取数据
导入scanner类
import java.util.Scanner;
// 导入Scanner类
import java.util.Scanner;
public class Demo16Scanner {
public static void main(String[] args){
// 1.创建Scanner对象
Scanner scanner = new Scanner(System.in);
// 2.读取int类型数据
System.out.print("请输入一个整数:");
// 调用scanner对象的nextInt()方法
int age = scanner.nextInt();
System.out.println("age="+age);
// 3.读取boolean类型数据
System.out.print("请输入一个布尔值:");
boolean flag = scanner.nextBoolean();
System.out.println("flag="+flag);
// 4.读取字符串
System.out.print("请输入一个字符串:");
// next()方法会因为空格而终止读取
String strValue = scanner.next();
System.out.println("strValue="+strValue);
// 建议使用:
// nextLine()方法不会因为空格而终止读取
strValue = scanner.nextLine();
System.out.println("strValue="+strValue);
}
}
2.分支结构
①if语句
// 创建Scanner对象
Scanner scanner = new Scanner(System.in);
public class If{
public static void main(String[] args){
System.out.print("请输入i:");
int i = scanner.nextInt();
System.out.print("请输入j:");
int j = scanner.nextInt();
// 测试使用单独的if语句
// 当if(判断条件)为true时执行{}中的语句
if (i > j){
System.out.println("i 比 j 大");
}
}
如果if语句块中只有一条语句,可以省略{}
import java.util.Scanner;
public class If{
public static void main(String[] args){
//创建scanner对象
Scanner scanner = new Scanner(System.in);
System.out.print("请输入i:");
int i = scanner.nextInt();
System.out.print("请输入j:");
int j = scanner.nextInt();
//省略{}
if (i < j)
System.out.println("i 比 j 小");
System.out.println("后续操作");
}
}
对于布尔值
import java.util.Scanner;
public class If{
public static void main(String[] args){
// 读取一个布尔值
System.out.print("请输入flag:");
boolean flag = scanner.nextBoolean();
// 没有必要写flag == true
if (flag) {
System.out.println("flag是真的");
}
}
}
②if…else语句
③if…else if…else语句
④if…else嵌套
import java.util.Scanner;
public class If{
public static void main(String[] args){
//创建scanner对象
Scanner scanner = new Scanner(System.in);
System.out.print("请输入i:");
int i = scanner.nextInt();
System.out.print("请输入j:");
int j = scanner.nextInt();
if (i > j){ // 执行条件判断①
System.out.println("i 比 j 大"); // ①为true时执行
} else if (i < j) { // ①为false继续执行下一个条件判断②
System.out.println("i 比 j 小"); // ②为true时执行
} else {
System.out.println("i 和 j 相等"); // ②为false时执行
// 嵌套在其他if...else结构内的if
if (m > n){
System.out.println("m 比 n 大");
}
}
}
}
⑤switch…case语句
switch可选值:
byte、short、int、char、枚举、String
case:
子句中指定值必须是常量且互不相同
default:
当case都不满足,则执行default分支
位置灵活
可写可不写
break:
跳出循环
import java.util.Scanner;
public class Demo18SwitchCase {
public static void main(String[] args){
// 创建Scanner对象
Scanner scanner = new Scanner(System.in);
System.out.print("请输入季节:");
String season = scanner.nextLine();
// 使用season变量的值和后面的case依次进行比较
// 遇到一个满足条件的case,那么后面的都会被执行,包括default分支
// 除非在某个case中使用了break关键字,停止了case的执行。
switch(season){
case "spring":
System.out.println("我喜欢春天");
break ;
case "summer":
System.out.println("我喜欢夏天");
break ;
case "autumn":
System.out.println("我喜欢秋天");
break ;
case "winter":
System.out.println("我喜欢冬天");
break ;
// 当前面每一个case都不匹配时执行default分支(默认分支)
default:
System.out.println("我喜欢梅雨季节");
}
}
}
3.循环结构
①for循环
判断条件必须是布尔类型,当结果为false时循环结束
for(声明变量;循环过程中判断条件;变量循环累加){
表达式;
};
打印十次Hello
public class For{
public static void main(String[] args){
for(int i = 0;i < 10;i++){
System.out.println("Hello");
};
}
}
1~100偶数求和
public class Count{
public static void main(String[] args){
int sum = 0;
for(int i = 0;i < 100;i++){
if(i % 2 == 0){
sum += i;
};
};
System.out.println(sum);
}
}
②whil循环
while(判断条件){
循环体;
};
表达式;
例:世界最高山峰是珠穆朗玛峰,它的高度是8844.43米,假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
public class Mount{
public static void main(String[] args){
double h1 = 88444300;
double h2 = 1.0;
//声明一个变量用于统计折叠次数
int count = 0;
//声明一个变量用来保存折叠后的厚度
double thick = h2;
while(thick <= h1){
//折一次厚度翻倍
thick *= 2;
//折叠次数加一
count++;
}
System.out.println("最终纸的厚度为" + thick);
System.out.println("最终折叠次数为" + count);
}
}
③do…while循环
do{
循环体
}while(判断条件);
表达式;
例:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
import java.util.Scanner;
public class Number{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
//输入整数
System.out.print("请用户输入整数:");
int a = scanner.nextInt();
//声明一个变量来保存正数的个数
int count1 = 0;
//声明一个变量来保存负数的个数
int count2 = 0;
do{
if(a > 0){
count1++;
}
if(a < 0){
count2++;
}
System.out.println("正数的个数是" + count1);
System.out.println("负数的个数是" + count2);
System.out.print("请用户输入整数:");
a = scanner.nextInt();
}while(a != 0);
}
}