java面试题 下面这个要怎么实现啊? java自动补全代码实现

Java基础试题及其答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java基础试题及其答案
||文档简介
项目管理,技术顾问|
总评分4.0|
浏览量71473
&&J​a​v​a​基​础​试​题​及​其​答​案
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩12页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢怎么在面试时回答Java垃圾回收机制(GC)相关问题?
按时间排序
看看《深入理解java虚拟机》就行了,挺白话容易看的,当时是些基本的
需要回答1. 什么是garbage?没有用的data2. 什么是没有用?宽松地来说没有指针指向这个data,这个是tracing based gc 回收的data3. 那么还会有其他垃圾吗?有,就是静态的没有用到的变量,比如一个global cache。4. 所以java有GC还是会内存泄漏。这个指的就不是allocate的内存没有deallocate,而是基于 3.
这个帖子的背景是今晚看到je上这张贴:大家都来说说自己最讨厌的面试题目吧。,心血来潮写下的文字,如果能抛砖引玉,能有其他面试官分析一下自己面试时问的问题,那或许是件很有意义的事情。
在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过。先表达一下我自己对面试的观点:
1.笔试、面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见人心”。通过一、二个小时内的做题、交流,只是没有其他办法下进行的无奈之举,所以通过了面试不代表有多成功,没通过也不代表有多失败。
2.好的面试官本身交谈的时候就不应当把自己一个居高临下的角色上,应当把自己和应聘者当做两个做技术的人平等的交流,把自己当作权威往往就会受到观点的角度、语言表达、工作领域的惯性的制约。
3.好的考察题目则是大家能经常接触,不同层次的人能有不同层次的答案,能从问题引申出后面继续讨论的话题。
举个例子抛砖引玉,下面这个问题是我以前常问的,从应届生到工作十几年的人都问过: “地球人都知道,Java有个东西叫垃圾收集器,它让创建的对象不需要像c/cpp那样delete、free掉,你能不能谈谈,GC是在什么时候,对什么东西,做了什么事情?”我自己分析一下这个问题,首先是“什么时候”,不同层次的回答从低到高排列:
1.系统空闲的时候。
分析:这种回答大约占30%,遇到的话一般我就会准备转向别的话题,譬如算法、譬如SSH看看能否发掘一些他擅长的其他方面。
2.系统自身决定,不可预测的时间/调用System.gc()的时候。
分析:这种回答大约占55%,大部分应届生都能回答到这个答案,起码不能算错误是吧,后续应当细分一下到底是语言表述导致答案太笼统,还是本身就只有这样一个模糊的认识。
3.能说出新生代、老年代结构,能提出minor gc/full gc
分析:到了这个层次,基本上能说对GC运作有概念上的了解,譬如看过《深入JVM虚拟机》之类的。这部分不足10%。
4.能说明minor gc/full gc的触发条件、OOM的触发条件,降低GC的调优的策略。
分析:列举一些我期望的回答:eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio控制新生代老年代比例,通过MaxTenuringThreshold控制进入老年前生存次数等……能回答道这个阶段就会给我带来比较高的期望了,当然面试的时候正常人都不会记得每个参数的拼写,我自己写这段话的时候也是翻过手册的。回答道这部分的小于2%。 PS:加起来不到100%,是因为有确实少数直接说不知道,或者直接拒绝回答的= =#
分析第二个问题:“对什么东西”:
1.不使用的对象。
分析:相当于没有回答,问题就是在问什么对象才是“不使用的对象”。大约占30%。
2.超出作用域的对象/引用计数为空的对象。
分析:这2个回答站了60%,相当高的比例,估计学校教java的时候老师就是这样教的。第一个回答没有解决我的疑问,gc到底怎么判断哪些对象在不在作用域的?至于引用计数来判断对象是否可收集的,我可以会补充一个下面这个例子让面试者分析一下obj1、obj2是否会被GC掉?
C obj1、obj2 = new C();
obj1.x = obj2;
obj2.x = obj1;
obj1、obj2 =
3.从gc root开始搜索,搜索不到的对象。
分析:根对象查找、标记已经算是不错了,小于5%的人可以回答道这步,估计是引用计数的方式太“深入民心”了。基本可以得到这个问题全部分数。
PS:有面试者在这个问补充强引用、弱引用、软引用、幻影引用区别等,不是我想问的答案,但可以加分。
4.从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。
分析:我期待的答案。但是的确很少面试者会回答到这一点,所以在我心中回答道第3点我就给全部分数。
最后由一个问题:“做什么事情”,这个问发挥的空间就太大了,不同年代、不同收集器的动作非常多。
1.删除不使用的对象,腾出内存空间。
分析:同问题2第一点。40%。
2.补充一些诸如停止其他线程执行、运行finalize等的说明。
分析:起码把问题具体化了一些,如果像答案1那样我很难在回答中找到话题继续展开,大约占40%的人。
补充一点题外话,面试时我最怕遇到的回答就是“这个问题我说不上来,但是遇到的时候我上网搜一下能做出来”。做程序开发确实不是去锻炼茴香豆的“茴”有几种写法,不死记硬背我同意,我不会纠语法、单词,但是多少你说个思路呀,要直接回答一个上网搜,我完全没办法从中获取可以评价应聘者的信息,也很难从回答中继续发掘话题展开讨论。建议大家尽量回答引向自己熟悉的,可讨论的领域,展现给面试官最擅长的一面。
3.能说出诸如新生代做的是复制清理、from survivor、to survivor是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理、复制清理和标记清理有有什么优劣势等。
分析:也是看过《深入JVM虚拟机》的基本都能回答道这个程度,其实到这个程度我已经比较期待了。同样小于10%。
4.除了3外,还能讲清楚串行、并行(整理/不整理碎片)、CMS等搜集器可作用的年代、特点、优劣势,并且能说明控制/调整收集器选择的方式。
分析:同上面2个问题的第四点。
最后介绍一下自己的背景,在一间不大不小的上市软件公司担任平台架构师,有3年左右的面试官经验,工作主要方向是大规模企业级应用,参与过若干个亿元级的项目的底层架构工作。-------------------------------------------------------------------------------------------------------------------------先提出一些问题在这里吧!①Java和C++在内存分配和管理上有什么区别?
Java与C++之间有一堵由动态内存分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人想出来。
对于从事C和C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权利的皇帝,也是从事最基础工作的劳动人民-----既拥有每一个对象的所有权,又担负着每一个对象从生命开始到终结的维护责任。 对于Java程序员来说,虚拟机的自动内存分配机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄露和内存溢出问题,看起来由虚拟机管理内存一切都很美好。不过,也正是因为Java程序员把内存控制的权利交给Java虚拟机,一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会是一项异常艰难的工作。并且好的Java程序在编写的时候肯定要考虑GC的问题,怎样定义static对象,怎样new对象效率更高等等问题,简称面向GC的编程也可以说Java的内存分配管理是一种托管的方式,托管于JVM。C++经过编译时直接编译成机器码,而Java是编译成字节码,由JVM解释执行。C++是编译型语言,而Java兼具编译型和解释型语言的特点。②Java虚拟机规范将JVM虚拟机所管理的内存分为几部分?1.
程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行字节码的行号指示器。是线程私有,生命周期与线程相同。2. Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。 Java虚拟机栈描述的是Java方法(区别于native的本地方法)执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动作链接、方法出口等信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
3. 本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机所使用到的Native方法服务。4. 方法区(3)有哪些方法可以判断一个对象已经可以被回收,JVM怎么判断一个对象已经消亡可以被回收?
①引用计数算法
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。
Java语言没有选用引用计数法来管理内存,因为引用计数法不能很好的解决循环引用的问题。
②根搜索算法
在主流的商用语言中,都是使用根搜索算法来判定对象是否存活的。
GC Root Tracing 算法思路就是通过一系列的名为"GC
Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连,即从GC Roots到这个对象不可达,则证明此对象是不可用的。
比如上图,左边的对象都是存活的,右边的都是可以回收的。(4)那些对象可以作为GC Roots?
虚拟机栈(栈帧中的本地变量表)中的引用的对象
方法区中的类静态属性引用的对象
方法区中的常量引用的对象
本地方法栈中JNI(Native方法)的引用对象(5)Java代码编译的结果是什么?
是字节码文件.class (6) 怎么理解Java语言的平台无关性?语言无关性?通过什么方法实现的?(7)Java中的static变量和static方法在JVM运行中内存的分配管理有什么不同和一般变量方法?
非静态对象
拥有属性: 是类共同拥有的
是类各对象独立拥有的
内存分配: 内存空间上是固定的
空间在各个附属类里面分配
分配顺序: 先分配静态对象的空间
继而再对非静态对象分配空间,也就是初 始化顺序是先静态
(8)Java类的加载过程?
(9)在heap中没有类实例的时候,类信息还存在于JVM吗? 存在于什么地方?
----------------------------------------------------------------------------------------------------------------------------HotSpot JVM (下简称JVM)的内存管理JVM将堆分成了 二个大区
Young 和 Old 如下图:而Young 区又分为 而Young 区又分为 Eden、Servivor1、Servivor2, 两个Survivor 区相对地作为为From 和 To 逻辑区域, 当Servivor1作为 From 时 , Servivor2 就作为 To, 反之亦然关于为什么要这样区分Young(将Young区分为Eden、Servivor1、Servivor2以及相对的From和To ),这要牵涉到JVM的垃圾回收算法的讨论。1)因为引用计数法无法解决循环引用问题,JVM并没有采用这种算法来判断对象是否存活。2)JVM一般采用GCRoots的方法,只要从任何一个GCRoots的对象可达,就是不被回收的对象3)判断了对象生死,怎么进行内存的清理呢?4)标记-清除算法,先标记那些要被回收的对象,然后进行清理,简单可行,但是①标记清除效率低,因为要一个一个标记和清除②造成大量不连续的内存碎片,空间碎片太多可能会导致当程序在以后的运行过程中需要分配较大对象的时候无法找到足够的连续内存而不得不触发另一次垃圾收集动作。5)采用复制收集算法:将可用内存按照容量分为大小相等的两块,每次只是使用其中的一块。当这一块的内存用完了,就将可用内存中上面的过程就解释了为什么我们的Yong内存需要分为三块,Eden,Survivor1,Survivor2以及FROM TO相对使用的用法 因此当Eden区满的时候 GC执行,这时会将 Eden 区和 From 区中还被引用的对象会被移到 To区 ,个别大对象和部分From对象在To已满的情况下会被放到Old区,如下图: 因此当Eden区满的时候 GC执行,这时会将 Eden 区和 From 区中还被引用的对象会被移到 To区 ,个别大对象和部分From对象在To已满的情况下会被放到Old区,如下图:HotSpot VM 内存堆的两个Servivor区HotSpot VM 内存堆的两个Servivor区----------------------上面的部分内容来自/topic/894148
帖子里面题主提了一个问题:
第一次发贴,有什么问题请大家指正一下。有个地方不太清楚 ,为什么需要From 和 To 两个平行的区呢,为什么不直接从Survivor 移到 Old? 这样设计的好处是什么?难道是因为在移动对象的时候需要压缩调整对象空间,所以这种整体移动的设计会快一点吗?希望大家一起来讨论一下 ^_^之所以要分两个Survivor,而不是直接从Survivor直接移到old区域,原因是old区域内的对象都是经过若干次yong GC之后存活下来的对象,并不是每一次yong GC存活下来的对象都需要移动到old区域内,所以需要Survivor1和Survivor2来保证Yong内存中的复制算法的实行,提高清除效率。
真心不知道这些有什么用,它爱怎么回收就怎么回收,懒得去关心。其次jvm调优,这个嘛,两个立足是,一个是响应式优先,一个是高吞吐量。你要满足哪个就往哪个上调。而且调优这东西,理论归理论,还是要实际压测,繁琐的事情是测试,而不是研发
引用计数:一个对象被引用计数器加一,取消引用计数器减一,引用计数器为0才能被回收。优点:简单。缺点:不能解决循环引用的问题,比如A引用B,B引用A,但是这两个对象没有被其他任何对象引用,属于垃圾对象,却不能回收;每次引用都会附件一个加减法,影响性能。标记清除法:分为两个阶段:标记阶段和清除阶段。标记阶段通过根节点标记所有可达对象,清除阶段清除所有不可达对象。缺点:因为清除不可达对象之后剩余的内存不连续,会产生大量内存碎片,不利于大对象的分配。复制算法:将内存空间分成相同的两块,每次只是用其中的一块,垃圾回收时,将正在使用的内存中的存活对象复制到另外一块空间,然后清除正在使用的内存空间中的所有对象,这种回收算法适用于新生代垃圾回收。优点:垃圾回收对象比较多时需要复制的对象恨少,性能较好;不会存在内存碎片。缺点:将系统内存折半。标记压缩算法:是一种老年代回收算法,在标记清除的基础上做了一些优化,首先从根节点开始标记所有不可达的对象,然后将所有可达的对象移动到内存的一端,最后清除所有不可达的对象。优点:不用将内存分为两块;不会产生内存碎片。分代算法:新生代使用复制算法,老生带使用标记清除算法或者标记压缩算法。几乎所有的垃圾回收期都区分新生代和老生带。分区算法:将整个堆空间分成很多个连续的不同的小空间,每个小空间独立使用,独立回收。为了更好的控制gc停顿时间,可以根据目标停顿时间合理地回收若干个小区间,而不是整个堆空间,从而减少gc停顿时间。from:我的个人博客
反问薪资多少?几千块雇一个写代码的缺要问分布式和性能调优
先把4种机制工作原理介绍完,再说不同算法适用场景,以及对应GC参数调优。整个过程8-10分钟一直说不要停,哈哈… 然后问面试官,我说清楚了吗?
知乎技术问题首答!因为之前对java内存管理机制进行了学习与总结,顺带贴出来仅供参考,如有错误请斧正!内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分。不同的编程语言有不同的内存管理机制,本文在对比C++和java语言内存管理机制的不同的基础上,浅析java中的内存分配和内存回收机制,包括java对象初始化及其内存分配,内存回收方法及其注意事项等……java与C++内存管理机制对比在C++中,所有的对象都会被销毁,局部对象的销毁发生在以右花括号为界的对象作用域的末尾处,而程序猿new出来的对象则应该主动调用delete操作符从而调用析构函数去回收对象占用的内存。但是C++这种直接操作内存的方式存在很大内存泄露风险,而且人为管理内存复杂且困难。在java中,内存管理由JVM完全负责,java中的“垃圾回收器”负责自动回收无用对象占据的内存资源,这样可以大大减少程序猿在内存管理上花费的时间,可以更集中于业务逻辑和具体功能实现;但这并不是说java有了垃圾回收器程序猿就可以高枕无忧,将内存管理抛之脑外了!一方面,实际上java中还存在垃圾回收器没法回收以某种“特殊方式”分配的内存的情况(这种特殊方式我们将在下文中进行详细描述);另一方面,java的垃圾回收是不能保证一定发生的,除非JVM面临内存耗尽的情况。所以java中部分对象内存还是需要程序猿手动进行释放,合理地对部分对象进行管理可以减少内存占用与资源消耗。对比之后,我们需要详细了解一下java内存分配与回收机制,欲知详情,请前往参考我的博客全文:
上面的答案里渔和鱼都有人给了,我也补一句。我自己学习的感想:万变不离其宗,学好操作原理,什么都知道了,gc机制我自己的理解就是实现了一个page cache,标记也好,计数也好,分层也好,都不过是点缀。
毕业生的话,跟他扯:1、标记清除法;2、复制收集法;3、引用计数法;4、分代回收法。应该就够了吧。这几种方法不管什么带GC的语言都离不了吧,我觉得。
知道什么就回答什么,不知道就直接说不知道
的回答言简意赅的说中了要害。知道多少回答多少。假定碰上了一位理性且有足够知识储备的面试官。一个好的面试过程通常是逐步推进的,面试官要通过不断深入的问题来判断被面试者的知识极限在哪里,所以没有必要担心被问到自己不知道答案的问题——那就是你的极限,然而那个极限或许已经可以满足这个职位了。在被推向极限时,最好能表现出积极思考的状态,有理有据的从一些基本原理出发去推论;此时漫无边际的胡乱回答一通或者畏缩而不回答都容易留下负面印象。这个问题跟另一个JVM问题的技术要点虽然不同,但是在“面试”意义上有相似之处,题主或许会感兴趣:关于“面试”的话题,很多我想说的都在那个回答里说了。从提问的方式看,题主显然更关心的是“如何应对面试”的方面,而不是“GC的知识要点如何学习”的方面。我觉得这两个方面确实都是值得关注的,只关注了两者之一都“不够用”。以我以前工作的经历:我最初在一个做Java应用开发的组,这个组的业务需求并没有特别需要深入理解JVM与GC。那时听到过坐在附近的同事电话面试的情况。其中有些情况就是面试官自己对GC的了解就不充分,然而还是强行提问,电话那头被面试的同学也就只能支支吾吾的作答,然后面试官还要向对方灌输一下自己对GC错误的认识…听着简直为双方都捉鸡。——面试官自身水平就并不高的情况自然是存在,而且普遍存在。这种时候被不被刷全看运气/人品…如果有充分的知识储备,就可以像开头提到的instanceof那帖那样分析面试官的知识水平和目标答案,然后迎合面试官的水平以及应聘职位的需求去作答。随便举个例子:如果碰到面试官问:“GC如何判断哪些对象不在作用域?”首先要立即发现这个问题本身有问题——Java的对象并没有作用域,而是对Java对象的引用有作用域——但是不要一上来就为这种细节跟面试官纠缠。然后考虑一下到底要回答到怎样程度的细节。像
多半就过于详细,除非是面试JVM开发的职位。简单提一下GC可能通过stack map与runtime沟通,VM可以做活跃分析等等就挺好的。切记要配合职位需求和现场环境的时间限制作答。如果碰上胡搅蛮缠的面试官的话,这也正好是个判断到底应不应该去那个公司工作的好机会。反过来,面试官的水平远高于自己、而且自己高估了自己的水平的情况也十分常见。典型例子之一就是被面试者粗读过一两本书之后就以为掌握了某个知识领域的所有知识,例如说以为读过《深入Java虚拟机》(Inside the Java Virtual Machine)或《深入理解Java虚拟机》就觉得以及完全掌握了JVM的知识点,就算要开发JVM也没问题了——不,粗读过这两本书离能实际参与JVM研发的程度,距离还有点远。见过太多状况忍不住想借此回答吐个槽。无论是面试别人的还是被别人面试的,有些人会有根深蒂固的错误认识,是没有办法当场说服的。如果遇到对方是这样的情况,请一定要克制住情绪…抱歉这里我不想举任何实际例子,免得麻烦。即便对方是错的,或许也可以从对方的错误认知中学习到从不同的角度看问题,回头自己论证对方为何是错的,为何会有这样的错误认识;而有时候可能其实对方是正确的,反而是自己有根深蒂固的错误认识,等能够发现这点的时候也就学到了东西,何乐而不为。最后,不以应对面试为而是以实际学以致用为目的的去了解JVM与GC相关的知识的话,是一本很实用的书,可以从它开始摸索学习。要逐步深入的学习,请见我的两个书单:仅供参考。
曾经去面阿里的Android工程师实习生时被问到过,刚好前一周看了点别人写的关于DVM和ART的源码分析,就跟人家扯了一下:虚拟机启动大概什么过程,zygote是什么,老生代新生代,Mark-Sweep大概怎么个过程,什么时候会stop the world。逻辑并不清晰,但大致讲清楚了过程。然后面试官只问了一句:这些你是自己读源码研究的还是看的别人的文章(?˙ー˙?)估计他自己对这些也没多少了解╮(╯_╰)╭
《深入理解java虚拟机》 作者 周志明的一篇 博客详细的介绍了 面试时 对gc方面的回答方式
知道的就把几个著名的gc算法描述一下,最不济也要知道自己最常用的比如hotspot vm用的是什么算法。进一步可以说下各个算法的优劣。然后差不多了,能说这么多面试官就觉得你这方面基础不错了。要是你能说下你遇到过这类相关的问题,比如gc时间过长等,并怎样解决的,那更好。
把《深入理解java虚拟机》看了就够了
你知道多少回答多少。有什么“怎么”的。如果你不知道的话就是会被刷掉,这就是面试的目的。
已有帐号?
无法登录?
社交帐号登录温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'JAVA面试题(122道基础题,19道代码题)',
blogAbstract:'JAVA相关基础知识1、面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是\r\n过程抽象,二是数据抽象。2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始\r\n类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其',
blogTag:'java基础',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:6,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 java后台实现分页代码 的文章

 

随机推荐