基本数据类型有八个

基本储存单位:位-bit。

基本数据类型分二进制(boolean)类型数值类型,数值类型又分整数类和浮点数类。

  • byte 8bit
  • char 16bit / 2B
  • short 16bit
  • int 32bit/4B
  • long 64bit/8B
  • float 32bit/4B
  • double 64bit/8B
  • boolean boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 并不直接支持 boolean 数组,而是使用 byte 数组来表示 int 数组。

表达式类型的自动提升

当一个java算术表达式中包含多个基本类型的值时(没有定义的常数会被认为是int类型),整个算术表达式的数据类型将发生自动提升。Java定义如下的自动提升规则:

  • 所有byte型、short型和char型将被提升到int型。
  • 允许提升的顺序如下所示:

byte可以升为short,short和char可以升为int,int升long,long升float,float升double。

符合上述顺序时,可以跨级提升,例如int可以直接升为double,但是逆向是不允许的。

例题

代码列表1:

  1. short s1 = 1;
  2. s1 = s1 + 1;

代码列表2:

  1. short s1 = 1;
  2. s1 += 1;

请问以上两段代码是否可以运行,如果不能,错在哪里?第一段不能运行,因为第二行的1被编译器认为是int类型, int类型不能赋值给short类型的s1;第二段可以,java会对+=做特殊处理。

包装类型

上次讲过基本数据类型和包装类的装箱拆箱问题。

char的包装类型Character;int的包装类型Integer;float的包装类型Float;double的包装类型Double

包装类型与基本数据类型的区别

  • 包装类可以存null值,但是基本数据类型不可以;
  • 基本数据类型是值传递,包装类型是引用传递,后面细讲;
  • 变量值存储在栈里,对象存储在堆里,后面细讲;

JVM

java 虚拟机的简称,有几个比较重要的知识点:JVM内存结构、垃圾回收(GC)算法

JVM内存结构

内存结构需要重点掌握,JVM内存结构主要有三块:堆内存、方法区和栈。

堆内存

  • 堆内存是JVM中最大的一块,由年轻代和老年代组成,年轻代还可以细分,暂时无需掌握;
  • 该区域的唯一目的是存放对象实例,几乎所有的对象实例都在这里分配内存
  • java堆被所有线程共享,在虚拟机启动时创建;
  • java堆是垃圾回收的主要区域,所以也被成为GC堆;
  • 可能抛出的异常是OutOfMemoryError(OOM),也就堆溢出,这种异常比较常见,需要判断是内存溢出还是内存泄漏。内存溢出是指程序在申请内存时,没有足够的内存供其使用,例如申请了一个int类型,但是给它赋值了long才能存下的数,就会出现内存溢出。内存泄漏是指程序申请内存后,无法释放已申请的内存空间,JVM有垃圾回收,但是一些情况下也需要手动回收,将无用的对象手动清除。

方法区

  • 它用于存储已被虚拟机加载的类信息常量静态变量、即时编译器编译后的代码等数据,是线程共享的;
  • 方法区有时候被称为持久代,因为该区域的垃圾回收机制较为苛刻。

  • 栈分为本地方法栈和java虚拟机栈,本地方法栈是为使用到的本地方法服务的,java虚拟机栈则是为java方法服务的,用的较多。
  • java虚拟机栈是线程私有的,其生命周期与线程相同。
  • java虚拟机栈描述的是java方法执行的内存模型,线程中每个方法被执行的时候都会创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息,方法被调用直到执行完成的过程对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

常见异常

对内存结构清晰的认识同样可以帮助理解不同OutOfMemoryErrors:

  1. Exception in thread main”: java.lang.OutOfMemoryError: Java heap space

原因:对象不能被分配到堆内存中

  1. Exception in thread main”: java.lang.OutOfMemoryError: PermGen space

原因:类或者方法不能被加载到老年代。它可能出现在一个程序加载很多类的时候,比如引用了很多第三方的库;

  1. Exception in thread main”: java.lang.OutOfMemoryError: Requested array size exceeds VM limit

原因:创建的数组大于堆内存的空间

  1. Exception in thread main”: java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?

原因:分配本地分配失败。JNI、本地库或者Java虚拟机都会从本地堆中分配内存空间。

  1. Exception in thread main”: java.lang.OutOfMemoryError: <reason> <stack trace>(Native method

原因:同样是本地方法内存分配失败,只不过是JNI或者本地方法或者Java虚拟机发现

程序计数器

是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

垃圾回收

先了解这个概念。JVM GC会自动回收无用的内存空间,

类加载

强引用、软引用、弱引用、虚引用

  1. 强引用

  2. 软引用

  3. 弱引用

  4. 虚引用

面向对象的三个基本特征

java作为面向对象的编程语言,具有三个基本特征:封装、继承和多态。

封装

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是比较简单的特征,例如一台手机,我希望将它的内部结构如主板等隐藏,并且暴露一个交互接口屏幕,java中的封装也是类似的,可以将成员变量和具体实现隐藏,只预留一个可供使用的接口。

继承

线程和进程

进程

进程是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位

线程

线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。

区别和联系

  • 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;
  • 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源;
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程);
  • 处理机分给线程,即真正在处理机上运行的是线程;
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

进程间通信

  • 管道(pipe);
  • 信号量;
  • 消息队列(queue);
  • 信号;
  • 套接字(socket)。

线程间通信

  • 使用全局变量;
  • 使用消息(Message)实现通信;

线程同步

  • 在需要同步的方法的 方法签名中加上 synchronized关键字;
  • 使用synchronized关键字对需要进行同步的代码块进行同步;
  • 使用特殊域变量(volatile);

synchronized和 volatile的区别

  • volatile不能保证操作原子性,synchronized可以。

网络基础

七层协议

OSI(Open System Interconnection)模型定义了七层结构:

1. 物理层

有关传输介质的特性。

2.数据链路层

定义了在单个链路上如何传输数据。

3. 网络层

对端到端的包传输进行定义,IP协议属于这一层。

4.传输层

是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能,TCP和UDP协议属于这一层。

5. 会话层

它定义了如何开始、控制和结束一个会话。

6. 表示层

这一层的主要功能是定义数据格式及加密。

7.应用层

与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。HTTP、FTP、Telnet协议属于这一层。

TCP与UDP的区别

  • TCP是基于连接的,UDP是无连接的;
  • TCP要求系统资源较多,UDP较少;
  • TCP是面向数据流的;UDP是面向数据报的;
  • TCP保证数据正确性,UDP可能丢包 ;
  • TCP保证数据顺序,UDP不保证;
  • TCP有流量控制和拥塞控制:TCP 使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制;

TCP为什么是三次握手,不能是两次

第一次握手:客户端像服务端请求建立连接,自身进入半连接状态,等待服务端确认连接;

第二次握手:服务端接受客户端的请求,向客户端返回确认包,进入半连接状态,等待客户端再次确认连接;

第三次握手:客户端回复确认包,两方进入连接状态。

如果缺少了第三次握手的过程,在客户端第一次提出连接申请后,不再需要建立连接或因故障离线,服务端接受了连接请求就进入了连接状态,但是客户端此时无法再与其建立连接,造成资源浪费。

在握手阶段常见SYN攻击,攻击者伪造大量虚假IP,向服务器发送连接请求,使得服务器进入半连接状态,并持续向虚假IP发送确认连接包,直到超时才能释放相关资源,伪造的SYN包占用队列,导致正常的SYN包被丢弃,造成网络拥塞。