今日重点 进制数,原码,反码,补码,switch分支语句
一.进制
1.进制定义
在java中可以把不同进制的数赋给变量,最终输出结果是十进制数字.
2.十进制
满十归零进一
数字取值范围0-9
前缀:无
后缀:d/D
3.二进制
在计算机中所有内容存储都只能取值0和1,也就是说计算机中所有的内容都是以二进制进行存储
满二归零进一
前缀:以0b/0B开头
后缀:B
4.二进制转十进制
方法:权相加法
5.十进制转二进制
方法:除二取余,逆序排列
6.八进制
满八归零进一
取值范围0-7
前缀:以0开头
后缀:O/Q
7.十六进制
满十六进一
取值范围0-9 A-F
前缀:以0x/0X开头
后缀:H
8.数据存储单位
1.数据存储的地方有两个:一个是内存(临时存储)一个是硬盘(持久存储),
以二进制(0和1)的形式进行保存,二进制中每位0/1都称为1bit(位).
2.最基本的存储单位是byte
3.最小的存储单位是bit
4.单位转换
1byte=8bit
1kb=1024byte
1mb=1024kb
1GB=1024mb
1TB=1024GB
1PB=1024TB
9.q&a
在二进制中8bit最大数是255(1111 1111),那为什么byte(一个字节)是-128~127呢?
因为计算机中存储单位时,为了表示有符号数字,最高位用来表示正负.
0表示正数,1表示负数.所以1byte最大数据是0111 1111 为127.
为什么byte最小取值数为-128?
就是因为正常8bit数字取值范围0~255共256个数字,而我们为了存储正负数首位表示符号位,正数127,负数部分应该为256-127=129,应该从-128~0,因此符号位为1剩下七位全是0.
这就是为什么byte取值为-128~127的原因.
10.二进制什么时候有符号位,什么时候没有符号位
如果是八位数字---如果要是最大的话那么他这八位必须全是1,极限了所以没有符号位,但是为了区分正数范围和负数范围才引入了符号位
二.short类型
1.short
取值范围-32767~32768
所占字节数:2个字节
11.java八大基本数据类型所占空间总结
需要注意的点:boolean在jvm规范里面没有明确的空间占用
三.char
1. char类型
1.字符类型
2.该类型可以存储一个字,这个字可以是字母,中文,数字..
3.无论存储什么内容都会对应unicode中的一个字符编号
4.语法:
char 变量名='值';
2.char和int的转换
package com.bjsxt;
public class Test01 {
public static void main(String[] args) {
char c='a';
int n=c;
System.out.println(c);//输出的是字符a
System.out.println(n);//输出的是97
System.out.println((int)c);//本来接受的是字符型现在我想转换成整数型,最终输出的是97
}
}
3.ascii码和Unicode
1.ascii码
在计算机刚出现时,主要是英语语言。所以支持英文字母和一些符号即
可。研究出了128个支持的字符,并且给每个字符都设定了一个字符编号(编号0~127)。
但是随着计算机发展,需要支持各种语言,显然ASCII码已经无法满足要
求,各国都有对ASCII码的补充。
我国的简体中文编码GB2312就是对ASCII的补充。它保留了ASCII码
的内容,从127往后开始进行映射,占用两个字节,这样就大约多出7000
左右常用汉字。因为GB2312中除了中文以外还有各种符号等都占用了两个
字节,所以这就是我们在输入法时的全角(全角是在中文状态下输入的,占用两个字
节)。而GB2312中保留的ASCII
内容称为半角(半角是在英文状态下输入的,占用一个字节)。但GB2312中收录的都
是简体中文,没有收录繁体
字,所以这时就出现了big-5。但是为了收录一些不太不太常用的文
字,把GB2312中没有利用好的编码利用起来,又推出了GBK编码,多
了大约20000多个汉字。后来又为了支持一些少数民族的文字,又推出了
GB18030.
随着各个国家都在推出自己的编码表,全球所有的编码表特别混乱,为了
解决这个局面,推出了Unicode。Unicode称为万国码。里面支持绝大多
数国家语言。每个语言中文字都对应Unicode中的一个字符,且每个字符
都有自己的编号。Unicode 目前规划的总空间是17个平面(平面0至
16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。Unicode主
要是字符到编码的映射,所以Unicode更准确应该叫字符集。
在Unicode中字符占用两个byte。但是显然字符a=97,还占用两个字节就
是不合理的,有很多浪费。为了解决这个浪费空间就研究出了UTF-8编
码。
UTF-8 为可变长度编码。根据内容的不同,所占byte也不同。
UTF-8可分配 1字节 2字节 3字节(汉字) 4字节
常说的出现中文乱码指的是编码和解码使用的不是同一种方式
四.Java八大基本数据类型以及对应的封装类
1.封装类
为什么要有封装类?
因为类中提供了方法,而我们可以利用这些方法实现某些功能。而八大基本数据类型的变量是不能调用方法
2.八大基本数据类型对应的封装类
3.封装类创建对象的语法
语法:
类型 对象名=new 类型(值);//Java9以后过期
类型 对象名=类型.valueOf(值);
类型 对象名=值;
除了character的值不支持String类型,只支持自己本身的类型之外,其他七种都支持
五.十进制,二进制,八进制的转换
1.十进制转二进制
方法:Integer.toBinaryString();//括号里面最好是字符串,如果是int类型要注意整数溢出的问题
2.十进制转八进制
方法:Integer.toOctalString();
3.十进制转换成十六进制
方法:Integer.toHexString();
4.获取一下integer类型的最大值
int a=Integer.MAX_VALUE;
5.获取一下integer类型的最小值
int b=Integer.MIN_VALUE;
六.原码,反码,补码
1.原码:
原则:就是二进制数
计算机中数据存储最高位作为符号位,0为正数,1为负数
正数与正数相加
2.补码
原则:正数->补码与原码相同
负数->反码+1
解决:负数+负数的问题
tips:计算机中存储的都是补码.
3.反码
原则:正数->反码与原码相同
负数->符号位不变,其他位按位取反
解决正数与负数相加结果不准确的问题
七.位移运算符
1.左位移
1.<< 向左移动一位数字就会在前一个数字的基础之上扩大一倍
2.正数,负数对于数字没有没有改变,只是符号的改
0000 0000 0000 0000 0000 0000 0000 0010---->2
0000 0000 0000 0000 0000 0000 0000 00100---->4
2.右位移
1.>> 向左移动一位数字就会在前一个数字的基础之上缩小一倍,如果出现小数只取整数部分
2.负数.向上取整
3.无符号右位移
1.>>> 无符号右移是无论数字为正数和负数,右移时左侧都补0.
正数:和右位移一样,除以2的n次方,最小为0
负数:右移会变大,随着移动位数的增多,最后变成1.
不能操作浮点数,因为计算机底层是二进制
八.位运算符
1.按位与 &
全1为1,否则为0
2.按位或 |
有1为1,全0为0
3.按位异或^
相同为0,不同为1
4.按位非~
按位取反(包括符号位)
九.switch
switch支持什么类型:byte、short、int、char、Byte、Short、Integer、Character、String、enum(枚举) 分支判断与if-else if-else比较像
语法://有break场景
switch(类型变量名){
case 值:
java代码;
break;
case 值:
java代码;
break;
default:
java代码;
}
//case之后支持多个值(新特性)
public static void main(String[] args) {
int i = 1;
switch (i) {
case 1,2,3,4:
System.out.println("1,2,3,4");
break;
default:
System.out.println("default");
}
}
java17新特性:我们可以在case值后面紧跟->
并且省略break来实现。
新特性强调: 前后是否有空格都可以。但是
-
和>
这两个符号不能分开写 这种带有break的功能,触发一个条件switch执行结束。如果明确提供break会报错。 不允许case 1-> ...
和case 1:
这两种写法混合使用
public static void main(String[] args) {
int i = 1;
switch (i) {
case 1-> System.out.println("1");
case 2 ->
System.out.println("2");
case 3 -> System.out.println("3");
default -> System.out.println("default");
}
}
在Java 17的switch中还有一个区别于Java 11的新特性。就是switch最终返回一个结果
小提示: yield 关键字是Java14添加进来的。其作用为局部返回。目前主要的作用就是用在switch中,当某个case有多行代码进行返回结果给前面的变量的。 具有返回结果的switch块中,case后面必须使用 ->不支持:的方式
public static void main(String[] args) {
int i = 3;
String result = switch (i) {
case 1-> "1的结果"; // 类型必须和前面接收的类型相同,
case 2 -> "2的结果";
case 3 -> {
System.out.println("执行了3");
yield "3的结果"; // 多行代码使用yield 关键字返回
}
default -> "default的结果";
}; // 此处必须有分号
System.out.println(result);
}
十.小节实战案例
package com.bjsxt;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
System.out.println("=====================");
System.out.println("欢迎使用餐饮管理系统");
System.out.println("=====================");
System.out.println("菜单");
System.out.println("\t\t1.铁板烧");
System.out.println("\t\t2.烤肠");
System.out.println("\t\t3.烤鸭腿");
System.out.println("\t\t4.烤冷面");
System.out.print("请选择您要的食品编号:");
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
switch(a){
case 1:
System.out.println("铁板烧已经给你准备好了");
break;
case 2:
System.out.println("烤肠已经给你准备好了");
break;
case 3:
System.out.println("烤鸭腿已经给你准备好了");
break;
case 4:
System.out.println("烤冷面已经给你准备好了");
break;
default:
System.out.println("请选择菜单上已有的菜品");
break;
}
}
}
package com.bjsxt;
import java.sql.SQLOutput;
import java.util.Scanner;
public class Test03 {
public static void main(String[] args) {
System.out.println("================");
System.out.println("欢迎使用餐饮管理系统");
System.out.println("=================");
System.out.println("菜单");
System.out.println("\t1.铁板烧");
System.out.println("\t2.烤肠");
System.out.println("\t3.烤鸭腿");
System.out.println("\t4.烤冷面");
System.out.println("请选择您要的视频编号");
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
switch (a){
case 1-> System.out.println("铁板烧已经给你准备好了");
case 2-> System.out.println("烤冷面已经给你准备好了");
case 3-> System.out.println("烤肠已经给你准备好了");
case 4-> System.out.println("烤鸭腿已经给你准备好了");
default-> System.out.println("请点菜单上已经有的内容");
}
}
}