03-知识点回顾+三次握手和四次挥手

1. 内容回顾

关键字、标识符、变量、常量、数据类型、注释、代码规范

  • 关键字:java内部定义的一些具有特殊含义的单词

  • 标识符:51 + 2

  • 变量:代表一个可以对数据进行更改的内存地址

    • 规则:字母、数字、下划线、$
    • 不能以数字开头
    • 不能使用标识符和保留字
    • 变量必须定义以后赋值才可以使用。
  • 常量:

    • 代表一个不能进行更改的内存地址。
  • 数据类型:基本数据类型和引用数据类型

    • 基本数据类型:byte、short、int、long、float、double、char、boolean

      类型 范围 字节
      byte -128 到 127 一个字节
      short -32 768 ~ 32 767 两个字节
      int -2 147 483 648 ~ 2 147 483 647 四个字节
      long -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 八个字节
      float 四个字节
      double 八个字节
      char 两个字节
      boolean

      boolean 数据类型会根据操作系统的位数进行分配。

    • 引用类型

      • 类、接口、数组
  • 注释:

    • 单行注释
    • 多行注释
    • 文档注释

2. 为什么float保存的是近视值,推导出0.6的精度。

03-知识点回顾+三次握手和四次挥手_第1张图片

所以浮点数在运算除法的时候会出现值得不准确。

3. 浮点数后面为什么要加f,long后面为什么要加L

public static void main(String[] args){
    // 众所周知, long类型可以表示 -2^32 到 2^32-1个数据,但是编译过程中,数据的编译要先变成整型数据,所以,如果使用long定义数据时超出了int的表示范围编译依旧不通过。所以在表示较大的数据时一定要在数据结尾加上一个L;
    long l = 100000;
	// 与之类似,浮点型数据在编译时他直接当做double数据类型进行使用,所以要使用float进行定义数据时,数据结尾要加上f;
    float f = 123.5f;
}

4. 内存溢出问题,整形转换为byte类型的原理

在强制类型转换时,内存可能会出现溢出

public static void main(String[] args){
    int numa = 128;
    // 这里会出现内存溢出
    byte numb = (byte)numa;
    // System.out.println(numb);
}

03-知识点回顾+三次握手和四次挥手_第2张图片

5. 纯粹的常量值得运算在编译时就执行了。

public static void main(String[] args){
    short s = 10;
    s = 10 + 10; 
    int I = 10;     
    s =+ I; 
}

纯粹的常数的相加是在编译之前就执行了,这样运行的效率就会有所提高,但是一旦运用到了变量就会牵扯到内存的处理,所以对于数据类型的要求比较严格的java语言就会在这里出现问题。

对于byte、short、int、long四种基本数据类型来说,他们执行时都会默认先变成int类型,所以在byte和short类型的数据进行相加或者相减时,他们就不能将得到的值赋值回原类型。

6. 枚举类型是指类

7. 除法运算符针对于负数的操作

public static void main(String[] args){
    System.out.println(10 % -3);
    System.out.println(-10 % 3);
    System.out.println(-10 % -3);
}

对于负数的除法可以使用:被除数 - (商 * 除数)

System.out.println(10 % -3);思路:

10 - (-3) * (-3) = 1

System.out.println(-10 % 3);思路:

-10 - 3 * (-3) = -1

System.out.println(-10 % -3);思路:

-10 - (-3) * 3 = -1

8. 理解a ++ 和 ++ a的区别

a++ : 将a的值作为表达式的值先进行赋值,在将a自增1;

++a : 将a自增1,然后将自增的数值结果作为表达式的值赋值。

9. 逻辑运算符的断路问题

只要前面的表达式可以决定整个表达式的值,那么后面的表达式就可以不用再运行。

这里结合8

  • 问题1

    public static void main(String[] args){
        int a = 10;
        int b = 20;
        if(a++ < ++a || b -- > -- b){
            a = b --;
            b = a --;
            System.out.prrintln(a);
            System.out.prrintln(b);
        }
    }
    

    这里出现了断路问题,因为条件判断内部使用||,而且a++ < ++a一定是true,所以整个表达式一定是成功的,所以这里运算结果为

    18和19

  • 问题2

    public static void main(String[] args){
        int a = 10;
        int b = 20;
        if(a++ < ++a | b -- > -- b){
            a = b --;
            b = a --;
            System.out.prrintln(a);
            System.out.prrintln(b);
        }
    }
    

    这里没有短路,所以if的判断条件的第二表达式一定会被执行到的,显然b是自减了两次,所以与问题1相比a和b的值都会小2;

10. byte和short数据类型针对于+=的操作

+= :对于数据类型不要求,在编译时就已经被执行。

11. 三次握手、四次挥手

  1. TCP/IP协议

03-知识点回顾+三次握手和四次挥手_第3张图片

  • 源端口号和目的端口号都是两个字节,占用了四个字节

  • 四个字节的序号:表明报文序号,根据计算机随机生成的

  • 四个字节确认序号(ack):对上一条发送的信息的确认。

  • 四位首部长度

  • 六位保留位

  • 一位SYN:发起一个新链接

  • 一位ACK:确认序号有效

  • 一位FIN:结束一个TPC链接

  1. 三次握手
client 过程 server
客户端先发送请求 SYN = 1,随机生成序列号:seq = 10000:建立连接
SYN = 1,服务器随机生成序列号:seq = 10001:服务器,同时ACK = 1;表示server确认连接,ack += 1;那么告诉客服端要根据ack发送下一次信息,要不然就不能保证是一个客户端。 服务端知道收到了信息,但是服务端不知道客户端是否接收到了信息
服务端一旦受到信息,就会出现第三次握手 ACK = 1,ack = 10002

三次握手流程:

  • 第一次握手:客户端提出要求,要跟服务端建立连接,设置SYN为1,生成随机序列号发送给服务器,服务器接收到了这条信息为第一次握手;
  • 第二次握手:服务端发送消息,设置ACK = 1,生成随机序列号,发送确认序号ack,这是第二次握手。
    • 这次握手以后服务器并不知道客户端是否接收到了消息,所以TCP要求客服端发送确认请求
  • 第三次握手:客户端发送确认请求,设置ACK = 1,生成随机序列号,发送:ack。

四次挥手流程:

client 四次挥手 server
客户端要求断开连接 FIN = 1,seq = 20202 (客户端主动断开连接)
(这里服务端知道客户端要断开连接了,但是对于服务端可能还有数据没有发送完,所以要等待服务端的消息里面的FIN为1才可以) ACK = 1,ack = seq + 1 接收报文有FIN=1,所以要应答
(这里确定服务端断开连接) FIN = 1,ack = 20232 服务端发送一个FIN = 1的报文
客户端接收到了服务器的断开连接就会全开链接了 ACK = 1,ack = seq + 1
  • TCP/IP是传输层的安全可靠的传输协议。

你可能感兴趣的:(学习Java,java)