Day04 JavaSE

98 阅读9分钟

今日重点 进制数,原码,反码,补码,switch分支语句

一.进制

1.进制定义

在java中可以把不同进制的数赋给变量,最终输出结果是十进制数字.

2.十进制

 满十归零进一
 数字取值范围0-9
 前缀:无
 后缀:d/D 

3.二进制

在计算机中所有内容存储都只能取值0和1,也就是说计算机中所有的内容都是以二进制进行存储
满二归零进一
前缀:以0b/0B开头
后缀:B 

4.二进制转十进制

方法:权相加法   

image.png

5.十进制转二进制

方法:除二取余,逆序排列

image.png

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 1111127.

为什么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八大基本数据类型所占空间总结

b952f1632fa9ad90be0ea8a520e3ef7.png 需要注意的点: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)。

11.png

但是随着计算机发展,需要支持各种语言,显然ASCII码已经无法满足要
求,各国都有对ASCII码的补充。 
我国的简体中文编码GB2312就是对ASCII的补充。它保留了ASCII码
的内容,从127往后开始进行映射,占用两个字节,这样就大约多出7000
左右常用汉字。因为GB2312中除了中文以外还有各种符号等都占用了两个
字节,所以这就是我们在输入法时的全角(全角是在中文状态下输入的,占用两个字
节)。而GB2312中保留的ASCII
内容称为半角(半角是在英文状态下输入的,占用一个字节)。但GB2312中收录的都
是简体中文,没有收录繁体
字,所以这时就出现了big-5。但是为了收录一些不太不太常用的文
字,把GB2312中没有利用好的编码利用起来,又推出了GBK编码,多
了大约20000多个汉字。后来又为了支持一些少数民族的文字,又推出了
GB18030.

随着各个国家都在推出自己的编码表,全球所有的编码表特别混乱,为了
解决这个局面,推出了UnicodeUnicode称为万国码。里面支持绝大多
数国家语言。每个语言中文字都对应Unicode中的一个字符,且每个字符
都有自己的编号。Unicode 目前规划的总空间是17个平面(平面016),0x0000 至 0x10FFFF。每个平面有 65536 个码点。Unicode主
要是字符到编码的映射,所以Unicode更准确应该叫字符集。

在Unicode中字符占用两个byte。但是显然字符a=97,还占用两个字节就
是不合理的,有很多浪费。为了解决这个浪费空间就研究出了UTF-8编
码。
UTF-8 为可变长度编码。根据内容的不同,所占byte也不同。
UTF-8可分配 1字节 2字节 3字节(汉字) 4字节
常说的出现中文乱码指的是编码和解码使用的不是同一种方式

四.Java八大基本数据类型以及对应的封装类

1.封装类

为什么要有封装类?

因为类中提供了方法,而我们可以利用这些方法实现某些功能。而八大基本数据类型的变量是不能调用方法

2.八大基本数据类型对应的封装类

image.png

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("请点菜单上已经有的内容");  
  
}  
  
}  
}