精华内容
下载资源
问答
  • 收集的Android核心知识点笔记,JAVA知识点汇总、Android知识点汇总、Android拓展知识点、Android开源库源码分析、设计模式汇总、Gradle知识点汇总、常见面试算法题汇总。Android
  • 最全java面试核心资料,手册java基础,java并发,spring,spring cloud,JVM Redis,mq,kafka,dubbo,算法,设计模式,分布式 PDF 带书签,java架构师必备
  • 2020年最新Java核心知识点整理大全,包含java基础到进阶的全部学习资料,一次性大放送给大家,大家可以自行下载学习,共勉!
  • JAVA面试核心知识点整理,比较适合1-3年开发者。内容涵盖面较广,讲解详细,跳槽之前好好看看这些吧!
  • JAVA核心知识点整理

    2019-04-28 16:55:31
    java核心知识整理,jvm 线程 锁 集合 并发 数据库 网络
  • Python核心知识点总结

    2016-04-09 12:01:10
    learning Python知识总结
  • JAVA核心知识点整理,Java面试必备。
  • 计算机网络核心知识点总结&面试笔试要点

    万次阅读 多人点赞 2019-08-21 22:22:23
       OSPF(Open Shortest Path First:开放最短路径优先)协议:核心是Dijkstra算法。    OSPF协议的过程:    RIP与OSPF的对比:  3.外部网关路由协议   BGP(Border Gateway Protocol)边际网关协议:是...

    计算机网络之基础篇

    一、计算机网络概述
    1.什么是计算机网络
      计算机网络主要由一些通用的、可编程的硬件互连而成,通过这些硬件,可以传送不同类型的数据,并且可以支持广泛和日益增长的应用。
    2.计算机网络的分类
      按照网络的作用范围:广域网(WAN)、城域网(MAN)、局域网(LAN)
      按照网络使用者:公用网络、专用网络
    3.计算机网络的发展历史
      互联网的发展历史:
       第一阶段:单个网络ARPANET,交换机+电脑
       第二阶段:三层结构互联网,主干网+地区网+校园网
       第三阶段:多层次ISP(Internet Service Provider,网络服务提供商)互联网,主干ISP+地区ISP+校园/公司/家庭…
      中国互联网的发展历史:
       1980年开始互联网实验,1989年第一个公立网络建立运行,1994年接入国际互联网。
    4.计算机网络的层次结构
      层次结构设计的基本原则:
       各层之间是相互独立的;
       每一层需要有足够的灵活性;
       各层之间完全解耦。
      OSI七层模型:并没有成为广泛使用的标准模型,标准制定周期过长,设计不合理。
    (9-3-0753)
      TCP/IP四层模型:
    在这里插入图片描述
    5.计算机网络的性能指标
      速率:bps=bit/s
      时延:发送时延、传播时延、排队时延、处理时延
      往返时间RTT:数据报文在端到端通信中的来回一次的时间
    二、物理层概述
    1.物理层的作用:连接不同的物理设备,传输比特流。
    2.信道的基本概念:信道是往一个方向传输信息的媒体,一条通信电路包含一个发送信道和一个接受信道。
      单工通信信道:只能一个方向通信,没有反方向反馈的信道;
      半双工通信信道:双方都可以发送和接受信息,但
    不能同时发送也不能同时接收

      全双工通信信道:双
    方都可以同时发送和接收

     3.信道的分用-复用技术:大大提升信道的利用率,如下图,分为频分复用、时分复用、波分复用、码分复用。
    在这里插入图片描述
    三、数据链路层
     1.数据链路层概述
      封装成帧:“帧”是数据链路层数据的基本单位,帧的结构如下图:
    在这里插入图片描述
      透明传输:“透明”是指即使控制字符在帧数据中,但是要当做不存在去处理。原理如下图,即在控制字符前加上转义字符ESC。
    在这里插入图片描述
      差错检测:奇偶校验码、循环冗余校验码CRC
       奇偶校验码:局限性:当出错两位时,检测不到错误。
       循环冗余检验码:根据传输或保存的数据而产生固定位数校验码
    2.最大传输单元
      最大传输单元MTU(Maximum Transmission Unit),数据链路层的数据帧不是无限大的,数据帧长度受MTU限制。
      路径MTU:由链路中MTU的最小值决定。
    3.以太网协议详解
      MAC地址:每一个设备都拥有唯一的MAC地址,共48位,使用十六进制表示。
      以太网协议:是一种使用广泛的局域网技术,是一种应用于数据链路层的协议,使用以太网可以完成相邻设备的数据帧传输,数据格式如下:
    在这里插入图片描述

    计算机网络之网络层篇

    一、网络层IP协议相关
    1.IP协议详解
      虚拟互联网络的产生:实际的计算机网络错综复杂;物理设备通过使用IP协议,屏蔽了物理网络之间的差异;当网络中主机使用IP协议连接时,无需关注网络细节,于是形成了虚拟网络。如下图所示:
    在这里插入图片描述
      IP协议使得复杂的实际网络变为一个虚拟互联的网络;并且解决了在虚拟网络中数据报传输路径的问题
      IP数据报的格式:在这里插入图片描述
      其中,版本指IP协议的版本,占4位,如IPv4和IPv6;首部位长度表示IP首部长度,占4位,最大数值位15;总长度表示IP数据报总长度,占16位,最大数值位65535;TTL表示IP数据报文在网络中的寿命,占8位;协议表明IP数据所携带的具体数据是什么协议的,如TCP、UDP。
    2.IP协议的转发过程
      仅从网络层来看,转发过程如下图所示:
    在这里插入图片描述
    3.IP地址的子网划分
      分类的IP地址:A类(8网络号+24主机号)、B类(16网络号+16主机号)、C类(24网络号+8主机号),对比如下:在这里插入图片描述
      无分类编址CIDR:网络前缀+主机号,更加有效的分配IPv4的地址空间。
    4.网络地址转换NAT技术
      用于多个主机通过一个公有IP访问访问互联网的私有网络中,减缓了IP地址的消耗,但是增加了网络通信的复杂度。
    二、网络层其他协议
    1.ARP协议与RARP协议
      ARP(Address Resolution Protocol)协议指地址解析协议,可以把网络层32位地址转化为数据链路层MAC48位地址
      ARP缓存表:是IP地址与MAC地址的映射对应表(IP地址是变化的):在这里插入图片描述
      RARP(Reverse Address Resolution Protocol)协议指逆地址解析协议,可以把数据链路层MAC48位地址转化为网络层32位地址。
    2.ICMP协议
      网际控制报文协议(Internet Control Message Protocol),可以报告错误信息或者异常情况,ICMP报文封装在IP数据报当中。结构如下:
    在这里插入图片描述
      ICMP协议的应用:
       Ping应用:网络故障的排查;
       Traceroute应用:可以探测IP数据报在网络中走过的路径。
    三、IP的路由算法
    1.路由的概述
      关于路由算法的要求:正确的完整的、在计算上应该尽可能是简单的、可以适应网络中的变化稳定的公平的
      自治系统AS:指处于一个管理机构下的网络设备群,AS内部网络自治管理,对外提供一个或多个出入口,其中自治系统内部的路由协议为内部网关协议,如RIP、OSPF等;自治系统外部的路由协议为外部网关协议,如BGP。
    2.内部网关路由协议
      a.RIP协议:
       距离矢量(DV)算法:每一个节点使用两个向量Dᵢ和Sᵢ,Dᵢ描述的是当前节点到别的节点的距离,Sᵢ描述的是当前节点到别的节点的下一节点,每一个节点与相邻的节点交换向量Dᵢ和Sᵢ的信息,每一个节点根据交换的信息更新自己的节点信息,如下图:
    (10-10-0320)
       RIP协议的过程:
        (1)路由器初始化路由信息(两个向量Dᵢ和Sᵢ);
        (2)对相邻路由器X发过来的信息,对信息的内容进行修改(下一跳地址设置为X,所有距离加1)
           i. 检索本地路由,将信息中新的路由插入到路由表里面
           ii. 检索本地路由,对于下一跳为X的,更新为修改后的信息
           iii. 检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新本地路由表
        (3)如果3分钟没有收到相邻的路由信息,则把相邻路由设置为不可达(16跳)。
      b.OSPF协议相关:
       Dijikstra算法:解决有权图从一个节点到其他节点的最短路径问题,该算法“以起点为中心,向外层层扩展”。
       算法描述:
          (1)初始化两个集合(S, U)(S为只有初始顶点点A的集合,U为其他顶点集合);
          (2)如果U不为空,对U集合顶点进行距离的排序,并取出距离A最近的一个顶点D;
            i. 将顶点D的纳入S集合
            ii.更新通过顶点D到达U集合所有点的距离(如果距离更小则更新,否则不更新)
            iii. 重复2步骤
          (3) 直到U集合为空,算法完成。
       链路状态(LS)协议:向所有的路由器发送信息,消息描述该路由器与相邻路由器的链路状态(距离、时延、带宽等),只有链路状态发生变化时,才发送更新信息。
       OSPF(Open Shortest Path First:开放最短路径优先)协议:核心是Dijkstra算法。
       OSPF协议的过程:(10-12-1149)
       RIP与OSPF的对比:(10-12-1204)
    3.外部网关路由协议
      BGP(Border Gateway Protocol)边际网关协议:是运行在AS之间的一种协议。

    计算机网络之传输层篇

    一、UDP协议详解
     1.UDP(User Datagram Protocol: 用户数据报协议),是一个非常简单的协议,结构如下:
    (11-2-0303)
     2.UDP协议的特点:

    • UDP是无连接协议;
    • UDP不能保证可靠的交付数据
    • UDP是面向报文传输的;
    • UDP没有拥塞控制
    • UDP首部开销很小。

    二、TCP协议
     1.TCP(Transmission Control Protocol: 传输控制协议),是计算机网络中非常复杂的一个协议,其结构如下:(11-3-0057)
    2.TCP协议的特点:

    • TCP是面向连接的协议;
    • TCP的一个连接有两端,即点对点通信;
    • TCP提供可靠的传输服务;
    • TCP协议提供全双工通信;
    • TCP是面向字节流的协议;
       3.TCP首部之TCP标记的作用
      (11-3-1413)
       4.可靠传输的基本原理
        停止等待协议:是最简单的可靠传输协议,但是该协议对信道的利用率不高
        连续ARQ(Automatic Repeat reQuest:自动重传请求)协议:滑动窗口+累计确认,大幅提高了信道的利用率
       5.TCP协议的可靠传输
        基于连续ARQ协议,在某些情况下,重传的效率并不高,会重复传输部分已经成功接收的字节
       6.TCP协议的流量控制
        流量控制指让发送方发送速率不要太快,TCP协议使用滑动窗口实现流量控制。
       7.TCP协议的拥塞控制
        拥塞控制与流量控制的区别:流量控制考虑点对点的通信量的控制,而拥塞控制考虑整个网络,是全局性的考虑。
        拥塞控制的方法:慢启动算法+拥塞避免算法,如下图,纵坐标表示每一次发送数据报文的数量,横坐标表示发送的次数:(11-7-0711)
       8.TCP连接的三次握手
        如图所示,具体标记详见上面3.TCP标记的含义与作用:(11-8-0641)
        问:为什么发送方要发出第三个确认报文呢?
        答:避免已经失效的的连接请求报文传送到对方,引起错误
       9.TCP协议的四次挥手
        如图所示(11-9-0513)
        问:等待计时器为什么需要等待2MSL(最长报文断寿命,一般为2min)?
        答:最后一个报文没有确认,确保发送方的ACK可以到达接收方如果2MSL时间内没有收到,则接收方会重发;确保当前连接的所有报文都已经过期。

    计算机网络之应用层篇

    一、DNS详解
      DNS(Domain Name System:域名系统):解决IP地址复杂难以记忆的问题。
      1.IP—>DNS服务—>便于记忆的域名
      2.域名由点、字母和数字组成,分为顶级域(com,cn,net,gov,org)、二级域(baidu,taobao,qq,alibaba)、三级域(www)
    (12-2-0852)
    二、DHCP协议
      DHCP(Dynamic Configuration Protocol:动态主机设置协议):是一个局域网协议,是应用UDP协议的应用层协议。
      作用:为临时接入局域网的用户自动分配IP地址。
    三、HTTP协议
      HTTP(HyperText Transfer Protocol:超文本传输协议):是可靠的数据传输协议。
      HTTP请求的方式对比:
       GET:请求指定的页面信息,并返回实体主体。
       POST:向指定资源提交数据进行处理请求。
       DELETE:请求服务器删除指定的页面。
    四、HTTPS协议
      HTTPS(secure)安全的HTTP协议。
    持续更新。。。

    展开全文
  • 计算机组成原理核心知识点总结&面试笔试要点

    万次阅读 多人点赞 2019-08-13 14:04:07
    作为一名计算机专业的学生,计算机组成原理、计算机网络、操作系统这三门课程可以说是专业核心基础课,是至...而且很多互联网公司在笔试和面试中都会涉及到这三门课程的知识点,因此我通过视频学习对这三门课程就行...

      作为一名计算机专业的学生,计算机组成原理、计算机网络、操作系统这三门课程可以说是专业核心基础课,是至关重要的,其内容是一名合格的coder所必备的知识集;非科班出身的程序员要是想要有所提升,也需要认真学习这三门课程,可以快速形成计算机知识的结构体系,理解计算机底层原理,在工作实践中可以借鉴优秀的设计;而且很多互联网公司在笔试和面试中都会涉及到这三门课程的知识点,因此我通过视频学习对这三门课程就行复习巩固,同时分三篇博客记录总结。

    计算机组成原理

    一 计组之概述篇

    1. 计算机的发展历史
      第一阶段(1946-1957):电子管计算机 特点:集成度低,体积大,功耗高,运行速度慢,操作复杂。
      第二阶段(1957-1964):晶体管计算机 特点:相对电子管计算机,体积小,速度快,功耗低,可靠性高,配备显示器。
      第三阶段(1964-1980):集成电路计算机 特点:操作系统诞生。
      第四阶段(1980-至 今):超大规模集成电路计算机 特点:集成度高,速度快,体积小,价格低,用途广泛。
      第五阶段( f u t u r e) :生物计算机&&量子计算机 …

    2. 计算机的分类
      超级计算机、大型计算机、迷你计算机(普通服务器)、工作站、微型计算机(个人计算机)

    3. 计算机的体系与结构
      冯·诺伊曼体系:将程序指令数据一起存储的计算机设计概念结构,存储器+控制器+运算器+输入设备+输出设备。
      冯·诺伊曼体系
      现代计算机的结构:以存储器为核心,解决冯·诺伊曼体系瓶颈问题(CPU与存储设备之间的性能差异)。
      在这里插入图片描述

    4. 计算机的层次
      在这里插入图片描述

    5. 计算机的字符与编码集
      字符编码集的历史:ASCII码 --> Extended ASCII码
      中文编码集:GB2312、GBK、Unicode(统一码、万国码)

    二 计组之组成篇

    1. 计算机的总线与I/O设备
      a.计算机的总线(Bus)
       概述:连接多个设备或者接入点的数据传输通路。
      作用:解决不同设备之间的通信问题。
       分类:片内总线(高集成度内部的信息传输线)、系统总线(细分为:数据总线&地址总线&控制总线,是CPU、主内存、IO设备、各组件之间的信息传输线)
       总线的仲裁:为了解决总线使用权的冲突问题,三种方法:链式查询、计时器定时查询、独立请求。
      b.常见的输入输出设备
       字符输入设备:键盘
       图形输入设备:鼠标、数位板、扫描仪
       图像输出设备:显示器、打印机、投影仪
      c.输入输出接口的通用设计
       数据线:I/O设备与主机进行数据交换的传送线(单向&双向)。
       状态线:I/O设备状态向主机报告的信号线。
       命令线:CPU向I/O设备发送命令(读写信号、启动停止信号)的信号线。
       设备选择线:主机选择I/O设备进行操作的信号线。
      d.CPU与I/O设备的通信
       程序中断:提供低速设备通知CPU的一种异步的方式,CPU可以在高速运转的同时兼顾低速设备的响应。
       直接存储器访问(DMA):
      在这里插入图片描述

    2. 计算机的存储器
      a.存储器的分类:
       按照存储介质:半导体存储器(内存、U盘、固态硬盘)、磁存储器(磁带、磁盘)
       按照存取方式:随机存储器RAM(随机读取,与位置无关)、串行存储器(按顺序查找,与位置有关)、只读存储器ROM(只读不写)
      b.存储器的层次结构
      在这里插入图片描述
      缓存-主存层次:局部性原理,在CPU与主存之间增加一层速度快容量小的Cache,解决主存速度不足的问题。
      主存-辅存层次:局部性原理,主存之外增加辅助存储器,解决主存容量不足的问题。
      局部性原理:是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
      在这里插入图片描述
      c.计算机的主存储器
       内存RAM(随机存取存储器Random Access Memory):通过电容存取数据,掉电将丢失所有数据。
      d.计算机的辅助存储器
      e.计算机的高速缓存
       工作原理:命中率是衡量缓存的重要性能指标,理论上CPU每次都能从高速缓存取数据的时候,命中率为1。
      在这里插入图片描述
      在这里插入图片描述
      高速缓存的替换时间:当缓存没有数据,需要从主存载入数据的时候。
      高速缓存的替换策略:随机算法、先进先出算法(FIFO)、最不经常使用算法(LFU)、最近最少使用算法(LRU)。

    3. 计算机的CPU
      a.计算机的指令系统
       机器指令的形式:操作码(指明指令所要完成的操作)+地址码(给出操作数或操作数的地址);
       机器指令的操作类型:数据传输、算术逻辑操作、移位操作、控制指令;
       机器指令的寻址方式:指令寻址(顺序寻址+跳跃寻址)、数据寻址(立即寻址(速度快)+直接寻址(寻找操作数简单)+间接寻址(寻址范围大,速度慢))
      b.计算机的控制器
       作用:控制器是协调和控制计算机运行的。
       组成:程序计数器(存储下一条指令的地址)、时序发生器(发送时序脉冲)、指令译码器(控制器的主要部件之一,翻译操作码+地址码)、指令寄存器(控制器的主要部件之一,从主存或缓存存取计算机指令)、主存地址寄存器(保存当前CPU正要访问的内存地址单元)、主存数据寄存器(保存当前CPU正要读或写的主存数据)、通用寄存器(比一般专用寄存器大,可以暂时存放或传送数据或指令,可保存ALU的运算中间结果)。
      c.计算机的运算器
       作用:进行数据运算加工。
       组成:数据缓冲器(输入缓冲暂时存放外设送过来的数据,输出缓冲暂时存放送往外设的数据)、ALU(算术逻辑运算)、状态字及寄存器(存放运算状态和运算控制信息)、通用寄存器(比一般专用寄存器大,可以暂时存放或传送数据或指令,可保存ALU的运算中间结果)。
      d.计算机指令执行的过程
       指令执行过程:取指令-分析指令-执行指令
      (3-10-0629)
      CPU的流水线设计:因运算器和控制器不能同时工作,CPU的综合利用率并不高,所以CPU的流水线设计可以提高CPU的利用率,提高大概3倍。

    三 计组之计算篇

    1. 进制运算的基础知识
      进位制:即进制,是一种计数方式,亦称进位计数法,有限种数字符号来表示无限的数值。
      传送门——>关于进制转换推荐看文
    2. 二进制数据的表示方法
      a.有符号数和无符号数
      原码表示法:0表示正数,1表示负数,规定符号位位于数值的第一位;表达简单,容易理解,但运算复杂。
      b.二进制的补码表示法
      定义:(4-4-0104)
      引入目的:为了消除减法(未完全实现)引入补码的概念,使用正数代替负数。
      规律:负数的补码等于反码+1,如十进制数-7,反码表示为1,1000,补码表示为1,1001。
      举个小例子计算题:(4-4-0622)
      c.二进制的反码表示法
      定义:(4-5-0216)
      引入目的:找出原码和补码之间的规律,消除转换过程中的减法操作。
      规律:负数的反码等于原码除符号位外按位取反,如十进制数-7,原码表示为1,0111,反码表示为1,1000
      举个小例子计算题:(4-5-0330)
      d.小数的二进制补码表示
      定义:(4-6-0032)
      上述两个整数的反码补码计算规律同样适用。
    3. 二进制数据的运算
      a.定点数与浮点数
      定点数:小数点固定在某个位置。
      浮点数的表示格式:符号、阶码、尾数
      (4-7--555)
      浮点数的表示范围:单精度± (2-2^-23) × 2127
      双精度± (2-2^-52) × 21023 其中大于浮点数绝对值最大的数为上溢,小于绝对值最小的数据为下溢
      浮点数的规格化:尾数使用纯小数、尾数最高位必须是1。
      b.定点数的加减法运算
      加法运算:数值位与符号位一同运算,并将符号位产生的进位自然丢掉(模2^n舍去)。
      (4-8-0107)
      举两个小栗子计算题(整数和小数):(4-8-0509)(4-8-0607)
      减法运算:将B[补码]转换成-B[补码]来计算,其中-B[补码]=B[补码]连同符号按位取反,末尾加1,例如B[补码]=1,0010101 ,则-B[补码]=0,1101011
      举个小栗子计算题:(04 08-1654)
      c.浮点数的加减法运算
      步骤:对阶(使得阶码一致,尾数才可以运算)–>尾数求和–>尾数规格化–>舍入–>溢出判断
      运算:先进行对阶,后与定点数的加减法相同。
      举个小栗子计算题:
      (4-9-1315)
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      d.浮点数的乘除法运算
      乘法:阶码相加,尾数求积。
      除法:阶码相减,尾数求商。

    四 计组之实践篇

    1. 实现双向链表
      单向链表:节点1–>节点2–>节点3–>节点4–>节点5 其中每一个节点都有下一个节点的地址或引用。
      双向链表:节点1⇋节点2⇋节点3⇋节点4⇋节点5 每一个节点都有上一个和下一个节点的地址和引用。
      双向链表优点:可以快速找到上/下节点,也可以快速去掉链表中的某一个节点。
      传送门——>实现双向链表
    2. 实现FIFO缓存置换算法
      淘汰缓存时,把最先进入链表的结点淘汰掉。
      传送门——> 实现FIFO缓存置换算法
    3. 实现LRU缓存置换算法
      传送门——> 实现LRU缓存置换算法
    4. 实现LFU缓存置换算法
      传送门——> 实现LFU缓存置换算法

    五 重要知识点及笔&面试常考题目

    传送门——>计算机组成原理试题1
    传送门——>计算机组成原理试题2
    传送门——>计算机组成原理试题3

    展开全文
  • 课程背景 又逢“金九银十”,年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、...长期筹谋——巩固核心技能。 面试题怎么刷?刷高...

    课程背景

    又逢“金九银十”,年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。

    然而,面试人群众多,技术市场却相对冷淡,面试的同学们不得不面临着 1 个职位 N 个应聘者的巨大竞争。

    问:在这种现状下,如何才能收获又多又好的 Offer?

    答:短期准备——刷面试题;长期筹谋——巩固核心技能

    • 面试题怎么刷?刷高频题、有深度的题、符合时效性的题。

    • 核心技能如何巩固?先深入理解原理,再系统应用到实践。

    不过,面试成功并不是终极目标。我们要的,是在接下来的工作中,把所学的技能点运用到产品开发,发挥重要的工作价值。

    从业十多年,我先是一个被面试者,又成为面试官。为了使更多开发者拿到好 Offer 并且顺利工作,也为了帮助企业找到合适技术人才,我拜访几十家互联网公司、花了大半年,付出很多心血,凝结成这个课程——《Java面试全解析:核心知识点与典型面试题》


    课程亮点

    • 500道 Java 常见面试题 + 10万字核心知识解析

    • 丰富的 Java 技术栈:基础和框架,线程池和锁优化,SpringBoot 和分布式消息队列,数据结构和常用算法,设计模式和 JVM 等

    • 易学易会:提供了大量的图片说明和代码示例

    • Java 核心知识图谱 X1 + 阿里内推名额 X1 + 阿里面试通关攻略 X1 + 阿里内推交流群 X1


    适宜人群

    • 准备 Java 面试的在校生(大专或研究生)
    • 准备跳槽、正在找工作的 Java 工程师
    • 自学和准备转行到 Java 技术领域的人
    • 想巩固 Java 核心知识、查漏补缺的人

    你会获得什么

    • 收获 Java 技术栈的核心知识点

    这个课程几乎涵盖了 Java 技术栈的大部分内容,不止对于面试,在日常的工作中也可以发挥很大的作用。

    • 详解 500 多道实用、权威、高频 Java 面试题

    这 500 多道面试题,都是目前主流企业使用最高频的面试题库,也都是 Java 版本升级之后,重新整理归纳的最新答案,会让面试者少走很多不必要的弯路。同时每道题都做到了详尽的描述,以确保每个阶段的读者都能看得懂,面试题中的专业短语也都确保提供了必要的介绍,部分难懂的题目也提供了题目解析和示例代码。

    • 理解技术背后的实现原理

    死记硬背的内容通常会随着时间的推移很快就忘记,所以在学习一门技术的时候,一定要了解其背后的实现原理,从而构建逻辑上的因果关系,这样才能够记的更久。这门课程会深入浅出地对技术背后的原理进行深入的分析,让读者“知其然,并知其所以然”。


    作者介绍

    老王 资深面试官,阿里云社区认证专家。

    十余年编程从业经验,现上市公司技术研发经理,曾就职于 360,有着丰富的大型系统设计、开发和调优的经验,在不断探索和学习的过程中,积累了宝贵的编程与面试经验。公众号「Java中文社群」。


    目录

    购买须知

    • 本课程为图文内容课程,共计 37 篇,8月19日起,每周更新 2 篇或 2 篇以上
    • 付费用户可享受文章永久阅读权限
    • 读者可在评论区向作者提问或交流
    • 本课程为虚拟产品,一经付费概不退款,敬请谅解
    • 本课程可在 GitChat 服务号、APP 及网页端 gitbook.cn 上购买,一端购买,多端阅读

    订阅福利

    • 订购本课程可获得专属海报,分享专属海报每成功邀请一位好友购买,即可获得返现奖励,多邀多得,上不封顶,立即提现
    • 提现流程:请在 GitChat 服务号中点击“我-我的邀请-提现”进行提现

    课程内容

    开篇词:如何轻松获得 Offer

    你好,我是王磊,某上市公司技术研发经理,前奇虎 360 员工,有着 10 余年的编程工作经验,目前主要负责新员工技术面试和构建企业技术架构的相关事宜。随着面试过的人数增加,我发现面试者们暴露出了技术方面的很多问题,为了让更多面试者少走一些弯路,也为了让企业能招到合适的技术人才,于是就诞生了这门课程。

    为了能把这门课程写好,我先后拜访了一二十家互联网公司,与不同的面试官和面试者进行面对面探讨,深入了解了企业对于面试者的要求和常见的 Java 面试题型。之后我花了大半年的时间,结合自己 4 年多作为面试官的经历,把这些内容整理成文,用大约 10万 字的内容对 Java 的核心知识点和常见的 500 多道面试题,做了详细的介绍,也就是本课程中你所看到的全部内容,希望对你能有所帮助。

    为什么要学这门课程?

    「因为它能为你赢得面试的主动权,让你获得更多的 Offer。」

    从业十多年,我从面试者变成面试官,在 Java 面试上积累了比较丰富的经验。

    其实,很多面试者在搜集面试资料的时候都踩过一些“坑”,你是不是也遇到过:

    • 免费搜索的面试题,内容不全面,这就算了,有时候答案都不准确
    • 很多培训机构提供的面试宝典内容虽然不少,但深度不够,且面试题过于老旧脱离了企业实际需要;
    • 还有很多付费的面试题存在滥竽充数,提供了很多没有价值的面试题,钱花了,干货没学到
    • 市面上大部分面试题只讲了基础概念,没有提供题目解析和示例代码,不利于读者真正的掌握背后的原理,只能死记硬背,且容易忘记。

    为了规避这些“坑”,我跑了很多家互联网公司,来确认 Java 面试中实际考察的高频知识点和常见题型。可是有了第一手素材后,我要如何让大家真正从我的讲解中学到干货、用到实处呢?

    经过反复验证,我才设计了如下的内容讲述模式。

    第一,500+ 面试题详解。

    如果你是还没走入职场的新人,我会为你提供完整的 Java 技术栈讲解,以及 最新、最全、最实用 的 500 多道 Java 面试题详解。

    第二,10万字 Java 核心知识点梳理。

    本课程的每一篇内容,都采用的是「核心知识点 + N道相关面试题」的模式,让你不单能应付面试,还能学到更多的 Java 核心知识。

    第三,技术、面试搭配平衡,不但让你学到心里,还助你展示出来。

    面对目前技术市场的相对冷淡和一个职位多个应聘者竞争的现状,面试者们只有掌握更多 Java 核心技能和面试理论知识,才能在众多面试者中脱颖而出。

    本课程每篇文章大致分为两个部分:Java 核心点介绍 + 相关面试题详解,这两部分内容相辅相成,前面的核心知识点介绍让后面的面试题更容易理解,后面的面试题加深了读者对于 Java 核心点的掌握。如此一来,让你所学及所用,不仅能够应付面试,更能学习到更多有价值的 Java 技术点,让你在面试中和工作中都能展示的更加出色。

    点击收下这份《Java 面试全解析》

    课程大纲

    本课程分为七大部分,共计 37 讲,约 10 万字。

    第一部分:Java 基础强化

    这部分包含 7 篇文章,我会从 Java 最基础的内容讲起。有最常见的 String 面试题从表象到原理的深入讲解;还有 Java 8 中新特性的介绍,比如时间和日期模块,让你使用更简洁和优化的方式写出更完美的代码;还有我们日常用的很多包装类不为人知的有趣现象和知识盲点介绍;还有数组以及算法的介绍,虽然基础但容易被面试者忽略和容易出错的问题……

    第二部分:各种类和克隆

    这部分包含 4 篇文章,除了会深入讲解 Java 中的各种类和接口的相关内容,还会深入讲解浅克隆和深克隆的各种实现方式,以及配合各种图片让你更形象地理解深/浅克隆的本质。

    第三部分:数据结构和队列

    这部分包含 4 篇文章,对面试中必考的集合,除了相关的面试题讲解,更要理清各种集合之间的关系,创建集合之间的联系,这样才能对集合的整体理解做到心中有数。我使用了归纳法和各种关系图,帮你理清思路,打通你的“任督二脉”。其中还有队列的内容,可能开发者经常会听到,但实际的工作中使用的较少,本部分内容也会带你玩转这些数据结构,让你在面试中能够应对自如。

    第四部分:反射和动态代理

    这部分会帮你理清反射和动态代理的关系,并提供很多实际使用的场景,让你更好地使用到反射和动态代理,当然这部分也会为你提供各种形式反射和动态代理的实现方式,让你可以随心所欲的使用它们。这部分内容还提供了 IO 的相关知识,并提供详细的示例和原理分析,也会试着编写一个简单 Socket 服务器。

    第五部分:多线程编程

    这部分包含 7 篇文章,讲述了包含 Java 8 在内的 8 种线程池,以及线程池的正确使用姿势,还有死锁代码的编写和死锁的解决方案。本部分还会介绍 Java 中的各种锁,以及它们的区别和使用场景,还会介绍 CAS 和著名的 ABA 问题的解决方案,还有多线程中的各种高频面试题。

    第六部分:Java 热门框架和分布式消息队列

    这部分包含 6 篇文章,从 Spring 到最近比较热门的微服务框架 SpringBoot,还有国内常用的 Mybatis 和 Java 技术栈中其他常用的框架,比如 Dubbo 和 Zookeeper,还有分布式消息队列 RabbitMQ 和 Kafka 的介绍和面试题汇总。

    第七部分:Java 高手进阶

    本部分内容包含 6 篇文章,可谓 Java 技术栈最实用的面试补充“大礼包”,有设计模式的面试题汇总;还有 DBA 级别的 MySQL 和 Redis 面试题汇总;还有成为高手必懂的 JVM 和算法的面试题汇总;最后回到本课程的主题内容,提供了 Java 最容易出错的面试题汇总作为收束篇目,助你稳健地拿到想要的 Offer。

    以下是这门课程的知识树:

    Java 知识树

    点击可查《Java 面试全解析》还会讲什么

    课程寄语

    希望通过本门课程的学习,你不但能拿到 Offer、取得更好的工作,还能建立一个完整的 Java 知识体系,让你学到的所有内容都能转化为实际的生产力,帮你在工作中取得不凡的成绩。并且希望明白原理后的你,能把这些记忆一直存储在自己大脑中,这样它将会成为你一辈子的财富。

    我坚信:持续学习才是最有价值的投资,让我们一起行动起来,一起来做这件最有价值的事情。

    最后,预祝每一位学习本门课的朋友,都能找到一份自己理想中的工作。


    此外,我们为本课程付费读者创建了《Java 面试全解析》的微信交流群,方便读者更有针对性地讨论课程相关问题,以及分享Java 技术和面试心得。

    入群请添加「GitChat 小助手泰勒」:识别下方二维码,或者添加 GitChatty5,注明「Java 面试」。

    温馨提示:需购买才可入群哦,加小助手后需要截图已购买页面来发给小助手验证一下~

    FtkDbtI-hx5hlJERoW0MGan1I8Ax

    第 1-1 课:Java 程序是如何执行的?

    了解任何一门语言的精髓都是先俯览其全貌,从宏观的视角把握全局,然后再深入每个知识点逐个击破,这样就可以深入而快速的掌握一项技能。同样学习 Java 也是如此,本节就让我们先从整体来看一下 Java 中的精髓。

    Java 介绍

    Java 诞生于 1991 年,Java 的前身叫做 Oak(橡树),但在注册商标的时候,发现这个名字已经被人注册了,后来团队的人就在咖啡馆讨论这件事该怎么办,有人灵机一动说叫 Java 如何,因为当时他们正在喝着一款叫做 Java 的咖啡。就这样,这个后来家喻户晓的名字,竟以这种“随意”的方式诞生了,并一直沿用至今。

    Java 发展历程:

    • 1990,Sun 成立了“Green Team”项目小组
    • 1991,Java 语言前身 Oak(橡树)诞生
    • 1995,Oak 语言更名为 Java
    • 1996,Java 1.0 发布
    • 1997,Java 1.1 发布
    • 1998,Java 1.2 发布
    • 2000,Java 1.3 发布
    • 2000,Java 1.4 发布
    • 2004,Java 5 发布
    • 2006,Java 6 发布
    • 2011,Java 7 发布
    • 2014,Java 8 发布
    • 2017,Java 9(非长期支持版)发布
    • 2018.03,Java 10(非长期支持版) 发布
    • 2018.09,Java 11(长期支持版)发布
    • 2019.03, Java 12(非长期支持版) 发布

    注:长期支持版指的是官方发布版本后的一段时间内,通常以“年”为计数单位,会对此版本进行持续维护和升级。

    版本发布时间Java 10 之后,官方表示每半年推出一个大版本,长期支持版本(LTS)每三年发布一次。

    Java 和 JDK 的关系

    JDK(Java Development Kit)Java 开发工具包,它包括:编译器、Java 运行环境(JRE,Java Runtime Environment)、JVM(Java 虚拟机)监控和诊断工具等,而 Java 则表示一种开发语言。

    Java 程序是怎么执行的?

    我们日常的工作中都使用开发工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的调试程序,或者是通过打包工具把项目打包成 jar 包或者 war 包,放入 Tomcat 等 Web 容器中就可以正常运行了,但你有没有想过 Java 程序内部是如何执行的?

    其实不论是在开发工具中运行还是在 Tomcat 中运行,Java 程序的执行流程基本都是相同的,它的执行流程如下:

    1. 先把 Java 代码编译成字节码,也就是把 .java 类型的文件编译成 .class 类型的文件。这个过程的大致执行流程:Java 源代码 -> 词法分析器 -> 语法分析器 -> 语义分析器 -> 字符码生成器 -> 最终生成字节码,其中任何一个节点执行失败就会造成编译失败;
    2. 把 class 文件放置到 Java 虚拟机,这个虚拟机通常指的是 Oracle 官方自带的 Hotspot JVM;
    3. Java 虚拟机使用类加载器(Class Loader)装载 class 文件;
    4. 类加载完成之后,会进行字节码效验,字节码效验通过之后 JVM 解释器会把字节码翻译成机器码交由操作系统执行。但不是所有代码都是解释执行的,JVM 对此做了优化,比如,以 Hotspot 虚拟机来说,它本身提供了 JIT(Just In Time)也就是我们通常所说的动态编译器,它能够在运行时将热点代码编译为机器码,这个时候字节码就变成了编译执行。

    Java 程序执行流程图如下:

    avatar

    Java 虚拟机是如何判定热点代码的?

    Java 虚拟机判定热点代码的方式有两种:

    • 基于采样的热点判定

    主要是虚拟机会周期性的检查各个线程的栈顶,若某个或某些方法经常出现在栈顶,那这个方法就是“热点方法”。这种判定方式的优点是实现简单;缺点是很难精确一个方法的热度,容易受到线程阻塞或外界因素的影响。

    • 基于计数器的热点判定

    主要就是虚拟机给每一个方法甚至代码块建立了一个计数器,统计方法的执行次数,超过一定的阀值则标记为此方法为热点方法。

    Hotspot 虚拟机使用的基于计数器的热点探测方法。它使用了两类计数器:方法调用计数器和回边计数器,当到达一定的阀值是就会触发 JIT 编译。

    方法调用计数器:在 client 模式下的阀值是 1500 次,Server 是 10000 次,可以通过虚拟机参数: -XX:CompileThreshold=N 对其进行设置。但是JVM还存在热度衰减,时间段内调用方法的次数较少,计数器就减小。

    回边计数器:主要统计的是方法中循环体代码执行的次数。

    由上面的知识我们可以看出,要想做到对 Java 了如之中,必须要好好学习 Java 虚拟机,那除了 Java 虚拟机外,还有哪些知识是面试必考,也是 Java 工程师必须掌握的知识呢?

    1. Java 基础中的核心内容

    字符串和字符串常量池的深入理解、Array 的操作和排序算法、深克隆和浅克隆、各种 IO 操作、反射和动态代理(JDK 自身动态代理和 CGLIB)等。

    2. 集合

    集合和 String 是编程中最常用的数据类型,关于集合的知识也是面试备考的内容,它包含:链表(LinkedList)、TreeSet、栈(Stack)、队列(双端、阻塞、非阻塞队列、延迟队列)、HashMap、TreeMap 等,它们的使用和底层存储数据结构都是热门的面试内容。

    3. 多线程

    多线程使用和线程安全的知识也是必考的面试题目,它包括:死锁、6 种线程池的使用与差异、ThreadLocal、synchronized、Lock、JUC(java.util.concurrent包)、CAS(Compare and Swap)、ABA 问题等。

    4. 热门框架

    Spring、Spring MVC、MyBatis、SpringBoot

    5. 分布式编程

    消息队列(RabbitMQ、Kafka)、Dubbo、Zookeeper、SpringCloud 等。

    6. 数据库

    MySQL 常用引擎的掌握、MySQL 前缀索引、回表查询、数据存储结构、最左匹配原则、MySQL 的问题分析和排除方案、MySQL 读写分离的实现原理以及 MySQL 的常见优化方案等。Redis 的使用场景、缓存雪崩和缓存穿透的解决方案、Redis 过期淘汰策略和主从复制的实现方案等。

    7. Java 虚拟机

    虚拟机的组成、垃圾回收算法、各种垃圾回收器的区别、Java 虚拟机分析工具的掌握、垃圾回收器的常用调优参数等。

    8. 其他

    常用算法的掌握、设计模式的理解、网络知识和常见 Linux 命令的掌握等。

    值得庆幸的是以上所有内容都包含在本课程中,接下来就让我们一起学习,一起构建 Java 的认知体系吧!

    点击收下这份《Java 面试全解析》

    相关面试题

    1. Java 语言都有哪些特点?

    答:Java 语言包含以下特点。

    • 面向对象,程序容易理解、开发简单、方便;
    • 跨平台,可运行在不同服务器类型上,比如:Linux、Windows、Mac 等;
    • 执行性能好,运行效率高;
    • 提供大量的 API 扩展,语言强大;
    • 有多线程支持,增加了响应和实时交互的能力;
    • 安全性好,自带验证机制,确保程序的可靠性和安全性。

    2. Java 跨平台实现的原理是什么?

    答:要了解 Java 跨平台实现原理之前,必须先要了解 Java 的执行过程,Java 的执行过程如下:

    执行过程

    Java 执行流程:Java 源代码(.java)-> 编译 -> Java 字节码(.class) ->通过 JVM(Java 虚拟机)运行 Java 程序。每种类型的服务器都会运行一个 JVM,Java 程序只需要生成 JVM 可以执行的代码即可,JVM 底层屏蔽了不同服务器类型之间的差异,从而可以在不同类型的服务器上运行一套 Java 程序。

    3. JDK、JRE、JVM 有哪些区别?

    答:了解了 JDK、JRE、JVM 的定义也就明白了它们之间的区别,如下所述。

    • JDK:Java Development Kit(Java 开发工具包)的简称,提供了 Java 的开发环境和运行环境;
    • JRE:Java Runtime Environment(Java 运行环境)的简称,为 Java 的运行提供了所需环境;
    • JVM:Java Virtual Machine(Java虚拟机)的简称,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,简单来说就是所有的 Java 程序都是运行在 JVM(Java 虚拟机)上的。

    总体来说,JDK 提供了一整套的 Java 运行和开发环境,通常使用对象为 Java 的开发者,当然 JDK 也包含了 JRE;而 JRE 为 Java 运行的最小运行单元,一般安装在 Java 服务器上,所以 JDK 和 JRE 可以从用途上进行理解和区分。JVM 不同于 JDK 和 JRE,JVM 是 Java 程序运行的载体,Java 程序只有通过 JVM 才能正常的运行。

    4. Java 中如何获取明天此刻的时间?

    答:JDK 8 之前使用 Calendar.add() 方法获取,代码如下:

    Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE, 1);System.out.println(calendar.getTime());

    JDK 8 有两种获取明天时间的方法。

    方法一,使用 LocalDateTime.plusDays() 方法获取,代码如下:

    LocalDateTime today = LocalDateTime.now();LocalDateTime tomorrow = today.plusDays(1);System.out.println(tomorrow);

    方法二,使用 LocalDateTime.minusDays() 方法获取,代码如下:

    LocalDateTime today = LocalDateTime.now();LocalDateTime tomorrow = today.minusDays(-1);System.out.println(tomorrow);

    minusDays() 方法为当前时间减去 n 天,传负值就相当于当前时间加 n 天。

    5. Java 中如何跳出多重嵌套循环?

    答:Java 中跳出多重嵌套循环的两种方式。

    • 方法一:定义一个标号,使用 break 加标号的方式
    • 方法二:使用全局变量终止循环

    方法一,示例代码:

    myfor:for (int i = 0; i < 100; i++) {    for (int j = 0; j < 100; j++) {        System.out.println("J:" + j);        if (j == 10) {            // 跳出多重循环            break myfor;        }    }}

    方法二,示例代码:

    boolean flag = true;for (int i = 0; i < 100 && flag; i++) {    for (int j = 0; j < 100; j++) {        System.out.println("J:" + j);        if (j == 10) {            // 跳出多重循环            flag = false;            break;        }    }}

    6. char 变量能不能存贮一个中文汉字?为什么?

    答:char 变量可以存贮一个汉字,因为 Java 中使用的默认编码是 Unicode ,一个 char 类型占 2 个字节(16 byte),所以放一个中文是没问题的。

    7. Java 中会存在内存泄漏吗?请简单描述一下。

    答:一个不再被程序使用的对象或变量一直被占据在内存中就造成了内存泄漏。

    Java 中的内存泄漏的常见情景如下:

    • 长生命周期对象持有短生命的引用,比如,缓存系统,我们加载了一个对象放在缓存中,然后一直不使用这个缓存,由于缓存的对象一直被缓存引用得不到释放,就造成了内存泄漏;
    • 各种连接未调用关闭方法,比如,数据库 Connection 连接,未显性地关闭,就会造成内存泄漏;
    • 内部类持有外部类,如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露;
    • 改变哈希值,当一个对象被存储进 HashSet 集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则对象修改后的哈希值与最初存储进 HashSet 集合中时的哈希值就不同了,在这种情况下,即使在 contains 方法使用该对象的当前引用作为的参数去 HashSet 集合中检索对象,也将返回找不到对象的结果,这也会导致无法从 HashSet 集合中单独删除当前对象,造成内存泄露。

    点击可查《Java 面试全解析》还会讲什么


    此外,我们为本课程付费读者创建了《Java 面试全解析》的微信交流群,方便读者更有针对性地讨论课程相关问题,以及分享Java 技术和面试心得。

    入群请添加「GitChat 小助手泰勒」:识别下方二维码,或者添加 GitChatty5,注明「Java 面试」。

    温馨提示:需购买才可入群哦,加小助手后需要截图已购买页面来发给小助手验证一下~

    FtkDbtI-hx5hlJERoW0MGan1I8Ax

    第 1-2 课:你不知道的基础数据类型和包装类 + 面试题

    基本数据类型

    Java 基础数据按类型可以分为四大类:布尔型、整数型、浮点型、字符型,这四大类包含 8 种基础数据类型。

    • 布尔型:boolean
    • 整数型:byte、short、int、long
    • 浮点型:float、double
    • 字符型:char

    八种基础类型取值如下:

    数据类型代表含义默认值取值包装类
    boolean布尔型false0(false) 到 1(true)Boolean
    byte字节型(byte)0-128 到 127Byte
    char字符型'\u0000'(空)'\u0000' 到 '\uFFFF'Character
    short短整数型(short)0-2^15 到 2^15
    -1Short
    int整数型0-2^31 到 2^31-1Integer
    long长整数型0L-2^63 到 2^63-1Long
    float单浮点型0.0f1.4e-45 到 3.4e+38Float
    double双浮点型0.0d4.9e-324 到 1.798e+308Double

    除 char 的包装类 Character 和 int 的包装类 Integer 之外,其他基础数据类型的包装类只需要首字母大写即可。包装类的作用和特点,本文下半部分详细讲解。

    我们可以在代码中,查看某种类型的取值范围,代码如下:

    public static void main(String[] args) {    // Byte 取值:-128 ~ 127    System.out.println(String.format("Byte 取值:%d ~ %d", Byte.MIN_VALUE, Byte.MAX_VALUE));    // Int 取值:-2147483648 ~ 2147483647    System.out.println(String.format("Int 取值:%d ~ %d", Integer.MIN_VALUE, Integer.MAX_VALUE));}

    包装类型

    我们知道 8 种基本数据类型都有其对应的包装类,因为 Java 的设计思想是万物既对象,有很多时候我们需要以对象的形式操作某项功能,比如说获取哈希值(hashCode)或获取类(getClass)等。

    那包装类特性有哪些?

    1. 功能丰富

    包装类本质上是一个对象,对象就包含有属性和方法,比如 hashCode、getClass 、max、min 等。

    2. 可定义泛型类型参数

    包装类可以定义泛型,而基础类型不行。

    比如使用 Integer 定义泛型,代码:

    List<Integer> list = new ArrayList<>();

    如果使用 int 定义就会报错,代码:

    List list = new ArrayList<>();  // 编译器代码报错

    3. 序列化

    因为包装类都实现了 Serializable 接口,所以包装类天然支持序列化和反序列化。比如 Integer 的类图如下:

    Integer 类图

    4. 类型转换

    包装类提供了类型转换的方法,可以很方便的实现类型之间的转换,比如 Integer 类型转换代码:

    String age = "18";int ageInt = Integer.parseInt(age) + 2;// 输出结果:20System.out.println(ageInt);

    5. 高频区间的数据缓存

    此特性为包装类很重要的用途之一,用于高频区间的数据缓存,以 Integer 为例来说,在数值区间为 -128~127 时,会直接复用已有对象,在这区间之外的数字才会在堆上产生。

    我们使用 == 对 Integer 进行验证,代码如下:

    public static void main(String[] args) {        // Integer 高频区缓存范围 -128~127        Integer num1 = 127;        Integer num2 = 127;        // Integer 取值 127 == 结果为 true(值127 num1==num2 => true)        System.out.println("值127 num1==num2 => " + (num1 == num2));        Integer num3 = 128;        Integer num4 = 128;        // Integer 取值 128 == 结果为 false(值128 num3==num4 => false)        System.out.println("值128 num3==num4 => " + (num3 == num4));    }

    从上面的代码很明显可以看出,Integer 为 127 时复用了已有对象,当值为 128 时,重新在堆上生成了新对象。

    为什么会产生高频区域数据缓存?我们查看源码就能发现“线索”,源码版本 JDK8,源码如下:

    public static Integer valueOf(int i) {  if (i >= IntegerCache.low && i <= IntegerCache.high)    return IntegerCache.cache[i + (-IntegerCache.low)];  return new Integer(i);}

    由此可见,高频区域的数值会直接使用已有对象,非高频区域的数值会重新 new 一个新的对象。

    各包装类高频区域的取值范围:

    • Boolean:使用静态 final 定义,就会返回静态值;
    • Byte:缓存区 -128~127,全部缓存;
    • Short:缓存区 -128~127,部分缓存;
    • Character:缓存区 0~127,部分缓存;
    • Long:缓存区 -128~127,部分缓存;
    • Integer:缓存区 -128~127,部分缓存。

    包装类的注意事项

    • int 的默认值是 0,而 Integer 的默认值是 null。

    • 推荐所有包装类对象之间的值比较使用 equlas() 方法,因为包装类的非高频区数据会在堆上产生,而高频区又会复用已有对象,这样会导致同样的代码,因为取值的不同,而产生两种截然不同的结果。代码示例:

    public static void main(String[] args) {    // Integer 高频区缓存范围 -128~127    Integer num1 = 127;    Integer num2 = 127;    // Integer 取值 127 == 结果为 true(值127 num1==num2 => true)    System.out.println("值127 num1==num2 => " + (num1 == num2));    Integer num3 = 128;    Integer num4 = 128;    // Integer 取值 128 == 结果为 false(值128 num3==num4 => false)    System.out.println("值128 num3==num4 => " + (num3 == num4));    // Integer 取值 128 equals 结果为 true(值128 num3.equals(num4) => true)    System.out.println("值128 num3.equals(num4) => " + num3.equals(num4));}
    • Float 和 Double 不会有缓存,其他包装类都有缓存。

    • Integer 是唯一一个可以修改缓存范围的包装类,在 VM optons 加入参数:

    -XX:AutoBoxCacheMax=666 即修改缓存最大值为 666

    示例代码如下:

    public static void main(String[] args) {    Integer num1 = -128;    Integer num2 = -128;    System.out.println("值为-128 => " + (num1 == num2));    Integer num3 = 666;    Integer num4 = 666;    System.out.println("值为666 => " + (num3 == num4));    Integer num5 = 667;    Integer num6 = 667;    System.out.println("值为667 => " + (num5 == num6));}

    执行结果如下:

    值为-128 => true值为666 => true值为667 => false

    由此可见将 Integer 最大缓存修改为 666 之后,667 不会被缓存,而 -128~666 之间的数都被缓存了。

    先收下这份《Java 面试全解析》

    相关面试题

    1. 以下 Integer 代码输出的结果是?

    Integer age = 10;Integer age2 = 10;Integer age3 = 133;Integer age4 = 133;System.out.println((age == age2) + "," + (age3 == age4));

    答:true,false

    2. 以下 Double 代码输出的结果是?

    Double num = 10d;Double num2 = 10d;Double num3 = 133d;Double num4 = 133d;System.out.println((num == num2) + "," + (num3 == num4));

    答:false,false

    3. 以下程序输出结果是?

    int i = 100;Integer j = new Integer(100);System.out.println(i == j);System.out.println(j.equals(i));

    A:true,true
    B:true,false
    C:false,true
    D:false,false

    答:A

    题目分析:有人认为这和 Integer 高速缓存有关系,但你发现把值改为 10000 结果也是 true,true,这是因为 Integer 和 int 比较时,会自动拆箱为 int 相当于两个 int 比较,值一定是 true,true

    4. 以下程序执行的结果是?

    final int iMax = Integer.MAX_VALUE;System.out.println(iMax + 1);

    A:2147483648
    B:-2147483648
    C:程序报错
    D:以上都不是

    答:B

    题目解析:这是因为整数在内存中使用的是补码的形式表示,最高位是符号位 0 表示正数,1 表示负数,当执行 +1 时,最高位就变成了 1,结果就成了 -2147483648。

    5. 以下程序执行的结果是?

    Set<Short> set = new HashSet<>();for (short i = 0; i < 5; i++) {    set.add(i);    set.remove(i - 1);}System.out.println(set.size());

    A:1
    B:0
    C:5
    D:以上都不是

    答:5

    题目解析:Short 类型 -1 之后转换成了 Int 类型,remove() 的时候在集合中找不到 Int 类型的数据,所以就没有删除任何元素,执行的结果就是 5。

    6. short s=2;s=s+1; 会报错吗?short s=2;s+=1; 会报错吗?

    答:s=s+1 会报错,s+=1 不会报错,因为 s=s+1 会导致 short 类型升级为 int 类型,所以会报错,而 s+=1 还是原来的 short 类型,所以不会报错。

    7. float f=3.4; 会报错吗?为什么?

    答:会报错,因为值 3.4 是 double 类型,float 类型级别小于 double 类型,所以会报错。如下图所示:

    报错示例图

    8. 为什么需要包装类?

    答:需要包装类的原因有两个。

    ① Java 的设计思想是万物既对象,包装类体现了面向对象的设计理念;
    ② 包装类包含了很多属性和方法,比基础数据类型功能多,比如提供的获取哈希值(hashCode)或获取类(getClass)的方法等。

    9. 基础类 int 和包装类 Integer,在 -128~127 之间都会复用已有的缓存对象,这种说法正确吗?

    答:不正确,只有包装类高频区域数据才有缓存。

    10. 包装类 Double 和 Integer 一样都有高频区域数据缓存,这种说法正确吗?

    答:不正确,基础数据类型的包装类只有 Double 和 Float 没有高频区域的缓存。

    11. 包装类的值比较要使用什么方法?

    答:包装类因为有高频区域数据缓存,所以推荐使用 equals() 方法进行值比较。

    12. 包装类有哪些功能?

    答:包装类提供的功能有以下几个。

    • 功能丰富:包装类包含了有 hashCode、getClass 、max、min 等方法;
    • 可定义泛型类型参数:例如 List<Integer> list = new ArrayList<>(); ;
    • 序列化:包装类实现了 Serializable 接口,所以包装类天然支持序列化和反序列化;
    • 类型转换:包装类提供了方便的类型转换方法,比如 Integer 的 parseInt() 方法;
    • 高频区域数据缓存:高频区域可使用已有的缓存对象。

    详见正文“包装类型”部分内容。

    13. 泛型可以为基础类型吗?为什么?

    答:泛型不能使用基础数据类型。泛型在 JVM(Java虚拟机)编译的时候会类型檫除,比如代码 List<Integer> list 在 JVM 编译的时候会转换为 List list ,因为泛型是在 JDK 5 时提供的,而 JVM 的类型檫除是为了兼容以前代码的一个折中方案,类型檫除之后就变成了 Object,而 Object 不能存储基础数据类型,但可以使用基础数据类型对应的包装类,所以像 List<int> list 这样的代码是不被允许的,编译器阶段会检查报错,而 List<Integer> list 是被允许的。

    14. 选择包装类还是基础类的原则有哪些?

    答:我们知道正确的使用包装类,可以提供程序的执行效率,可以使用已有的缓存,一般情况下选择基本数据类型还是包装类原则有以下几个。

    ① 所有 POJO 类属性必须使用包装类;
    ② RPC 方法返回值和参数必须使用包装类;
    ③ 所有局部变量推荐使用基础数据类型。

    15. 基础数据类型在 JVM 中一定存储在栈中吗?为什么?

    答:基础数据类型不一定存储在栈中,因为基础类型的存储位置取决于声明的作用域,来看具体的解释。

    • 当基础数据类型为局部变量的时候,比如在方法中声明的变量,则存放在方法栈中的,当方法结束系统会释放方法栈,在该方法中的变量也会随着栈的销毁而结束,这也是局部变量只能在方法中使用的原因;
    • 当基础数据类型为全局变量的时候,比如类中的声明的变量,则存储在堆上,因为全局变量不会随着某个方法的执行结束而销毁。

    16. 以下程序执行的结果是?

    Integer i1 = new Integer(10);Integer i2 = new Integer(10);Integer i3 = Integer.valueOf(10);Integer i4 = Integer.valueOf(10);System.out.println(i1 == i2);System.out.println(i2 == i3);System.out.println(i3 == i4);

    A:false,false,false
    B:false,false,true
    C:false,true,true
    D:true,false,false

    答:B

    题目解析:new Integer(10) 每次都会创建一个新对象,Integer.valueOf(10) 则会使用缓存池中的对象。

    17. 3*0.1==0.3 返回值是多少?

    答:返回值为:false。

    题目解析:因为有些浮点数不能完全精确的表示出来,如下代码:

    System.out.println(3 * 0.1);

    返回的结果是:0.30000000000000004。

    点击可查《Java 面试全解析》还会讲什么


    此外,我们为本课程付费读者创建了《Java 面试全解析》的微信交流群,方便读者更有针对性地讨论课程相关问题,以及分享Java 技术和面试心得。

    入群请添加「GitChat 小助手泰勒」:识别下方二维码,或者添加 GitChatty5,注明「Java 面试」。

    温馨提示:需购买才可入群哦,加小助手后需要截图已购买页面来发给小助手验证一下~

    FtkDbtI-hx5hlJERoW0MGan1I8Ax

    第 1-3 课:深入理解字符串 + 面试题
    第 1-4 课:Java 中的运算符和流程控制 + 面试题
    第 1-5 课:深入了解 Java 中的异常处理 + 面试题
    第 1-6 课:玩转时间 + 面试题
    第 1-7 课:数组和排序算法 + 面试题 ####
    第 2-1 课:类与 Object + 面试题
    第 2-2 课:各种内部类和枚举类 + 面试题
    第 2-3 课:抽象类和接口 + 面试题
    第 2-4 课:克隆和序列化 + 面试题 ####
    第 3-1 课:集合详解(上) + 面试题
    第 3-2 课:集合详解(下) + 面试题
    第 3-3 课:泛型和迭代器 + 面试题
    第 3-4 课:数据结构——队列详解 + 面试题
    第 4-1 课:BIO、NIO、AIO 详解 + 面试题
    第 4-2 课:反射和动态代理 + 面试题 ####
    第 5-1 课:线程与死锁 + 面试题
    第 5-2 课:线程池——ThreadPoolExecutor + 面试题
    第 5-3 课:线程池——Executors + 面试题
    第 5-4 课:ThreadLocal 详解 + 面试题
    第 5-5 课:线程安全——synchronized 和 ReentrantLock + 面试题
    第 5-6 课:Java 并发包中的高级同步工具 + 面试题
    第 5-7 课:Java 中的各种锁和 CAS + 面试题 ####
    第 6-1 课:Spring 核心 + 面试题
    第 6-2 课:SpringMVC 核心 + 面试题
    第 6-3 课:SpringBoot 核心 + 面试题
    第 6-4 课:MyBatis 核心 + 面试题
    第 6-5 课:消息队列面试题汇总
    第 6-6 课:Java 分布式框架面试题合集 ####
    第 7-1 课:MySQL 面试题汇总
    第 7-2 课:Redis 面试题汇总
    第 7-3 课:设计模式常见面试题汇总
    第 7-4 课:算法常用面试题汇总
    第 7-5 课:JVM 面试题汇总
    第 7-6 课:常见面试题翻车合集
    结语

    阅读全文: http://gitbook.cn/gitchat/column/5d493b4dcb702a087ef935d9

    展开全文
  • SpringBoot 核心知识点整理!

    千次阅读 2020-06-20 00:40:30
    面向切面编程 文件上传下载 拦截器 springboot 入门项目详解 入门项目详解:SpringBoot 入门知识点详解 springboot 配置文件的拆分 SpringBoot 配置文件的拆分 springboot 组件管理 + 注入 SpringBoot 组件管理 + ...

    springboot 入门项目详解

    入门项目详解:SpringBoot 入门知识点详解

    springboot 配置文件的拆分

    SpringBoot 配置文件的拆分

    springboot 组件管理 + 注入

    SpringBoot 组件管理 + 属性注入

    springboot 集成 Jsp、Thymeleaf 模板

    SpringBoot 集成 JSP、Thymeleaf 模板 + Thymeleaf 基本使用

    springboot 集成 Mybatis

    一个项目了解 SpringBoot 集成 MyBatis

    springboot 开启热部署

    SpringBoot 开启热部署(jsp 页面热部署、devtools 全局热部署)

    springboot 中 logback 日志的集成

    SpringBoot logback 日志的集成

    面向切面编程

    具体:静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    springboot 是对原有项目中 spring 框架 和 springmvc 的近一步封装,因此在 springboot 中同样支持spring 框架中 AOP切面编程,不过在 springboot 中为了快速开发仅仅提供了注解方式的切面编程。
    在这里插入图片描述
    引入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    

    相关注解

    • @Aspect 用在类上,代表这个类是一个 切面
    • @Before 用在方法上,代表这个方法是一个 前置通知方法
    • @After 用在方法上,代表这个方法是一个 后置通知方法
    • @Around 用在方法上,代表这个方法是一个 环绕的方法

    注意:环绕通知存在返回值,参数为 ProceedingJoinPoint,如果执行放行,不会执行目标方法,一旦放行必须将目标方法的返回值返回,否则调用者无法接受返回数据。

    @Aspect // 切面
    @Configuration // 允许被扫描到
    // @Order(2) // 多个切面的执行顺序(越小越优先)
    public class MyAspect {
    
        // 环绕通知: 当目标方法执行时会先进入环绕通知, 然后再环绕通知放行之后进入目标方法,
        // 然后执行目标方法, 目标方法执行完成之后回到环绕通知
        @Around("within(com.yusael.service.*ServiceImpl)")
        public Object arount0(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("进入环绕通知业务处理0~~");
            System.out.println("目标方法名称: " + pjp.getSignature().getName());
            System.out.println("目标对象: " + pjp.getTarget());
            Object proceed = pjp.proceed();// 放行执行业务
            System.out.println("业务方法执行之后的业务处理0~~");
            System.out.println(proceed);
            return proceed;
        }
        
        // 前置通知方法: 在目标方法执行之前执行操作
        @Before("within(com.yusael.service.*ServiceImpl)")
        public void before(JoinPoint joinPoint) {
            System.out.println("目标方法名称: " + joinPoint.getSignature().getName());
            // System.out.println("目标方法参数: " + joinPoint.getArgs()[0]);
            System.out.println("目标对象: " + joinPoint.getTarget());
            System.out.println("前置通知业务的处理↑~~");
        }
        
        // 后置方法通知: 再目标方法执行之后执行操作
        @After("within(com.yusael.service.*ServiceImpl)")
        public void after(JoinPoint joinPoint) {
            System.out.println("后置通知的业务处理↓~~");
            System.out.println("目标方法名称: " + joinPoint.getSignature().getName());
            // System.out.println("目标方法参数: " + joinPoint.getArgs()[0]);
            System.out.println("目标对象: " + joinPoint.getTarget());
        }
        
    }
    

    文件上传下载

    springboot文件上传下载实战 —— 登录功能、展示所有文件

    springboot文件上传下载实战 ——文件上传、下载、在线打开、删除

    拦截器

    SpringBoot 2.x 中配置拦截器

    展开全文
  • 一份整理的蛮不错的Java核心知识点。覆盖了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。 获取方式:关注评论+转发,加入Java架构交流群:777584112,群主处免费领取。...
  • Numpy核心知识点总结上

    万次阅读 多人点赞 2020-10-12 16:58:32
    文章目录1. numpy.array 基础1.1 Python List vs. Python array vs. Numpy array1.2 初始numpy.array2. 创建 numpy.array2.1 Python range vs. np.arange vs. np.linspace2.2 随机函数2.2.1 np.random.randint2.2.2 ...
  • 高级信息系统项目管理师考试核心知识点---思维导图 软考必备.
  • JAVA核心知识点整理.pdf

    千次阅读 2019-02-25 16:43:25
    点击下方链接免费下载! https://cisco-huang.oss-cn-beijing.aliyuncs.com/文档/JAVA核心知识点整理.pdf
  • 计算机操作系统核心知识点总结&面试笔试要点

    万次阅读 多人点赞 2019-08-14 22:00:41
    操作系统之基础篇 一、 操作系统概述  1. 操作系统的演进   无操作系统:人工操作,用户独占,CPU等待人工操作,资源利用率很低。   批处理系统:批量输入任务,无需等待人工操作,资源利用率提升,提出多道...
  • 信息系统项目管理师-知识、变更、战略管理核心知识点思维脑图.rar 信息系统项目管理师-知识、变更、战略管理核心知识点思维脑图.rar 信息系统项目管理师-知识、变更、战略管理核心知识点思维脑图.rar
  • C++核心知识点整理——基础知识

    万次阅读 多人点赞 2017-04-20 14:36:14
    C++语言为包含操作符和解引用操作符的表达式提供了一个同义词: ->箭头操作符 。 如:sales_item *sp = &item1; (*sp).same_isbn(item2);等效于sp->same_isbn(item2); 运用 new 和 delete 语句创建和撤销动态...
  • hadoop核心知识点总结

    千次阅读 2016-10-14 17:22:24
    1、 安装hadoop需要配置的hadoop中的配置文件有哪些? hadoop-env.shyarn-env.shcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-...2、 Hadoop的核心模块和相应的进程 HDFS:namenode,datanode,secondarynameno
  •   项目管理本质上是知识,包括各种技术,例如工作分解结构(WBS)、关键路径分析和挣值管理,所以第二节是项目管理知识体系构成,如下图所示:   IPMP/PMP和PRINCE2是知识认证。也就是第三节和第四节的内容。  ...
  • 最强 Java 核心知识点整理

    万次阅读 多人点赞 2019-03-24 09:36:00
    又到了求职的金三银四的黄金月份,我相信有不少小伙伴已经摩拳擦掌的准备寻找下一份工作。就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非...
  • Numpy核心知识点总结下

    万次阅读 多人点赞 2020-10-12 22:38:06
    文章目录5. numpy.array 中的运算6. Numpy 中的聚合操作7. Numpy 中的arg运算8. Numpy 中的比较和Fancy Indexing 5. numpy.array 中的运算 6. Numpy 中的聚合操作 7. Numpy 中的arg运算 8. Numpy 中的比较和Fancy ...
  • 上图中:使用C3P0配置数据库连接池,属性参数名要按照规定写,不能自己定义,否则会报错,而使用dbcp就可以自定义参数名,这注意。  在加载配置文件时,都要加上类路径名classpath  在使用原始dao开发时,属性...
  • Java核心知识点从多个知识点分析: 包括JVM,Java集合,Java多线程并发,Java基础,spring原理,微服务,netty与RPC,网络,日志,zookeeper,kafka,rabbitMQ,hbase,mongoDB,cassandra,设计模式,负载均衡,数据库,...
  • 2021 Java核心知识点精心整理(全是精华)

    万次阅读 多人点赞 2021-02-02 19:32:21
    我不是针对谁,我是说其它面试题都是辣鸡
  • 1. 信息化和信息系统 信息系统与信息化 信息系统开发技术 信息系统集成技术 软件工程 新一代信息技术 信息系统安全技术 信息化发展与应用 信息系统服务管理 信息系统规划 企业首席信息官及其职责 ...
  • 考研数学核心知识点总结

    千次阅读 2018-03-08 14:16:34
    点击打开链接
  • JAVA核心知识点--Future

    万次阅读 2017-06-02 19:06:29
    参考书籍:《Java特种兵(上册)》 接口 Future<V>可用于获取异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get() 方法来获取结果,如有必要,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 456,498
精华内容 182,599
关键字:

核心知识点