精华内容
下载资源
问答
  • R语言典型相关分析
    万次阅读 多人点赞
    2017-02-27 16:40:46

    自己整理编写的R语言常用数据分析模型的模板,原文件为Rmd格式,直接复制粘贴过来,作为个人学习笔记保存和分享。部分参考薛毅的《统计建模与R软件》和《R语言实战》

    1 关键点:典型相关分析

    典型相关分析是用于分析两组随机变量之间的相关程度的一种统计方法,它能够有效地揭示两组随机变量之间的相互(线性依赖)关系

    例如 研究生入学考试成绩与本科阶段一些主要课程成绩的相关性

    将研究两组变量的相关性问题转化为研究两个变量的相关性问题 此类相关为典型相关#

    2 分类:

    总体典型相关

    样本典型相关

    3 R语言提供的计算函数:

    典型相关计算 cancor(x,y,xcenter=TRUE,ycenter=TRUE)

    x,y是相应的数据矩阵 xcenter,ycenter是逻辑变量 TRUE是将数据中心化 FALSE是不中心化

    4 分析结果含义

    cor是典型相关系数

    xcoef是对应于数据x的系数 又称关于数据x的典型载荷即样本典型变量U系数矩阵A的转置

    xcenter是数据X的中心 即数据X的样本均值

    y是对应于数据x的系数 又称关于数据y的典型载荷即样本典型变量V系数矩阵B的转置

    ycenter是数据Y的中心 即数据Y的样本均值

    5 分析步骤

    (1.)载入原始数据 data.frame

    (2.)原始数据标准化 scale

    (3.)典型相关分析 cancor

    (4.)相关系数显著性检验 corcoef.test.R


    I.典型相关分析的计算

    现对20名中年人测得三个生理指标:体重(X1) 腰围(X2) 脉搏(X3);三个训练指标:引体向上(Y1) 起座次数(Y2) 跳跃次数(Y3) 试分析这组数据的相关性

    #用数据框的形式输入数据矩阵
    test<-data.frame(
      X1=c(191, 193, 189, 211, 176, 169, 154, 193, 176, 156, 
           189, 162, 182, 167, 154, 166, 247, 202, 157, 138), 
      X2=c(36, 38, 35, 38, 31, 34, 34, 36, 37, 33, 
           37, 35, 36, 34, 33, 33, 46, 37, 32, 33),
      X3=c(50, 58, 46, 56, 74, 50, 64, 46, 54, 54,
           52, 62, 56, 60, 56, 52, 50, 62, 52, 68), 
      Y1=c( 5, 12, 13,  8, 15, 17, 14,  6,  4, 15, 
            2, 12,  4,  6, 17, 13,  1, 12, 11,  2), 
      Y2=c(162, 101, 155, 101, 200, 120, 215,  70,  60, 225, 
           110, 105, 101, 125, 251, 210,  50, 210, 230, 110), 
      Y3=c(60, 101, 58, 38, 40, 38, 105, 31, 25, 73, 
           60, 37, 42, 40, 250, 115, 50, 120, 80, 43)
    )
    #为了消除数量级的影响 将数据标准化处理 调用scale函数
    test<-scale(test)
    #对标准化的数据做典型相关分析
    ca<-cancor(test[,1:3],test[,4:6])
    #查看分析结果
    ca

    结果说明:
    1) cor; xcoef是对应于数据X的系数, 即为关于数据X的典型载荷; ycoefY; xcenter与$ycenter是数据X与Y的中心, 即样本均值;

    2) 对于该问题, 第一对典型变量的表达式为

    U1 = -0.17788841x1 + 0.36232695x2 - 0.01356309x3

    U2 = -0.43230348x1 + 0.27085764x2 - 0.05301954x3

    U3 = -0.04381432x1 + 0.11608883x2 + 0.24106633x3

    V1 = -0.08018009y1 - 0.24180670y2 + 0.16435956y3

    V2 = -0.08615561y1 + 0.02833066y2 + 0.24367781y3

    V3 = -0.29745900y1 + 0.28373986y2 - 0.09608099y3

    相应的相关系数为:p(U1,V1)=0.79560815 ,p(U2,V2)=0.20055604 ,p(U3,V3)=0.07257029

    可以进行典型相关系数的显著性检验, 经检验也只有第一组典型变量.

    下面计算样本数据在典型变量下的得分:

    #计算数据在典型变量下的得分 U=AX  V=BY
    U<-as.matrix(test[, 1:3])%*% ca$xcoef ; U
    V<-as.matrix(test[, 4:6])%*% ca$ycoef ; V
    #调整图形
    opar <- par(mfrow = c(1, 1),mar = c(5,4,1,1))
    #画出以相关变量U1、V1和U3、V3为坐标的数据散点图
    plot(U[,1], V[,1], xlab="U1", ylab="V1")
    plot(U[,3], V[,3], xlab="U3", ylab="V3")
    #调整图形
    par(opar)

    由散点图可知 第一典型相关变量分布在一条直线附近;第三典型相关变量数据很分散。因为第一典型变量其相关系数为0.79560815,接近1,所以在一直线附近;第三典型变量的相关系数是0.07257029,接近于0,所以很分散。


    II.典型相关系数的显著性检验

    作为相关分析的目的 就是选择多少对典型变量?因此需要做典型相关系数的显著性检验。若认为相关系数k为0 就没有必要考虑第k对典型变量了

    #相关系数检验R程序
    corcoef.test<-function(r, n, p, q, alpha=0.1){
       #r为相关系数 n为样本个数 且n>p+q
       m<-length(r); Q<-rep(0, m); lambda <- 1
       for (k in m:1){
         #检验统计量 
         lambda<-lambda*(1-r[k]^2); 
          #检验统计量取对数
         Q[k]<- -log(lambda)  
       }
       s<-0; i<-m 
       for (k in 1:m){
         #统计量  
         Q[k]<- (n-k+1-1/2*(p+q+3)+s)*Q[k]
          chi<-1-pchisq(Q[k], (p-k+1)*(q-k+1))
          if (chi>alpha){
             i<-k-1; break
          }
          s<-s+1/r[k]^2
       }
      #显示输出结果 选用第几对典型变量
        i
    }
    source("corcoef.test.R")
    #输入相关系数r,样本个数n,两个随机向量的维数p和q,置信水平a(缺省值为0.1)
    corcoef.test(r=ca$cor,n=20,p=3,q=3)
    #程序输出值为典型变量的对数

    最终程序运行结果显示选择第一对典型相关变量。我们只利用第一典型变量分析问题,达到降维的目的。

    write.csv(test,"test_test.csv") 
    更多相关内容
  • 2021届高考英语二轮复习之阅读理解“典型技巧”高效练典型技巧14短语含义的获取策略含解析202103052159
  • 2021届高考英语二轮复习之阅读理解“典型技巧”高效练典型技巧17特定句子含义的理解含解析202103052162
  • 2021届高考英语二轮复习之阅读理解“典型技巧”高效练典型技巧15单一词汇含义的猜测含解析202103052160
  • FPGA应用开发入门与典型实例+FPGA的开发流程和关键步骤的含义。。这可是光盘里的好资料,分享了。
  • 上的四个因素的四个典型相关性的含义。 作者对 Quay 和 Peterson (1967) 行为问题清单 (BPCL) 进行了一系列三项研究。 第一个(Touliatos & Lindholm, 1975, in press)考察了学校年级、性别和社会阶层对
  • iups典型信令数据

    2019-02-17 23:14:45
    iups接口数据、pcap格式,典型信令数据,供大家分析和学习
  • 第 6 章 电子商务典型应用6.1 企业电子商务应用6.2 金融电子商务6.3 电子政务6.4 移动商务6.2 金融电子商务6.2.1 网上银行6.2.2 网上证券6.2.3 网上保险1.网上银行 银行电子商务是指银行经营活动的各个方面全面实现...
  • 第 6 章 电子商务典型应用;6.2 金融电子商务;1.网上银行;1网络银行的含义 ;网络银行的功能 ;网络银行的特点;网络银行产生的客观基础 ;运营成本比较;交易成本比较;网上银行运营机制的两种模式;2网络银行的基本业务;3....
  • 含义;生活案例;说道产品界面而言首先需要达成视觉产出的目的相当于上线版本的预览 当下很多公司用户体验设计需要考虑投资人的思维创业者的思维财务顾问的思维;概括介绍;实际案例;概括介绍;可用性;趣味性;交互职责;...
  • 重点1:了解典型流程的信令交互顺序 重点2:了解信令中重点字段的具体含义 重点3:了解部分事件的触发机制,如PSMM消息的发送条件
  • 感谢您下载包图网平台上提供的PPT作品为了您和包图网以及原创...视觉风格分析 评价分析 PART 01 挑选竞品 具体含义 流程介绍 具体含义 竞品的分析就是通过产品所提出的需求去寻找目前市场上有相同功能的产品并且去分析
  • 个人收集整理资料 仅供交流学习 勿作商业用途 15算法初步 151 算法的含义与流程图 知识网络 1 算法的含义能用自然语言描述算法 2 设计流程图表达解决问题的过程了解算法和程序语言的区 别理解流程图的三种基本逻辑...
  • 首先,对描述数据实践的一些属性的共同理解意味着从网站隐私政策中半自动提取含义可能能够帮助典型用户并通过向用户传达真实含义来提高通知的有效性。 然而,专家之间的分歧以及专家与其他群体之间的分歧反映了典型...
  • 学 海 无 涯 本资料来源于七彩教育网 15算法初步 151 算法的含义与流程图 知识网络 1 算法的含义能用自然语言描述算法 2 设计流程图表达解决问题的过程了解算法和程序语言的区别理解流程图的三种基 本逻辑结构会用...
  • 注:“零初始条件”有两个含义: ①指输入在t=0之后才作用于系统,因此t≤0时系统输入量及其各阶导数为0; ②输入作用于系统之前,系统是相对静止的,就是系统的输出量及其各阶导数在t≤0时也为0。 G(s)的常用形式...

    1、建模方法

    实验法:人为给系统施加某种测试信号,记录相应的输出,然后用适当的数学模型去逼近,也称为系统辨识方法;
    解析法:利用已有的物理规律和化学规律来分析系统各部分的运动机理,获取其运动方程。

    2、常用的数学模型

    ①时域中常使用的数学模型:微分方程、差分方程;
    ②复域中常用的数学模型:传递函数、结构图;
    ③频域中常用的数学模型:频率特性。

    2.1、微分方程:通常,解析法对系统或元部件建模如下:

    ①分析系统运动的因果关系,确定其输入、输出、中间变量及其之间关系;
    ②从输入端开始,按照信号的传递顺序,依据各变量所遵循的物理(或化学)规律,列写出各个元部件的动态方程;
    ③消去中间变量,写出输入与输出变量的微分方程。
    注:系统的数学模型越精确,微分方程的阶次越高,直接对高阶微分方程求解困难。
    如果系统参数或者结构发生变化,需要重新建模并求解微分方程,不利于系统的分析与设计。

    2.2、传递函数:在零初始条件下,输出信号c(t)的拉氏变换C(s)与输入信号r(t)的拉氏变换R(s)之比,记为G(s):G(s)=

    =
    注:“零初始条件”有两个含义:
    ①指输入在t=0之后才作用于系统,因此t≤0时系统输入量及其各阶导数为0;
    ②输入作用于系统之前,系统是相对静止的,就是系统的输出量及其各阶导数在t≤0时也为0。
    • G(s)的常用形式:
    ①有理分式形式
    ,式中

    ②零极点形式
    ,式中
    为零点,
    为极点,
    为增益;

    ③时间常数形式
    为时间常数,
    为放大系数。
    • 由G(s)时间常数形式可知,任一复杂系统的G(s)可由如下6个典型环节组成:
    ①比例环节:G(s)=
    =K;

    ②惯性环节:G(s)=
    =
    ;(因储能元件,输出量不能立即跟上输入信号)

    ③积分环节(也称无差环节):G(s)=
    =
    (一阶),
    (二阶);

    ④微分环节: G(s)=
    =s(理想微分环节),
    (一阶),
    (二阶);

    ⑤振荡环节:G(s)=
    =
    ,式中
    称为无阻尼振荡频率,
    为阻尼比;

    ⑥滞后环节(也称延迟环节): G(s)=
    注:i.因为实际物理系统总是存在惯性,并且能源功率有限,使得传递函数的分母阶次n总是
    大于或等于分子阶次m;
    ii.传递函数只取决于系统的结构和参数,与外界作用无关;
    iii.传递函数的拉氏反变换是系统的脉冲响应,即G(s)=C(s)/R(s)=C(s)(因为r(t)=δ(t)的拉氏变
    换为R(s)=1)。

    2.3、结构图 如下图,R(s)为指定输入信号,N(s)为干扰信号,C(s)为输出信号,E(s)为误差信号,其中R(s)与N(s)为系统的两个输入,E(s)和C(s)为系统的两个输出。

    8c349d13b9a1d94b6c62c324462e0a3a.png
    • 系统的开环传递函数:系统的主反馈信号B(s)与偏差信号E(s)之比,即
    注:这里的开环传递函数是指闭环控制系统里的某一处开环的传递函数,而不是指开环控制
    系统的传递函数。
    • 系统的闭环传递函数

    ①当N(s)=0时,输出C(s)对给定输入R(s)的传递函数为

    ②当R(s)=0时,输出C(s)对扰动N(s)的传递函数为

    当给定输入和扰动同时作用被控系统时,根据线性叠加原理,有

    • 系统的误差传递函数

    ①当N(s)=0时,则误差E(s)对R(s)的传递函数为

    ②当R(s)=0时,则误差E(s)对N(s)的传递函数为(简称扰动误差传递函数)

    当给定输入和扰动同时作用被控系统时,根据线性叠加原理,系统误差为

    注:当系统参数、结构发生变化时,微分方程形式模型需要重新建模,而传递函数形式模型
    不必重新建模,这是因为经过拉普拉斯变换后串联、并联、反馈连接形式的环节,其运算变
    为乘、加等低级运算,不再是微分运算。

    2.4、频率特性:稳定的线性定常系统在正弦信号的作用下,系统输出的稳态分量与输入的复数之比;其中,输出的稳态分量振幅与输入的振幅比A(w)称为幅频特性,输出的稳态分量相位与输入的相角之差φ(w)称为相频特性,即

    注:i.频率特性表征了系统或元件对不同频率正弦输入的响应特性;
    ii.φ(ω)大于零时称相角超前,小于零时称相角滞后;
    iii.频率特性反映了系统的内在性质,与外界因素无关。

    3、数学模型是等价变换的:微分方程、传递函数、结构图、频率特性之间一一对应的。


    欢迎大家前来交流相关自动控制问题。如有不对的地方,望不吝赐教!

    ***以上内容未经本人同意,禁止转载***

    展开全文
  • ; 1956年8月在美国汉诺斯小镇宁静的达特茅斯学院中一些科学家正聚在一起讨论着一个完全不食人间烟火的主题...专家系统的含义;人工智能重要组成部分;五焕发新生;计算机视觉;语音工程;自然语音处理;决策系统;大数据应用;
  • 具体含义;竞品分析;梳理交互逻辑;AE;AI;PS;基本介绍;简要介绍;基本概括;功能性图标;简要介绍;游戏UI与应用UI的学习内容不同 平时手绘部分用的不是特别多软件学习广度比较大由于入行人越来越多导致现在公司都需要全能...
  • 首先将X和Y的观测值分别排序,分别得各自得秩统计量,Spearman相关检验的含义是直接对秩统计量计算相关系数,即计算R和S的相关系数 : 公式: 其中: #------------spearman---- # 法1 ## spearman系数 cor(x,y,...

    简单相关系数

    简单相关系数的代码实现
    1.XY都是随机变量,地位对称
    2.相关系数只反映两变量之间线性相关的程度,不能说明其非线性相关关系。
    3.虽能度量相关关系,但是不能度量变量间的因果关系
    公式
    在这里插入图片描述

    library('charlatan') # 造假数据的包
    # 创建10个名
    name = ch_name(10)
    
    # 创建10个均分分布的数据 看看直方图
    # 产生数据
    set.seed(1) # 保持每次产生数据已知
    x1 = ch_unif(10)
    hist(x1,breaks = 4)
    x2 = ch_unif(10)/200
    hist(x2,breaks = 4)
    y = 0.5*x1+0.14*x2+rnorm(1) # 加噪声
    
    
    # 法1
    # 计算相关系数
    fun_rxy = function(x,y){
      x_bar = mean(x)
      y_bar = mean(y)
      print(x_bar)
      print(y_bar)
      fenzi = sum((x-x_bar)*(y-y_bar))
      print(fenzi)
      fenmu = sqrt(sum((x-x_bar)^2)*sum((y-y_bar)^2))
      print(fenmu)
      r_xy = fenzi/fenmu
      print('相关系数为:')
      print(r_xy)
    }
    fun_rxy(x1,y)
    
    # 法2
    ## pearson系数
    pearson<-function(x,y){
      xp<-sum(x)/length(x)
      yp<-sum(y)/length(y)
      f1 = f2 = f3 = 0
      for (i in 1:length(x)){
        f1 = f1 + (x[i]-xp)*(y[i]-yp)
        f2 = f2 + (x[i]-xp)^2
        f3 = f3 + (y[i]-yp)^2
      }
      cor = f1/(sqrt(f2)*sqrt(f3))
      
      return(cor)
    }
    pearson(x1,y)
    
    
    cor(x1,y,method = "pearson")
    

    偏相关系数

      设x1 ,x2,y是三个变量,如果要计算x2给定的条件下, x1 和y的相关系数,应该用偏相关系数更合理,那么偏相关系数为: 
    

    公式:
    在这里插入图片描述

    #-------------偏相关系数
    #R语言包里面有 偏相关系数
    library(ggm)
    df = data.frame(x1,x2,y)
    jsbl = c(1,3) # x1,y计算相关系数
    kzbl = c(2) # x2下标是控制变量
    con = c(jsbl,kzbl)
    c1 = cov(df) # 协方差
    
    pcor1 = function (u, S) 
    {
      k <- solve(S[u, u],tol=2e-21)
      k[1, 2]/sqrt(k[1, 1] * k[2, 2])
    }
    pcor1(con,c1) # 偏相关
    
    # 法2
    r_yx1x2 = (cor(x1,y)-cor(x2,y)*cor(x1,x2))/(sqrt(1-cor(x2,y)^2)*sqrt(1-cor(x1,x2)^2))
    r_yx1x2
    

    spearman相关系数

    在给定一列数对(x1,y1),····,(xn,yn)之后,要检验他们所代表的二元变量X和Y是否相关。首先将X和Y的观测值分别排序,分别得各自得秩统计量,Spearman相关检验的含义是直接对秩统计量计算相关系数,即计算R和S的相关系数 :
    公式:
    在这里插入图片描述
    其中:
    其中

    #------------spearman----
    # 法1
    ##  spearman系数
    cor(x,y,method = "spearman")
    spearman<-function(x,y){
      u<-rank(x)
      v<-rank(y)
      up<-sum(u)/length(u)
      vp<-sum(v)/length(v)
      f1 = f2 = f3 = 0
      for (i in 1:length(u)){
        f1 = f1 + (u[i]-up)*(v[i]-vp)
        f2 = f2 + (u[i]-up)^2
        f3 = f3 + (v[i]-vp)^2
      }
      cor = f1/(sqrt(f2)*sqrt(f3))
      
      return(cor)
    }
    spearman(x1,y)
    
    
    #法2
    ##  spearman系数
    f1 = 0
    cor(x1,y,method = "spearman")
    spearman<-function(x,y){
      n<-length(x)
      u<-rank(x)
      v<-rank(y)
      f1 = f2 = f3 = 0
      for (i in 1:n){
        f1 = f1 + (u[i]-v[i])^2
      }
      cor = 1-6*f1/(n*(n^2-1))
      
      return(cor)
    }
    spearman(x1,y)
    
    

    复相关系数

          简单相关系数和偏相关系数实际上均是讨论两个变量的关系,但常常我们会讨论一个变量和一组变量的相关,这叫复相关系数。实际上一个变量和一组变量的复相关是以这个变量为被解释变量,以这组变量为回归因子,建立回归模型的可决系数R2. 
    

    总体典型相关

    我用内置的检验,老是发现不对,也不知道错在哪里!

    #--------------典型相关系数和典型变量求解
    ## 定义函数,求两个矩阵的典型变量和典型相关系数
    My.rtest = function(x,y){
      # 计算相关系数矩阵
      R11 = cov(x)
      R12 = cov(x,y)
      R21 = cov(y,x)
      R22 = cov(y)
      
      M1 = solve(R11)%*%R12%*%solve(R22)%*%R21
      M2 = solve(R22)%*%R21%*%solve(R11)%*%R12
      
      #使用函数eigen()计算特征值和特征向量
      ev1 = eigen(M1) 
      ev2 = eigen(M2) 
      
      lamda0 = ev1$val #访问列表values项,即特征值
      lamda = sqrt(lamda0) #典型相关系数
      
      #a_k = solve(R11)^(0.5)%*%ev1$val
      #b_k = (1/lamda[1])*solve(R22)^(0.5)%*%R21%*%lamda
      alpha = ev1$vec #访问列表vectros项,即特征向量
      beta = ev2$vec #访问列表vectros项,即特征向量
      
      #求典型变量u和v的系数
      u = t(alpha) #第k行即第k个典型变量的系数
      v = t(beta) #第k行即第k个典型变量的系数
      #print(a_k)
      #u = t(a_k)%*%x
      #v = t(b_k)%*%y
      
      
      result = list(lamda=lamda,u=u,v=v)
      print(result)
    }
    
    #随机产生数据矩阵
    #x1 = matrix(runif(10,0,5),10)
    #x2 = matrix(runif(10,0,10),10)
    #x = cbind(x1,x2)
    
    #y1 = matrix(runif(10,-2,5),10)
    #y2 = matrix(runif(10,3,6),10)
    #y3 = matrix(runif(10,-10,6),10)
    #y =cbind(y1,y2,y3)
    
    x1=c(191, 193, 189, 211, 176, 169, 154, 193, 176, 156, 189, 162, 182, 167, 154, 166, 247, 202, 157, 138)
    x2=c(36, 38, 35, 38, 31, 34, 34, 36, 37, 33, 37, 35, 36, 34, 33, 33, 46, 37, 32, 33)
    x3=c(50, 58, 46, 56, 74, 50, 64, 46, 54, 54, 52, 62, 56, 60, 56, 52, 50, 62, 52, 68)
    x = scale(cbind(x1,x2,x3))
    y1=c( 5, 12, 13,  8, 15, 17, 14,  6,  4, 15, 2, 12,  4,  6, 17, 13,  1, 12, 11,  2)
    y2=c(162, 101, 155, 101, 200, 120, 215,  70,  60, 225, 110, 105, 101, 125, 251, 210,  50, 210, 230, 110)
    y3=c(60, 101, 58, 38, 40, 38, 105, 31, 25, 73, 60, 37, 42, 40, 250, 115, 50, 120, 80, 43)
    y = scale(cbind(y1,y2,y3))
    
    
    #调用该函数
    My.rtest(x,y)
    
    # R语言内置检验
    ca = cancor(x,y)
    ca
    
    
    展开全文
  • 《Java面试全解析:核心知识点与典型面试题》 。 课程亮点 500道 Java 常见面试题 + 10万字核心知识解析 丰富的 Java 技术栈:基础和框架,线程池和锁优化,SpringBoot 和分布式消息队列,数据结构和常用算法,设计...

    课程背景

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

    然而,面试人群众多,技术市场却相对冷淡,面试的同学们不得不面临着 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

    展开全文
  • 语义搜索是知识图谱最典型的应用,它首先将用户输入的问句进行解析,找出问句中的实体和关系,理解用户问句的含义,然后在知识图谱中匹配查询语句,找出答案,最后通过一定的形式将结果呈现到用户面前。 2 智能...
  • 1.典型相关分析:两组变量之间的相关问题 cancor() cancor(x, y, xcenter = TRUE, ycenter = TRUE) x,y为两组变量的数据矩阵;xcenter和ycenter是逻辑值,表示是否中心化,实际中一般采用默认值TRUE 注意...
  • 浅谈大数据的四个典型特征。

    千次阅读 2020-09-26 11:40:09
    大数据(Big Data)是指“无法用现有的软件工具提取、存储、搜索、共享、分析和处理的海量的、复杂的数据集合。...当前,典型个人计算机硬盘的容量为TB量级,而一些大企业的数据量已经接近EB量级。 二...
  • ZooKeeper八大典型的应用场景

    千次阅读 2020-01-26 17:18:57
    但是UUID也具有一定的缺陷,比如长度过长,含义不明等。 而ZooKeeper实现分布式唯一ID只要创建顺序节点就可以了。 在ZooKeeper中,每一个数据节点都能够维护一份子节点的顺序顺列,当客户端对其创建一个顺序子...
  • 典型飞行控制系统的回路构成

    千次阅读 2016-09-28 21:42:34
    典型飞行控制系统的回路构成 内回路 (姿态):p、q、r、α、β 外回路(姿态运动):phi、theta、psi 引导回路(轨迹运动):X、Y、Z 控制律先调内回路,再调外回路,最后调引导回路(又称导航回路)。
  • 典型环节的单位阶跃响应.doc

    千次阅读 2021-04-22 08:25:02
    典型环节的单位阶跃响应实验二 典型环节的单位阶跃响应一、实验目的1、根据对象的单位阶跃响应特性,掌握和深刻理解几种典型环节的特性以及它们特性参数的含义。2、研究对象传递函数的零极点对系统动态特性的影响。3...
  • 大数据的四个典型特征

    万次阅读 2018-09-09 12:48:53
    当前,典型个人计算机硬盘的容量为TB量级,而一些大企业的数据量已经接近EB量级。  二是数据类型繁多(Variety)。这种类型的多样性也让数据被分为结构化数据和非结构化数据。相对于以往便于存储的以文本为主的结构...
  • DDoS 攻击的典型目标包括: 互联网购物网站 网上赌场 任何依赖提供在线服务的企业或组织 DDoS 攻击的工作原理 网络资源(例如 Web 服务器)对它们可以同时提供服务的请求数量有一个有限的限制。除了服务器的容量...
  • Vivado中各个文件的含义

    千次阅读 2021-01-17 10:06:33
    Vivado中各个文件的含义 今天给大侠带来了Xilinx vivado中各个文件的含义,话不多说,上货。 在Xilinx ISE中不同的操作都有不同的文件类型对应,例如综合、布局、布线、生成比特流等都会产生特定格式的文件,在...
  • 公众号后台回复“图书“,了解更多号主新书内容 导读:本文将详细阐述知识图谱的基本概念,包括知识图谱的背景、定义以及典型应用。作者:邵浩 张凯 李方圆 张云柯 戴锡强来源:大数据DT(I...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 138,632
精华内容 55,452
关键字:

典型的含义