多核学习综述
特征融合,多核学习,核方法是机器学习的一种重要思想8期汪洪桥等:多核学习方法10391.2容许核的构造数据的基因功能分类问题,其中就讨论了前期、中期利用核函数可以大大简化计算,但如何针对具和后期三种集成方式.早期集成是指数据的集成,后体的问题设计出最适当的核函数却是一个难点实期集成是指分类器结果的集成,而中期集成就是核际上,经常采用的方法是直接定义核函数,从而隐矩库的组合,它通过对多个基本核矩阵进行合成得含地定义了特征空间. Mercer条件是检验核函数到,基于这种多核矩阵直接求和方式,可以实现异构是否定义了一个特征空间的充分条件,我们称满足数据源的融合,用来训练分类器此后,在蛋白质功能预测56与定位,蛋白质容许楼满是一些闭包性质或条件6,这使得我分子间的交互预测2,蛋白质折叠识别和远端同源们可以从些简单的核函数设计出复杂的核函数性检测2等方向,由于涉及到多特征空间或有效属性质1.容许核的正系数线性组合是容许核性的集合( roups of attributes available)问题,来性质2.容许核的乘积是容许核自异构源的数据具有不同特性,如全局特性、局部特性质3.函数乘积的积分是容许核.性等,这就需要核矩阵在集成时可以评佔这些潜在设s(x,)是一个定义在X×X上的函数,使的异构目标描述子各自的贡献.因此出现了一些加得k(x,x)=/5x,x)(2,x)dx存在则ka,2)板图多核合成方法,这类多核方法都无追过多个核是一个容许核数的线性组合得到的,图1所示的就是其构成的性质4.平移不变核是容许核的充要条件示意图个平移不变核k(x,2)=k(-x)是容许核,类别标号或预测值结果输出)且仅当其傅里叶变换F(u)-(2x)-号xk(x)i(ur)dx是非负的分类或回归(分类器或回归R效性质5.内积型核是容诈核的必要条件.合成核空闫合成核若一个内积型核k(x,2)=k(x·z)是容许核,则它必满足v≥0.k(5)≥0.0k()≥0且k(5)Kernel sKernel h5k()>0核空间(kemC性质6.内积型核是容许核的充要条件.一个内积型核k(x,z)=k(x·z)是容许核,当征空间(C且仅当其幂级数展开式k(t)=∑0ant中所有系数an≥0.对于有限维的空间,条件可以稍微减弱输入数据图1多核函数线性组合合成示意图当前已经仔在较多的满足 Mercer条件的核函rig. 1 Sketch map of composition using multiple kernel数,常见核函数通常可分为两类:局部核和全局核6ar而局部核选择不同的核参数,又可分为大尺度核与小尺度核.在一些复杂情形下.同时考虑核机器分下面呆用公式的形式对上述线性组合合成核进类、回归性能和泛化能力,将不同核组合使用,将是行描述.假定k(x,2)是已知核函数,k(x,2)是它的更合理的选择归一化形式,例如核函数k(x,z)可以采用如下方法进行归一化:√k(x,x)k(z,x).采用以引入的符2基本多核学习:合成核方法号,可以定义以下几种合成核:将不同特性的核函数进行组合,获得多类核函a)直接求和核( Direct summation kernel)数的优点,可以得到更优的映射性能.并且,典型的学习问题经常涉及到多种或者异构的数据,多核方k(,2)=∑k(x,2)法可以提供更佳的灵活性.此外,它可以作为一种巧妙的方法来解释学习结果、使得应用问题可以得到b)加求和核( Weighted summation kernel)更深入的理解.这就是多核学习的一类基本方法,即合成核方法k(x,2)=∑(,2,≥0,∑月=1(6)2.1合成核的构造1)多核线性组合合成方法c)加权多项式扩展核( Weighted polynomial多核学习最早从生物信息学领域得到应用和认extended kernel同.如 Pavlidis等20在2001年就研究了基于异构k(x,z)=ak1(x,2)+(1-a)k2(x,2)(7)1010自动化学报36卷其中.k(x,2)是k(x,x)的多项式扩展是,该合成核矩阵的大小为(s×n)×(s×n),而原近来,这类合成核法又得到一些改进,在图始核矩阵的大小都是n×n,由于合成核矩阵是原始像目标的识别领域得到广泛应用.如在金字塔框架核矩阵规模的§倍,因此样本特征必须被复制,使运对日标形状进行多核表示阿,或釆用多核方法,算量成倍增加自动获得基」决策的一种相应目标类别的稀疏依赖3)其他改进合成核方法图,实现了多类目标联合检测③2].提高了目标的识近年来,针对多核学习中核函数的选取以及杖别率.通过同时考虑多核线性组合的稀疏性和分类值系数的改进,又出现了一些新的多核合成方法,器的强判别力,将多核学习问题转化为不同的优化如:问题58.63,或通过多对象描述子、多特征空间的整a)非平稳多核学习合,并进行快速求解64.此外,合成核方法在特征提前述的多核线性组合方法都是对核函数的平稳取、处理及应用7、分类972-4、图像分割、组合,即对所有输入样本,不同的核对应的权值是系统辨识等方面又得到了一些成功应用不变的.无形中对样本进行了一种平均处理. Lewis2)多核扩展合成方法等吲提出了一种多核的非平稳组合方法,对每个输述合成核方法都是试图通过一种求和“平均入样本配以不同的权值系数.如常规SVM判别函化”的思想42来实现不同核矩阵融合.然而,这里数为存在个丢失原始核矩阵信息的风险.比如,如果数据集的局部分布是多变的.不同的核处理不同的区f(c)=∑0r,m)+b(1域会得到更好的结果,对不同核函数采用平均的方法将丢失刻画这些局部分布的性能.为了实现核矩引入不同的加权系数,典型的合成核SVM的阵的组合而不丢失任何原始信息,可以考虑将多核判别函数可以改写为矩阵进行扩展合成42],新的核矩阵由原核矩阵和其他不同的核矩阵共同构成.在这个更大的核矩阵中原核矩阵仍然存在.因此,原始核函数的性质得以保∫(x)-∑m∑k(x,x)+b(1留.该合成核矩阵的形式为而对于非平稳的合成核SVM,其判别函数改进11K1,2K为2.2K∑a:∑()k(c;,m)(12)K1 K可以看出,原始核矩阵位于新矩阵的对角线上在最大熵判别( Maximum entropy discrimination,其他所有元素是定义为(Kn)3=Fn(m,)的MED)框架下,通过使用一种大间隔隐变量生成两个不同核矩阵的混合,可由如下公式求得(以两个模型,使得隐参数估计问题可以通过变化边界和高斯核为例)一个内点优化过程来表示,并且相应的参数估计可以通过快速的序列最小优化( Sequential minimaloptimization,SMO)算法实现.通过多种数据集的4:4+(9)实验验证,非平稳的多核学习方法具有更好的通用性.很明显,当p=p时,Kp=knb)局部多核学习实验结果显示,当数据集具有变化的局部数据此后,仍旧是针对多核学习在整个输入空间中分布时,这种合成核方法将是更好的选择此外,通对某个核都是分配相同权值的问题,G6nen等0常核组合方法在很大程度上依靠训练数据,并且必利用一种选通模型( Galing nodel)部地选择合须道过学习获取一些权系数,以标识每个核的重要适核函数,提出了一种局部多核学习算法在SVM性.而在护展合成核方法中,这些核函数的重要性可框架下,其判别函数形如以直接从支持向量机的训练过程中导出.由此,分别对应不同核的权系数可以通过一个单独的分类尜优化过程整体得到.并且该优化过程不会像其他加权∑q∑(x)k1(x;xm/r)+b(13)核方法那样,由于在优化权系数和训练分类器过程中两次仗用训练数据而产生训练数据的过拟合.但其中,7z(x)是选通函数,其定义形式为8期汪洪桥等:多核学习方法10117(c)exp((vm, )+Umo)(14)详细阐述了应用于合成核的列生成 Boosting方法并成功推广到分类和回归问题∑ep(,x)+"l2)二次约束型二次规划从数学形式上看,二次约束型二次规划是一类这里的tm和tm是选通模型参数,可以在多核学习目标函数和约束同为二次函数的优化问题过程中通过梯度下降法获得.将局部选通模型和基于核的分类器相结合,优化问题可以用一种联合的方式加以解决.局部多核学习方法获得了与多核学习近似的精度,但只需要存储更少的支持向量.基于st.Px+qx+r;≤0,i=1,2,…,m此, Christoudias等又提出了一种基于 BayesianAr=b的局部权值求取方法,以使学习过稈能适应人规模(1的数据集这里,P,B1,…,Pn是n×n矩阵,优化变量x∈c)非稀疏多核学习R;如果P1,…,Pmn均为0矩阵,则约束变为线性大部分合成核方法都有式(6)的形式,即对多核的,该问题实际变为一个二次规划问题系数的约束是一种1范数的形式,以提高核组合的Bach等针对多核矩阵和分类器系数锥组合稀疏性.稀疏性的提高在一些情况下可以减少冗余,问题的联合优化,提出了Q(QP的-种新对偶肜提高运算效率.但当某个问题多个特征编码间具有式,把它作为一个二阶锥规划,可以利用 Moreau-正交性,稀性可能导致有用信息的丢失和泛化性 Yosida正则化来生成SMO方法的适用形式.实能变弱.Klof等通过对系数引入一种l2范数约验结果显示这种基于SMO的算法比常用工具箱中束,即‖2=1,提出了非稀疏的多核学习方法.虽应用的内点法更有效,广泛应用于支持向量回归问然在此约束下,名核组合形式是非凸的,但通过使用题1二范数‖|2=1边界上的值,可以得到一个紧致的3)半定规划凸近似,这就保证了核矩阵的严格正定性.通过在大通过在一个核矩阵中综合考虑训练数据和测试规模数据集下与C1范数和常用多核学习( Multiple数据, Lanckrict等田通过半定规划技术实现了核kernel learning,MKT)方法进行对比实验,仿真实矩阵的学习问题,也为合成核模型提供了一种功能验结果显示2-MKL在抗噪声和特征集冗余方面具强大的渐进直推式算法,该算法被成功应用并推广有较强的鲁棒性.此后,Klo等刚又将O2范数约到蛋白质功能预测0.其考虑的核矩阵具有如下形束推广到任意C范数,p>1,进步增强了核机器式的通用性和鲁棒性Ktr Ktrt2,2合成核机器的学习方法Kr Kt为了求取合成核的参数,通常是将合戊核与支其中,K一(x)重(x;),1-1,…,mu,m+持向量机方法相结合,然后将目标函数转化成不同1,…,m1+nt:这里nt和m是有标号的训练样的优化问题,如不同的正则化形式或对训练样本本个数和无标号的测试样本个数.我们的目标是的一些约束,通过不同的优化方法进行求解.基于通过优化关于训练数据块Kt的损失函数,学习得此,出现了多种合成核机器的学方法到最优的混合数据块矩阵Kr和测试数据块矩阵1) Boosting方法K1即利用有标号的训练样本米预测测试样本的类早期受集成思想和 Boosting方法的启发,别,也就是说,作者认为在训练的过程中同时考虑训Bennett提出了一种多自适应国归核( Multiple练样本和测试样本,可以找出最佳的核矩阵.但这additive regression kernels,MARK)算法.MARK样产生的问题是,求解核矩阵的搜索空间也相对变定义了一种异构核模型,并考虑一个大规模核知阵大,为了避免过学丬( Overfilling), Lanckriet利用库( Library),这个库由不同的核函数和其参数构成.限制核矩阵的迹为一常数米控制,于是有了约束式通过使用一种梯度 Boosting列生成方法, MARK tr(K)=C构建出异构核矩阵的每一列,然后将其添加到合成半定规划是一种凸优化问题( Convex opti-核中.算法的目标就是在这个核矩阵库的基础上,找 mization problem)∞o,它有一个线性的目标函数到一种构建推广模型的方法.这种方法推广性强,不( Alline objectives lunction)、有限个线性矩阵不等需要存储大量的数据米应对后续的预测,提高了预式约束( Linear matrix inequality constraints)以及测的效率在此基础上,通过与SVM结合,Bi等17有限个线性矩阵等式约束( Affine matrix equality1042自动化学报36卷constraints),其标准形式如下如回归问题、一类分类(奇异检测)问题等.实验结果显示该算法可以有效增强模型的自动选择能力min c u并能提高学习结果的解释性.同时能有效应用于数S.t.Fy()-Fd+uFi+,.+ugFg20十万个样本和数百个核的大规模组合优化问题.这7=1,…,种半无限线性规划相比其他方法明显提高了学习速度,适宜于解决大规模问题.特别是当SVMs与·些Au= b已出现的字符串核( String kernel)相结合, String(17)kernel也是一种有效的核方法,它根据两个字符串其中向量t是最优化目标,FF是n×n的的所有公共子串计算它们的相似度,利用这些核对对称矩阵.F(a)是一个半正定阵,上标j表示特征的稀疏映射,使得我们可以训练一种字符串核可能有1全1个约束式:满足此约束式的所构成sVM,并应用于计算生物学中的千万级样本的数据的集合是一个凸集合.A是一个行数与长度相同,片段24在此基础上,7iem等提出了一种应用于列数与b长度相同的矩阵表示有限个等式约束式联含特征映射的多核学习方法,为多兴分类问题的因此,半定规划是在对称且半正定矩阵的凸子集合多核学习提供了一种史方便和原理化的途径.通过( Convex subsct)卜:求解凸函数的最优化问题针对多核支持向量分类问题,通过定义一种对一种凸Q(QP以及两种 SILPs在数据集上进行比较,实验结果显示 SILPS比QCQP在速度上更能指标( Performance iudex)u(K),基于原始一对有优势终可以转化为一个标准的半定规划形式5)超核( Hypcrkcrncls)对基于核方法的支持向量机而言、如何选择一个合适的核函数实现自动的机器学习是一个很大的min t,t,入,υ,6挑战Ong等3通过定义一种核空间上的再生核t.tr|∑FHilbert空间,即超再生核 Hilbert空间,并引入超核的概念及构造方法,在更广义的层面上实现了这,K;≥0目标定义1(超再生核 Hilbert空间, Hyper reproducing kernel Hilbert space).改Ⅹ为非3.tre-tU8+ xy空集合,Ⅹ:ⅩxX是复合指标集,H为函数f:X→R的 Hilbert空间,该函数可表示为该空间中两(e+-6+入y)1t-26Ce个向量的内积,且其范数f=√f,f,则被0>0称为超雨生 Hilbert空间,如果存在一个超核k:x6>0X→R具有如下性质:(18再生性:对所有∫∈丑,有(k,),/)其中,t是引入的一个替代变量( Auxiliary vari-f(x),特殊地,(k(x),k(,x2)-k(xxablc),v,6,A是引入的 Lagrangian乘子,至此,可b)k张成整个空间H,即H以通过标准的半定规划求解方法得到B及相应的span()(XLagrangian乘子,半定规划具有很高的泛化能力c)对仟一固定的(X,超核k是关于其第线性规划( Linear programming,LP)以及QCQP二个输入的核函数,即对任一固定的x∈X,函数问题都可以转换推广成半定规划门题然后可以很k(x,x)-kx,(x,x),x,x′∈是一个核函数容易地使用内点法( Interior-point method)加以解在超再生核 Hilbert空间上,可以用类似于止则决化品质函数的方法.得到一个从训练数据对核进行4)半无限线性规划学习的推理框架.对超核的学习,可以通过定义Sonnenburg等B7在多核矩阵锥组合的基础上,个被称为品质函数( Quality functional)的量(类似提出了一种通用而更有效的多核学习算法.该方法于风险函数)来实现,这个量可以衡量核函数“非良将Bach等的QCQP对偶形式改写为一种半无限( Badness”的程度线性规划(Semi- infinitite linear program,SILP)形定义2(正则化品质函数, Regularized qual-式,新的规划形式可以在标准的SVM应用问题中, ity functionality).设X,Y分别是训练测试样本利用成熟的线性规划方法进行求解.并且,通过将组合和样本标签,对X的一个半正定核矩阵K,此形式进行推广,算法能有效解决更多类型的问题,其正则化的质函数定义为如下形式:8期汪洪桥等:多核学习方法1013g(,x,Y)=9mp(k,X,Y)+2‖(17)分组LasoLasso回归是目前处理多重共线性的主要方法这里,≥0是一个正则化常数,h表示空间之一,相刘于其他方法,更容易产生稀疏解:在参H中的范数,Qm(k,X,Y)是一种经验品质函数,数估计的同时实现变量选择,因而可以用来解决检它表示核函数k与某一特定数据集X,Y的匹配程验中的多重共线性问题,以提高检验的效率.Laso度,该函数的值常用来调整k以使得gm最优(如:可以推广为分组Laso( Group lasso),从而使得最优核目标度量)模型的解可以保持组稀疏性和层次性.Bach26·关引理1(再生核 Hilbert空间的表示定理,注于分块1范数正则化的最小二乘回归,即分组Representer theorem for hyper-RKHS).设Las0o题,研究了其渐进模型一致性,推导出了分X为非空集合,Qmp是任意经验品质函数,X,Y组Laso-致性在一些实际假设下的充要条件,如分别是训练测试样木组合和样木标签,则每一个最模型误定.当线性预测器和欧氏范数(2范数)用函小化正则化品质函数g(k,X,Y)的k∈Ⅱ具有数和再生核 Hilbert,范数代替,这就是常说的多核学以下的一种表示形式习问题.通过使用函数分析工具和特定的协方差算,将上述一致性结果推广到无限维情形,同时提出k(x)=∑月12(m,m),(m,m1),,x∈x种自适应方法来获得一致性模型的估计,即使2,7在非适应方法必要性条件不满足的情况下也能适用(20)为多核学习间题提供了一条新的途径对每一个1≤i,≤M,这里B;∈R2.3其他合成核参数学习方法根据超再牛核 Hilbert空间的表示理论可知,由超核构造的决策函数不仅由某一个单核构成,而且从最简单的多个核直接求和到上述的各种改进还由多核之间的一个线性组合构成,因此具有更优合成核构造方法,多核学习经历了从经验性选择的性能在分类、回归以及奇异检测等方面的实验证运用多和优化方法求解的过程但针对一些具体间实了该方法的有效性B.8,拓展了多核模型选择与题,对核参数的选取,多核权系数的设定,目前还没合成的研究途径有形成一个合理统一的模式.常用的方法只能是凭6)简单MKL借经验、实验对比、大范围的搜索或通过交叉验证从Bach等的多核学习框架36出发, Sonnen-等进行寻优.在这种情况下,也出现了其他的些方bug等提出了种通用而更有效的多核学习算法,实现了多核学习问题,典型的有法37,该方法通过迭代使用现有的支持向量机代1)基于智能优化方法的多核学习码,从一个新的角度解决了人规模问题的多核学习这类方法主要通过一些比较成熟的智能优化然而,这种迭代算法在收敛到一个合理解之前,需要方法,建立目标函数,寻找该函数极值的过程就是过多的迭代运算. Rakotomanonyy等27用一种自合成核参数寻优的过程如采用多项式核与径向适应的C2范数正则化方法米考虑多核学习问题,每基核的合成核2作为支持向量机的核函数k个核矩阵的权系数被包含在标准SVM的经验风险2-(1-p)km,将其用SVM进行预测过程中最小化问题中,并采用(2约束以提高解的稀疏,的参数向量(d,o,,p)作为粒子,其中d为多项式然后采用了一种基于分块1范数正则化的算法来解核参数,为径向基核尺度参数,y为SVM调整参决这一问题,为多核问题提供了一个新的视角,并且数,p为合成核的权重参数,利用粒了群算法对该合证明了该方法与Bach等的方法是等效的.从上运成核的参数进行优化,最终找到最优的预测结果描述可以看出,除了学习合成核外,该与法解决的是2)基于核目标度量的多核学习个标准的SVM优化问题,这里核的定义形式为核度量434是两个核函数之间或核函数与目多个核的线性组合. Rakotomamonjyl称之为简标函数间的一个相似性度量,在多核矩阵信息融合单多核学习( Simple MKL)在加权的2范数正则方面得到了应用,其概念最早由 Cristianini等提出化形式下,同时对多核权系数进行一个额外的1范考虑一个两类分类数据集S={(x,1)}=1,其中非数约束,为多核学习提供了一种基于混合范数正则∈{+1,-1},则在数据集S下,两个核矩阵之间的化的新思路.简单多核学习可以从两类分类问题向核度量定义为其他方向扩展,如回归、类、一类分类(奇异检测)A(S,K1,K2)(K1,K2)以及多类分类问题,具有很强的通用性,并且与其他(21√k1,K1)F(K2,k2)F多核学习算法相比,该算法收敛速度更快且效率更这里,(K,Ka)F=>1-1Fn(x2:)(x,T)通1044自动化学报36卷过上式,对应于S的核矩阵K的性能可以通过A;-2,t-0,1,2,值米量度,如:A(5,K,G),这里的G是基于特定任务的理想核G=y,其中y=m12…,.基另一种典型多尺度核为小波核函数( Waveletkernel function) 831于对目标核的度量原珥,通过使用不同的核函数,或定理1.令h(m)是一个小波母函数,a和c分者调节不同的参数值,可以产生一组核矩阵.然后,别表示仲缩和转移因子,a,∈R如果x,z∈R对该度量值的最大化执行半定规划或其他学习方法,则内积型小波核函数可表示为以得到一个对不同核矩阵加权组合的最优核3多个尺度的多核学习:多尺度核方法k(2)=江4(合成核方法虽然有了一些成功应用,但都是根据简单核函数的线性组合,生成满足 Mercer条件的转移不变小波核函数为新核函数;核函数参数的选择与组合没有依据可循,对样木的不平坦分布仍无法圆满解决,限制了决策k(a, z)=(函数的表示能力.在此情况下,山现了多核学习的种特殊化情形,即将多个尺度的核进行融合.这种定理2.考虑具有一般性的小波函数方法更具灵活性,并且能比合成核方法提供更完备的尺度选择.此外,随着小波理论、多尺度分析理论h(x)=cos(1.75x)252间使其其有了很好的且论录这类方法目箭也如果x2(R",则小波核函数为得到了很好的利用,烘型的如 Kingsbury等③2将多个尺度大小的核进行分光heng等B到、 Yang k(a,2)=h(x二等834提出了多尺度支持向量回归.分别用于非平坦i=1数的估计和时序列预测.此外,通过进一步将多∏1c015(n-2)C一之尺度核与支持向量机结合.多尺度核方法在基于回归的热点检测48和图像压缩49等方面均得到了应(26用.近来,结合多尺度分析方法,基于 Hilbert空间通过仲缩因子a的变化,即可得到不同尺度的小波中的再生核进行函数重构得到了重视并进行了相关的应用研究;此外,多尺度核方法又逐步推广到核函数了高斯过程的健模与处里-27,这对基于核方法3.2多尺度核的学习方法的机器学习又是一次大的扩展1)多尺度核序列学习方法3.1具有多尺度表示能力的核函数对多尺度核的学习,很直观的思路就是进行多尺度核的序列学习.多尺度核序列合成方法32简单度表示能力的核函数.在被广泛使用的核函数中,高理解就是先用大尺度核拟合对应决策函数平滑区域的样木,然后用小尺度核拟合决策函数变化相对剧斯径向基核烈区域的样本,后面的步骤利用前面步骤的结果,进k(a, a )=cxp(22行逐级优化,最终得到更优的分类结果考虑一个两尺度核k1和k2合成的分类问题是最受欢迎的,因为它们具有通用普遍的近似能力,我们要得到合成的决策函数同时它也是一种典型的可多尺度化核.以此核为例f(x)=f1(x)+f2(x)将其多尺度化(假设其只有半移不变性):k(-22这里22af()=∑ak1(xn,)b2其中.σ1
- 2020-12-07下载
- 积分:1
Java面试笔试题大汇总(最全+详细答案)
搜集的 Java面试笔试题,设置最低积分,备份加供诸位道兄下载,没积分的私我是的内部类,其代码如下所小简单的说,如果整型字面量的值在到之间,那么不会新的对象,而是直接引用常量池中的对象,所以上面的面试题中的结果是而的结果是提醒:越是貌似简单的面试题其中的玄机就越多,需要血试者有相当深厚的功力。和的区别答:运算符有两种用法:按位与;逻辑与ε运算符是短路与运算。逻辑与跟短路与的差别是非常巨人的,虽然二者都要求运算符左右两端的布尔值都是整个表达式的值才是之所以称为短路运算是因为,如果左边的表达式的值是右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用而不是,例如在验证用户登录时判定用户名不是而且不是空字符串,应当写为:二者的顺序不能交换,更不能用运算符,因为第一个条件如果不成立,根本不能进行字符串的比较,否则会产生异常。注意:逻辑或运算符()和短路或运算符()的差別也是如此。补充:如果你熟悉那你可能更能感受到短路运算的强大,想成为的高手就先从玩转短路运算开始吧3114解释内存中的栈堆和静态区的用法。答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过关键字和构造器创建的对象放在堆空间;程序中的字面量()如直接书写的和常量都是放在静杰区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。上面的语句中变量放在栈上,用创建出来的字符串对象放在堆上,而这个字面量放在静态区。补充:较新版本的(从的某个更新开始)中使用了一项叫逃逸分析的技术,可以将一些局部对象放在栈上以提升对象的操作性能等于多少?等于多少?答的返回值是的返回值是。四舍五入的原理是在参数上加然后进行下取整。是否能作用在上,是否能作用在上,是否能作用在上答:在以前,中只能是从开始中引入了枚举类型,也可以是类型,从开始,还可以是字符串(),但是长整型()在目前所有的版本中都是不可以的。、用最有效率的方法计算乘以?答:(左移位相当于乘以的次方,右移位相当于除以的次方)。补充:我们为编写的类重写方法时,可能会看到如下所示的代码,其实我们不太理解为什么要使用这样的乘法运算来产生哈希码(散列码),而且为什么这个数是个素数,为什么通常选择这个数?前两个问题的答案你可以自己百度一下,选择是因为可以用移位和减法运算来代替乘法,从而得到更好的性能。说到这里你可能凵经想到了:等价于左移位相当于乘以的次方再诚去自身就相当于乘以,现在的都能自动完成这个优化4/114、数组有没有方法?有没有方法?答:数组没有方法,有的属性。有方法中,获得字符串的长度是通过属性得到的,这一点容易和混淆。在中,如何跳出当前的多重嵌套循环?答:在最外层循环前加个标记如,然后用可以跳出多重循环。(中支持带标签的和语句,作用有点类似于和中的语句,但是就像要避免使用一样,应该避免使用带标签的和,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好)、构造器()是否可被重写()?答:构造器不能继承,因此不能被重写,但可以被重载。、两个对象值相同但却可有不同的这句话对不对答:不对,如果两个对象和满足,它们的哈希码(相同对于方法和方法是这样规定的:如果两个对象相同(方法返回,那么它们的值一定要相同:如果两个对象的它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就么发在使用容器时,相同的对象可以出现在集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)补充:米于和方法,很多程序都知道,但很多人也就是仅仅知道而己,在的大作《》(很多软件公司,《《编程思想》以及《重构:改善既有代码质量》是程序员必看书籍,如果你还没看过,那就赶紧去亚马逊买一本吧)中是这样介绍方法的:首先方法必须满足自反性(必须返回)、对称性(返回时也必须返回)、传递性(和都返回时,也必须返回)和致性(当和引用的对象信息没有被修改时,多次调用应该得到同样的返回值),而且对于任何非值的引用,必须返回实现高质量的方法的诀窍包括:使用操作符检查参数是否为这个对象的引用;5114使用操作符检查参数是否为正确的类型;对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;编写完方法后,问自己它是否满足对称性、传递性、一致性;重写时总是要重写;不要将方法参数中的对象替换为其他的类型,在重写时不要忘掉注解。、是否可以继承类?答:类是类,不可以被继承。补充:继承本身就是一个错误的行为,对类型最好的重用方式是关联关系)和依赖关系()而不是继承关系()、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?答:是值传递。语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值訫是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。和中可以通过传引用或传输出参数来改变传入的参数的值。在中可以编写如下所示的代码,但是在中却做不到。说明:中没有传引用实在是非常的不方便,这点在中仍然没有得到改进,正是如此在编写的代码中才会出现大量的类(将需要通过方法调用修改的引用置类中,再将对象传入方法),这样的做法只会让代码变得臃肿,尤其是让从和转型为程序员的开发者无法容。和的区别?答:平台提供了两种类型的字符串和,它们可以储存和操作字符串。其中是只读字符串,也就意味着引用的字符串内容是不能被改变的。而类表小的字符串对象可以直接进行修改是中引入的,它和的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被修饰,因此它的效率也比要高。面试题什么情况下用运算符进行字符串连接比调用对象的方法连接字符串性能更好?如果是少量的字符串拼接,可以用,如果是大量的还是用吧是线程安全的是线程不安全的,很6114明显,的系统开销要大,所以如果我们只有个单线程,考虑速度的话更好。那为什么我们很少见到呢?原因很简单,因为我们有时候很难确定我们创建的系统会不会是多线程的,如果考虑到以后扩展的可能性,则更难确定,所以我们更愿意使用因为它是线程安全的,不用担心以后扩展。面试题请说出下面程序的输出。补充:解答上面的面试题需要清楚两点对象的方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与对象的结果是),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;字符串的操作其本质是创建了对象进行操作,然后将拼接后的对象用方法处理成对象,这一点可以用命令获得文件对应的字节码指令就可以看出来。方法就是把该对象放进常量池。、重载()和重写()的区别。重载的方法能否根据返回类型进行区分?答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在了类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求面试题:华为的面试题中曾经问过这样一个问题为什么不能根据返回类型来区分重载,快说出你的答案吧!返回类型不同不构成重载,重载的机制是参数列表不同,即参数的类型,个数,排列顺序。、描述·下加载文件的原理机制?答中类的装载是由类加载器()和它的子类来实现的,中的类加载器是一个重要的运行时系统组件,它负责在运行时查找和装入类文件中的类。由于的跨平台性,经过编译的源程序并不是·个可执行程序,而是个或多个类文件。当程序需要使用某个类时,会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的文件中的数据读入到内存中,通常是创建一个字节数组读入文件,然后产生与所加载类对应的对象。加载完成后,对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证7114准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后对类进行初始化,包括:如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;如果类中存在初始化语句,就依次执行这些初始化语类的加载是由类加载器完成的,类加载器包括:根加载器()、扩展加载器)、系统加载器()和用户自定义类加载器(的子类)。从)开始,类加载过程采取了父亲委托机制()。更好的保证了平台的安全性,在该机制中自带的是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载不会向程序提供对的引用。下面是关于几个类加载器的说明:般用本地代码实现,负责加载基础核心类库();从系统属性所指定的目录中加载类库,它的父加载器是又叫应用类加载器,其父类是环境变量或者系统属性所指公应它是应用最广泛的关加载器。它从目录中记载类,是用户自定义加载器的默认父加载器。型变量中能不能存贮一个中文汉字,为什么?答:类型可以存储一个中文汉字,因为中使用的编码是不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个类型占个字节(比特),所以放一个中文是没问题的补充:使用意味着字符在内部和外部有不同的表现形式,在内部都是当这个字符被从内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,和,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;对于程序员来说,要完成这样的编码转换恐怕要依赖于(联合体共用体)共享内存的特征米实现了。、抽象类和接口()有什么异同?答:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承」某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是默认的,而接口中的成员全都是的抽象类中可以定义成员变量,而接∏中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法、静态嵌套类和内部类()的不同?是被声明为静态)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的,如下所示。扑克类(一副扑克)骆昊黑桃红桃草花方块8114构造器洗牌(随机乱序)发牌发牌的位置下片类(一张扑克)内部类骆昊花色点数9114测试代码:汏牌发第一张牌对于非静态内部类只有通过其外部类对象才能创建对象红心自己创建一张牌洗牌后的第一张打印红心面试题下面的代码哪些地方公产生编译错误?注意中非静态内部类对象的创建要依赖其外部类对象,上面的面试题中和方法都是静态方法,静态方法中没有,也就是说没有所谓的外部类对象,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这样做:、中会存在内存泄漏吗,请简单描述答:理论上因为有垃圾回收机制()不会存在内存泄露问题(这也是被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被回收,因此也会导致内存泄露的发生。例如的10/114
- 2020-06-20下载
- 积分:1