精华内容
下载资源
问答
  • Git 实用技巧

    千人学习 2019-11-24 18:20:42
    但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程...
  • 常用的分析管理工具方法【整理】

    万次阅读 多人点赞 2017-07-14 10:36:30
    常用的分析管理工具方法常用的分析管理工具方法 二八原则 SWOT分析法 鱼骨图分析法 5M因素分析法 5M1E分析法 头脑风暴法 名义群体法 德尔菲法 电子会议分析法 几种决策方法比较 PDCA循环 5W1H分析法 5W2H分析法 5W2...

    常用的分析管理工具方法


    二八原则

    80/20法则(The 80/20 Rule),又称为帕累托法则、帕累托定律、最省力法则或不平衡原则、犹太法则。此法则是由约瑟夫·朱兰(Joseph M. Juran)根据**维尔弗雷多·帕累托(Vilfredo Pareto)本人当年对意大利20%的人口拥有80%的财产的观察而推论出来的。

    80/20的法则认为:原因和结果、投入和产出、努力和报酬之间本来存在着无法解释的不平衡。一般情形下,产出或报酬是由少数的原因、投入和努力所产生的。若以数学方式测量这个不平衡,得到的基准线是一个80/20关系;结果、产出或报酬的80%取决于20%的原因、投入或努力。

    举例
    80%的销售额是源自20%的顾客,
    80%的电话是来自20%的朋友,
    80%的总产量是来自20%的产品,
    80%的财富集中在20%的人手中。

    意义
    工作生活中要善于抓住主要矛盾,把资源用在最重要紧迫的事情上。


    SWOT分析法

    SWOT分析法(SWOT Analysis,也称TOWS分析法、道斯矩阵)即态势分析法。 20世纪80年代初由美国旧金山大学的管理学教授韦里克提出,经常被用于企业战略制定、竞争对手分析等场合。

    SWOT分析法

    SWOT分析模型:包括分析企业的优势(Strengths)、劣势(Weaknesses)、机会(Opportunities)和威胁(Threats)。因此,SWOT分析一般用于对企业内外部条件各方面内容进行综合和概括,进而分析组织的优劣势、面临的机会和威胁。通过SWOT分析,可以帮助企业把资源和行动聚集在自己的强项和有最多机会的地方;并让企业的战略变得明朗。

    优劣势分析主要是着眼于企业自身的实力及其与竞争对手的比较,而机会和威胁分析将注意力放在外部环境的变化及对企业的可能影响上 。在分析时,应把所有的内部因素(即优劣势)集中在一起,然后用外部的力量来对这些因素进行评估。

    意义
    帮你清晰把握全局,分析自己在资源方面的优势与劣势,把握环境提供的机会,防范可能存在的风险与威胁。


    鱼骨图分析法

    鱼骨图(Cause & Effect/Fishbone Diagram)又名特性因素图是由日本管理大师石川馨先生所发展出来的,故又名石川图。鱼骨图是一种发现问题“根本原因”的方法,它也可以称之为“因果图”。鱼骨图原本用于质量管理。

    问题的特性总是受到一些因素的影响,我们通过头脑风暴找出这些因素,并将它们与特性值一起,按相互关联性整理而成的层次分明、条理清楚,并标出重要因素的图形就叫特性要因图。因其形状如鱼骨,所以又叫鱼骨图,它是一种透过现象看本质的分析方法,又叫因果分析图。 同时,鱼骨图也用在生产中,来形象地表示生产车间的流程。

    鱼骨图结构

    鱼骨图类型

    • 整理问题型鱼骨图(各要素与特性值间不存在原因关系,而是结构构成关系,对问题进行结构化整理)
    • 原因型鱼骨图(鱼头在右,特性值通常以“为什么……”来写)
    • 对策型鱼骨图(鱼头在左,特性值通常以“如何提高/改善……”来写)

    鱼骨图制作

    1. 分析问题原因/结构
      a. 针对问题点,选择层别方法(如人机料法环测量等)。
      b. 按头脑风暴分别对各层别类别找出所有可能原因(因素)。
      c. 将找出的各要素进行归类、整理,明确其从属关系。
      d. 分析选取重要因素。
      e. 检查各要素的描述方法,确保语法简明、意思明确。
    2. 绘制鱼骨图
      a. 由问题的负责人召集与问题有关的人员组成一个工作组(work group),该组成员必须对问题有一定深度的了解。
      b. 问题的负责人将拟找出原因的问题写在黑板或白纸右边的一个三角形的框内,并在其尾部引出一条水平直线,该线称为鱼脊。
      c. 工作组成员在鱼脊上画出与鱼脊成45°角的直线,并在其上标出引起问题的主要原因,这些成45°角的直线称为大骨。
      d. 对引起问题的原因进一步细化,画出中骨、小骨……,尽可能列出所有原因。
      e. 对鱼骨图进行优化整理.
      f. 根据鱼骨图进行讨论。

    鱼骨图使用步骤

    1. 分析问题原因/结构查找要解决的问题;
    2. 把问题写在鱼骨的头上;
    3. 召集同事共同讨论问题出现的可能原因,尽可能多地找出问题;
    4. 把相同的问题分组,在鱼骨上标出;
    5. 根据不同问题征求大家的意见,总结出正确的原因;
    6. 拿出任何一个问题,研究为什么会产生这样的问题;
    7. 针对问题的答案再问为什么,这样至少深入五个层次(连续问五个问题);
    8. 当深入到第五个层次后,认为无法继续进行时,列出这些问题的原因,而后列出至少20个解决方法。

    意义
    透过现象看本质,由果及因,因因生策,找出问题症结,得到相应解决方法。

    5M因素分析法5M1E分析法都是利用鱼骨图进行问题分析。

    5M因素分析法

    所谓“5M因素分析法”,就是人们常说的从企业经营的五大环节,逐一进行认真分析,寻找企业的“症疾”并进行改进。

    5M因素 包括人、机、料、法、环等5个方面。

    • 人(Man)是指哪些问题是由人为因素造成的,主要分为自身因素、客户因素和竞争对手因素等;
    • 机(Machinery)指软、硬件条件对于业务经营及管理的影响;
    • 料(Material)指新产品的研制与开发、产品种类、性能及客户对产品的认知度等;
    • 法(Method)是指业务经营的方式、方法是否正确有效等;
    • 环(Milieu)是指影响业务经营的内部和外部环境等。

    5M因素

    5M1E分析法

    5M1E 是指造成产品质量的波动的原因主要有6个因素。

    • 人(Man)操作者对质量的认识、技术熟练程度、身体状况等;
    • 机器(Machine)机器设备、工夹具的精度和维护保养状况等;
    • 材料(Material)材料的成分、物理性能和化学性能等;
    • 方法(Method)这里包括加工工艺、工装选择、操作规程等;
    • 测量(Measurement)测量时采取的方法是否标准、正确;
    • 环境(Environment)工作地的温度、湿度、照明和清洁条件等;

    工序质量受5M1E即人、机、料、法、环、测六方面因素的影响,工作标准化就是要寻求5M1E的标准化。


    头脑风暴法

    头脑风暴法(Brain Storming,BS法):又称智力激励法、或自由思考法(畅谈法,畅谈会,集思法),是一种通过集思广益、发挥团体智慧,从各种不同角度找出问题所有原因或构成要素的会议方法。

    所谓头脑风暴(Brain-Storming),最早是精神病理学上的用语,指精神病患者的精神错乱状态而言的。而现在则成为无限制的自由联想和讨论的代名词,其目的在于产生新观念或激发创新设想。

    头脑风暴法是由美国创造学家A·F·奥斯本于1939年首次提出、1953年正式发表的一种激发性思维的方法。

    Brain Storming原则

    • 严禁批评,延迟评判,不自谦
    • 自由奔放,畅所欲言
    • 多多益善,以量求质
    • 搭便车,见解无专利

    Brain Storming激发机理

    • 联想反应
    • 热情感染
    • 竞争意识
    • 个人欲望

    组织形式
    一般6~16人环桌而坐,主持人阐明问题,并保证每个人完全了解该问题。然后每个人各抒己见,充分发挥想象力,互相启发,发表自己想到的各种可能的选择方案。不允许任何批评,并且所有方案都当场记录,留待稍后再讨论和分析。一些技巧方法还是要实践出真知。

    意义
    克服群体压力抑制不同见解,鼓励创造性思维,这是一个产生思想的过程。


    名义群体法

    名义群体法(Nominal Group Technique, NGT),又称NGT法、名义团体技术、名目团体技术、名义群体技术、名义小组法。

    名义群体法是指在决策过程中对群体成员的讨论或人际沟通加以限制,但群体成员是独立思考的。象召开传统会议一样,群体成员都出席会议,但群体成员首先进行个体决策。由AndrewH.VandeVen教授和A.L.AndreL.Delbecq教授在1968年开发的。

    名义小组法适用于决策环境复杂,要通过个人偏好的汇总来进行小组的决策。它是一种主要适合于小型决策小组的方法。 Delbecq等人(1975)建议把名义小组方法用于5到8个成员组成的小组。因为,首先,对于这样大小的小组来说,小组的准确性是最好的;其次,互相影响研究表明,理想的小组大小是5到7个人;第三,名义小组的技巧不适用于大的小组。

    组织形式

    1. 成员集合成一个群体,但在进行任何讨论之前,每个成员独立地写下他对问题的看法;
    2. 经过一段沉默后,每个成员将自己的想法提交给群体。然后一个接一个地向大家说明自己的想法,直到每个人的想法都表达完并记录下来为止(通常记在一张活动挂图或黑板上)。所有的想法都记录下来之前不进行讨论;
    3. 群体现在开始讨论,以便把每个想法搞清楚,并做出评价;

    NGT遵循原则

    1. 需要事先做好充分的准备,活动过程中要组织得当。
    2. 对任务的陈述要准确、清楚,并且要写在纸上以便所有人员都能够看见。
    3. 认真完成每一个步骤,以避免减弱该方法的使用效果。
    4. 监督每个讨论群体在规定的时间内完成每一步骤。
    5. 整个活动过程要坚持公正平等的原则。
    6. 确保活动参加者在讨论过程中提出的各项建议是积极而富有建设意义的

    意义
    这种方法可使群体成员正式开会,但不限制每个人独立思考,而传统会议方式往往做不到这一点。


    德尔菲法

    德尔菲法(Delphi Method)也称专家调查法,是一种采用通讯方式分别将所需解决的问题单独发送到各个专家手中,征询意见,然后回收汇总全部专家的意见,并整理出综合意见。随后将该综合意见和预测问题再分别反馈给专家,再次征询意见,各专家依据综合意见修改自己原有的意见,然后再汇总。这样多次反复,逐步取得比较一致的预测结果的决策方法。

    德尔菲法依据系统的程序,采用匿名发表意见的方式,即专家之间不得互相讨论,不发生横向联系,只能与调查人员发生关系,通过多轮次调查专家对问卷所提问题的看法,经过反复征询、归纳、修改,最后汇总成专家基本一致的看法,作为预测的结果。这种方法具有广泛的代表性,较为可靠。

    德尔菲法是在20世纪40年代由O.赫尔姆(Helmer)和N.达尔克首创,经过T.J.戈登(Gordon)和兰德公司进一步发展而成的。德尔菲这一名称起源于古希腊有关太阳神阿波罗的神话。传说中阿波罗具有预见未来的能力。因此,这种预测方法被命名为德尔菲法。1946年,兰德公司首次用这种方法用来进行预测,后来该方法被迅速广泛采用。

    Delphi是古希腊的一座城市,位于中希腊的弗西斯境内的距雅典150公里的帕那索斯深山里,因有阿波罗神庙及其神托所而闻名,是世界闻名的著名古迹,古希腊人认为,Delphi是地球的中心,是“地球的肚脐”。

    Delphi法典型特征

    • 吸收专家参与预测,充分利用专家的经验和学识;
    • 采用匿名或背靠背的方式,能使每一位专家独立自由地作出自己的判断;
    • 预测过程几轮反馈,使专家的意见逐渐趋同。

    德尔菲法的这些特点使它成为一种最为有效的判断预测法

    德尔菲法 最初产生于科技领域,后来逐渐被应用于任何领域的预测,如军事预测、人口预测、医疗保健预测、经营和需求预测、教育预测等。此外,还用来进行评价、决策、管理沟通和规划工作

    组织形式

    1. 确定问题。通过一系列问卷设计,要求成员提供可能的解决方案。
    2. 每个成员匿名,独立完成第一组问卷。
    3. 第一组问卷结果集中编辑、誊写和复制。
    4. 每个成员收到一本问卷集中结果复制件。
    5. 成员根据集中结果再次提出方案(激发新方案或改变原有方案)。
    6. 重复4、5两个过程直到取得大体一致的意见。

    意义
    非常有效的判断预测方法,避免召集人员的花费,又获得来自各专家的信息。但耗费时间长,不适用于快速决策。


    电子会议分析法

    电子会议分析法(electronic meetings)是一种名义群体法与复杂的计算机技术结合的群体决策方法。在使用这种方法时,先将群体成员集中起来,每人面前有一个与中心计算机相连接的终端。群体成员将自已有关解决政策问题的方案输入计算机终端,然后再将它投影在大型屏幕上。专家们认为,电子会议法比传统的面对面的会议快55%。

    电子会议法的特点

    • 匿名
    • 可靠
    • 快速

    电子会议法的局限

    • 那些善于口头表达,而运用计算机的技能却相对较差的专家来说,电子会议会影响他们的决策思维。
    • 在运用这种预测方法时,由于是匿名,因而无法对提出好的政策建议的人进行奖励;
    • 人们只是通过计算机来进行决策咨询的,从而是”人一机对话”,其沟通程度不如”人一人对话”那么丰富。

    几种决策方法比较

    效果标准/决策方法互动群体法头脑风暴法名义群体法德尔斐法电子会议法
    观点的数量中等
    观点的质量中等
    社会压力中等
    财务成本
    决策速度中等中等中等
    任务导向
    潜在的人际冲突中等
    成就感从高到低中等
    对决策结果的承诺不适用中等
    群体凝聚力中等

    互动群体法有助于增强群体内部的凝聚力,脑力激荡法可以使群体的压力降到最低,德尔斐法能使人际冲突趋于最小,电子会议法可以较快的处理各种观点。


    PDCA循环

    PDCA循环(PDCA Cycle)又称戴明循环(Deming Cycle)、PDSA循环(PDSA Cycle),是一个持续改进模型, 它包括持续改进与不断学习的四个循环反复的步骤, 即计划(Plan)、执行(Do)、检查(Check/Study)、处理(Act),有时也被为称戴明轮(Deming Wheel)或持续改进螺旋(Continuous Improvement Spiral)。
    PDCA
    PDCA基本过程

    威廉·爱德华兹·戴明(William Edwards Deming)是美国统计学家, 他与日本成长为制造业大国以及全面质量管理(Total Quality Management)理论的问世关系甚密。二战后,戴明与另一位美国质量管理大师约瑟夫·莫西·朱兰(Joseph M. Juran)随同盟军占领军来到了日本。戴明将一系列质量改进方法带到了日本,其中就包括统计法和戴明循环(Deming Cycle)。1960年,日本天皇为戴明授勋,以表彰他为日本企业所做的服务与贡献。

    戴明循环的特点

    1. 大环带小环。如果把整个企业的工作作为一个大的戴明循环,那么各个部门、小组还有各自小的戴明循环,就像一个行星轮系一样,大环带动小环,一级带一级,有机地构成一个运转的体系。
    2. 阶梯式上升。戴明循环不是在同一水平上循环,每循环一次,就解决一部分问题,取得一部分成果,工作就前进一步,水平就提高一步。到了下一次循环,又有了新的目标和内容,更上一层楼。
      PDCA阶梯式持续改进
      PDCA迭代式循环
    3. 科学管理方法的综合应用。戴明循环应用以QC七种工具为主的统计处理方法以及工业工程(IE)中工作研究的方法,作为进行工作和发现、解决问题的工具。戴明循环的四个阶段又可细分为八个步骤,每个步骤的具体内容和所用的方法如下表所述。

    戴明循环的步骤和方法

    阶段描述步骤主要办法
    P制定目标与计划1.分析现状找出问题排列图、直方图、控制图
    2.分析各种影响因素或原因因果图(鱼骨图)
    3.找出主要影响因素排列图、相关图
    4.针对主要原因,制定措施计划5W1H法(或5W2H法、5W2H1E法)
    D组织实施任务5.执行、实施计划
    C/S对过程中关键点和最终结果进行检查或研究6.检查计划执行结果排列图、直方图、控制图
    A纠正偏差,对结果进行标准化,并确定新计划7.总结成功经验,制定相应标准制定或修改工作规程、检查规程及其它有关规章制度
    8.把未解决或新出现的问题转入下一个PDCA循环


    上面图表是Markdown语法生成,因无合并单元格功能,因此下表用HTML重新写一遍,方便大家查看

    阶段描述步骤主要办法
    P制定目标与计划1.分析现状找出问题排列图、直方图、控制图
    2.分析各种影响因素或原因因果图(鱼骨图)
    3.找出主要影响因素排列图、相关图
    4.针对主要原因,制定措施计划5W1H法(或5W2H法、5W2H1E法)
    D组织实施任务5.执行、实施计划
    C/S对过程中关键点和最终结果进行检查或研究6.检查计划执行结果排列图、直方图、控制图
    A纠正偏差,对结果进行标准化,并确定新计划7.总结成功经验,制定相应标准制定或修改工作规程、检查规程及其它有关规章制度
    8.把未解决或新出现的问题转入下一个PDCA循环


    戴明循环的优点

    • 适用于日常管理,且同时适用于个体管理与团队管理;
    • 戴明循环的过程就是发现问题、解决问题的过程;
    • 适用于项目管理;
    • 有助于持续改进提高;
    • 有助于供应商管理;
    • 有助于人力资源管理;
    • 有助于新产品开发管理;
    • 有助于流程测试管理

    意义
    每一项工作,都是一个PDCA循环,只有在日积月累逐渐改善中,才可能有质的飞跃。


    5W1H分析法

    5W1H分析法(Five Ws and one H)也称六何分析法,是一种思考方法,也可以说是一种创造技法。是对选定的项目、工序或操作,都要从原因(WHY)、对象(WHAT)、地点(WHERE)、时间(WHEN)、人员(WHO)、方法(HOW)等六个方面提出问题进行思考。这种看似很可笑、很天真的问话和思考办法,可使思考的内容深化、科学化。
    5W1H法

    5W2H分析法

    5W2H分析法又称七何分析法,是第二世界大战中美国陆军兵器修理部首创。简单、方便,易于理解、使用,富有启发意义,广泛用于企业管理和技术活动,对于决策和执行性的活动措施也非常有帮助,也有助于弥补考虑问题的疏漏。

    • WHY——为什么?为什么要这么做?理由何在?原因是什么?
    • WHAT——是什么?目的是什么?做什么工作?
    • WHO——谁?由谁来承担?谁来完成?谁负责?
    • WHEN——何时?什么时间完成?什么时机最适宜?
    • WHERE——何处?在哪里做?从哪里入手?
    • HOW——怎么做?如何提高效率?如何实施?方法怎样?
    • HOW MUCH——多少?做到什么程度?数量如何?质量水平如何?费用产出如何?

    5W2H1E法

    5W2H1E即:

    • What(什么)–企划的目的、内容。
    • Who( 谁)–企划相关人员。
    • Where( 何处)–企划实施场所。
    • When(何时)–企划的时间。
    • Why(为什么)–企划缘由、前景。
    • How(如何)–企划的方法和运转实施。
    • How much(多少)–企划预算。
    • Effect(效果)–预测企划结果、效果。

    任何一种企划书的构成都必须有5W2H1E,共8个基本要素。尤其值得一提的是,要注意How much和Effect对整个企划案的重要意义。如果忽视企划的成本投入,不注意企划书实施效果的预测,那么,这种企划就不是一种成功的企划。只有5W1H的企划书不能称之为企划书,只能算是计划书。

    意义
    经常用这类方法有助于使思路条理化,杜绝盲目性。汇报工作也可用这个方法,节约读写报告的时间。


    SMART原则

    SMART原则(S=Specific、M=Measurable、A=Attainable、R=Relevant、T=Time-based)

    目标管理是使经理的工作变被动为主动的一个很好的手段,实施目标管理不但是有利于员工更加明确高效地工作,更是为未来的绩效考核制定了目标和考核标准,使考核更加科学化、规范化,更能保证考核的公开、公平与公正。

    制定目标看似一件简单的事情,每个人都有过制定目标的经历,但是如果上升到技术的层面,经理必须学习并掌握SMART原则。

    所谓SMART原则,即:

    1. 目标必须是具体的(Specific)
    2. 目标必须是可以衡量的(Measurable)
    3. 目标必须是可以达到的(Attainable)
    4. 目标必须和其他目标具有相关性(Relevant)
    5. 目标必须具有明确的截止期限(Time-based)

    无论是制定团队的工作目标还是员工的绩效目标都必须符合上述原则,五个原则缺一不可。制定的过程也是自身能力不断增长的过程,经理必须和员工一起在不断制定高绩效目标的过程中共同提高绩效能力。

    特别注明:有的又如此解释此原则

    • S代表具体(Specific),指绩效考核要切中特定的工作指标,不能笼统;
    • M代表可度量(Measurable),指绩效指标是数量化或者行为化的,验证这些绩效指标的数据或者信息是可以获得的;
    • A代表可实现(Attainable),指绩效指标在付出努力的情况下可以实现,避免设立过高或过低的目标;
    • R代表现实性(Realistic),指绩效指标是实实在在的,可以证明和观察;
    • T代表有时限(Time bound),注重完成绩效指标的特定期限。

    意义
    在制定工作目标是,考虑一下目标与计划是否SMART化。只有具备SMART化的计划才具有良好的可实施性,才能保证计划实现。


    任务分解法

    工作分解结构(Work Breakdown Structure,简称WBS)跟因数分解是一个原理,就是把一个项目,按一定的原则分解,项目分解成任务,任务再分解成一项项工作,再把一项项工作分配到每个人的日常活动中,直到分解不下去为止。即:

    项目→任务→工作→日常活动

    工作分解结构,以可交付成果为导向对项目要素进行的分组,它归纳和定义了项目的整个工作范围,每下降一层代表对项目工作的更详细定义。

    WBS总是处于计划过程的中心,也是制定进度计划、资源需求、成本预算、风险管理计划和采购计划等的重要基础。WBS同时也是控制项目变更的重要基础。项目范围是由WBS定义的,所以WBS也是一个项目的综合工具。

    任务分解的原则

    1. 将主体目标逐步细化分解,最底层的日常活动可直接分派到个人去完成;
    2. 每个任务原则上要求分解到不能再细分为止;
    3. 日常活动要对应到人、时间和资金投入。

    任务分解的方法

    1. 采用树状结构进行分解;
    2. 以团队为中心,自上而下与自下而上的充分沟通,一对一个别交流与讨论,分解单项工作。

    任务分解的标准

    1. 分解后的活动结构清晰,从树根到树叶,一目了然,尽量避免盘根错节;

    意义
    学会分解任务。只有将任务分解到足够细,才能心里有数,才能有条不紊的工作,才能统筹安排时间及成本。


    OGSM计划法

    OGSM是Objective(目的)、Goal(目标)、Strategy(策略)、Measurement(测量)的英文首字母组成。OGSM是一种计划与执行管理工具,一种制定策略计划的强大工具,以使业务集中在大的目的与目标,与关键策略上;一种实践策略的手段,以达成理想的目的与目标。通常用来制定公司的策略计划,即未来发展的蓝图。
    OGSM

    制定OGSM的要点

    1. 你的基本目的是保证上级的目标的实现,当然还可以有自己认为重要的;
    2. 你的G应是你O的更细化、更精确化的描述,目标是尽量可以轻松考量的,G和O之间应有必要性和必定性的关系;
    3. 制定S时,我们往往会把有利于G实现的举措一五一十地搬出来,这是不对的——因为,你的资源是有限的,你无法把有用的举措一一实现,你必须找到帮助你达成G的最有ROI的一群举措!所谓策略,就是重点一些,放弃一些;
    4. 你的S和G之间,同样应具备必然性和必要性的关系;
    5. 最后扪心问问自己,这样做一定可以实现目的吗?可行吗?

    OGSMT

    意义
    OGSM在你制定年度计划时,强迫你对自己朴素、直觉的一些想法作一个系统化的梳理,非常直观有效地帮助你预先检视自己的计划,它将强迫你启动智慧。不排除你未来的策略你会作很大的调整,但如果你难以完成它,那一定是你的思考没有到位。

    展开全文
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    String为什么是不可变的 Date相关 包装类相关 自动装箱与拆箱 int 和 Integer 有什么区别 Integer a= 127 与 Integer b = 127相等吗 常用工具类库 单元测试 日志 Java面试总结汇总,整理了包括Java基础知识,集合...

    Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎大家关注!😊😊

    【技术人成长之路】,助力技术人成长!更多精彩文章第一时间在公众号发布哦!

    文章目录

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

    序号内容链接地址
    1Java基础知识面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390612
    2Java集合容器面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588551
    3Java异常面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390689
    4并发编程面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104863992
    5JVM面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390752
    6Spring面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397516
    7Spring MVC面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397427
    8Spring Boot面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397299
    9Spring Cloud面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397367
    10MyBatis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/101292950
    11Redis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/103522351
    12MySQL数据库面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104778621
    13消息中间件MQ与RabbitMQ面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588612
    14Dubbo面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390006
    15Linux面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588679
    16Tomcat面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397665
    17ZooKeeper面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397719
    18Netty面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104391081
    19架构设计&分布式&数据结构与算法面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/105870730

    Java概述

    何为编程

    编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。

    为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。

    什么是Java

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。

    jdk1.5之后的三大版本

    • Java SE(J2SE,Java 2 Platform Standard Edition,标准版)
      Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。
    • Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版)
      Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。2018年2月,Eclipse 宣布正式将 JavaEE 更名为 JakartaEE
    • Java ME(J2ME,Java 2 Platform Micro Edition,微型版)
      Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

    JVM、JRE和JDK的关系

    JVM
    Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。

    JRE
    Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包

    如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

    JDK
    Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等

    JVM&JRE&JDK关系图

    什么是跨平台性?原理是什么

    所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

    实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。

    Java语言有哪些特点

    简单易学(Java语言的语法与C语言和C++语言很接近)

    面向对象(封装,继承,多态)

    平台无关性(Java虚拟机实现平台无关性)

    支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)

    支持多线程(多线程机制使应用程序在同一时间并行执行多项任)

    健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)

    安全性

    什么是字节码?采用字节码的最大好处是什么

    字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。

    采用字节码的好处

    Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

    先看下java中的编译器和解释器

    Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行,这就是上面提到的Java的特点的编译与解释并存的解释。

    Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。
    

    什么是Java程序的主类?应用程序和小程序的主类有何不同?

    一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。

    Java应用程序与小程序之间有那些差别?

    简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。

    Java和C++的区别

    我知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来!

    • 都是面向对象的语言,都支持封装、继承和多态
    • Java不提供指针来直接访问内存,程序内存更加安全
    • Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。
    • Java有自动内存管理机制,不需要程序员手动释放无用内存

    Oracle JDK 和 OpenJDK 的对比

    1. Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;

    2. OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;

    3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题;

    4. 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能;

    5. Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;

    6. Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。

    基础语法

    数据类型

    Java有哪些数据类型

    定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。

    分类

    • 基本数据类型
      • 数值型
        • 整数类型(byte,short,int,long)
        • 浮点类型(float,double)
      • 字符型(char)
      • 布尔型(boolean)
    • 引用数据类型
      • 类(class)
      • 接口(interface)
      • 数组([])

    Java基本数据类型图

    switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上

    在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

    用最有效率的方法计算 2 乘以 8

    2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。

    Math.round(11.5) 等于多少?Math.round(-11.5)等于多少

    Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。

    float f=3.4;是否正确

    不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;。

    short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗

    对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。

    而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。

    编码

    Java语言采用何种编码方案?有何特点?

    Java语言采用Unicode编码标准,Unicode(标准码),它为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。

    注释

    什么Java注释

    定义:用于解释说明程序的文字

    分类

    • 单行注释
      格式: // 注释文字
    • 多行注释
      格式: /* 注释文字 */
    • 文档注释
      格式:/** 注释文字 */

    作用

    在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容在程序编译的时候会被忽视,不会产生目标代码,注释的部分不会对程序的执行结果产生任何影响。

    注意事项:多行和文档注释都不能嵌套使用。

    访问修饰符

    访问修饰符 public,private,protected,以及不写(默认)时的区别

    定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

    分类

    private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
    default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
    protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
    public : 对所有类可见。使用对象:类、接口、变量、方法

    访问修饰符图

    运算符

    &和&&的区别

    &运算符有两种用法:(1)按位与;(2)逻辑与。

    &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。

    注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

    关键字

    Java 有没有 goto

    goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。

    final 有什么用?

    用于修饰类、属性和方法;

    • 被final修饰的类不可以被继承
    • 被final修饰的方法不可以被重写
    • 被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

    final finally finalize区别

    • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表
      示该变量是一个常量不能被重新赋值。
    • finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块
      中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
    • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调
      用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的
      最后判断。

    this关键字的用法

    this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。

    this的用法在java中大体可以分为3种:

    1.普通的直接引用,this相当于是指向当前对象本身。

    2.形参与成员名字重名,用this来区分:

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    

    3.引用本类的构造函数

    class Person{
        private String name;
        private int age;
        
        public Person() {
        }
     
        public Person(String name) {
            this.name = name;
        }
        public Person(String name, int age) {
            this(name);
            this.age = age;
        }
    }
    

    super关键字的用法

    super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

    super也有三种用法:

    1.普通的直接引用

    与this类似,super相当于是指向当前对象的父类的引用,这样就可以用super.xxx来引用父类的成员。

    2.子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分

    class Person{
        protected String name;
     
        public Person(String name) {
            this.name = name;
        }
     
    }
     
    class Student extends Person{
        private String name;
     
        public Student(String name, String name1) {
            super(name);
            this.name = name1;
        }
     
        public void getInfo(){
            System.out.println(this.name);      //Child
            System.out.println(super.name);     //Father
        }
     
    }
    
    public class Test {
        public static void main(String[] args) {
           Student s1 = new Student("Father","Child");
           s1.getInfo();
     
        }
    }
    

    3.引用父类构造函数

    3、引用父类构造函数

    • super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
    • this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

    this与super的区别

    • super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
    • this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
    • super()和this()类似,区别是,super()在子类中调用父类的构造方法,this()在本类内调用本类的其它构造方法。
    • super()和this()均需放在构造方法内第一行。
    • 尽管可以用this调用一个构造器,但却不能调用两个。
    • this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
    • this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
    • 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

    static存在的主要意义

    static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法

    static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

    为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

    static的独特之处

    1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享

    怎么理解 “被类的实例对象所共享” 这句话呢?就是说,一个类的静态成员,它是属于大伙的【大伙指的是这个类的多个对象实例,我们都知道一个类可以创建多个实例!】,所有的类对象共享的,不像成员变量是自个的【自个指的是这个类的单个实例对象】…我觉得我已经讲的很通俗了,你明白了咩?

    2、在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。

    3、static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!

    4、被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

    static应用场景

    因为static是被类的实例对象所共享,因此如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量

    因此比较常见的static应用场景有:

    1、修饰成员变量 2、修饰成员方法 3、静态代码块 4、修饰类【只能修饰内部类也就是静态内部类】 5、静态导包

    static注意事项

    1、静态只能访问静态。 2、非静态既可以访问非静态的,也可以访问静态的。

    流程控制语句

    break ,continue ,return 的区别及作用

    break 跳出总上一层循环,不再执行循环(结束当前的循环体)

    continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)

    return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)

    在 Java 中,如何跳出当前的多重嵌套循环

    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如:

    public static void main(String[] args) {
        ok:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.println("i=" + i + ",j=" + j);
                if (j == 5) {
                    break ok;
                }
    
            }
        }
    }
    

    面向对象

    面向对象概述

    面向对象和面向过程的区别

    面向过程

    优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

    缺点:没有面向对象易维护、易复用、易扩展

    面向对象

    优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护

    缺点:性能比面向过程低

    面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。

    面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。

    面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。

    面向对象三大特性

    面向对象的特征有哪些方面

    面向对象的特征主要有以下几个方面

    抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

    封装

    封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

    继承

    继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。

    关于继承如下 3 点请记住:

    1. 子类拥有父类非 private 的属性和方法。

    2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

    3. 子类可以用自己的方式实现父类的方法。(以后介绍)。

    多态

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

    在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

    其中Java 面向对象编程三大特性:封装 继承 多态

    封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。

    继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承可以提高代码复用性。继承是多态的前提。

    关于继承如下 3 点请记住

    1. 子类拥有父类非 private 的属性和方法。

    2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

    3. 子类可以用自己的方式实现父类的方法。

    多态性:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。

    在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

    方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

    一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:

    • 方法重写(子类继承父类并重写父类中已有的或抽象的方法);
    • 对象造型(用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

    什么是多态机制?Java语言是如何实现多态的?

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

    多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

    多态的实现

    Java实现多态有三个必要条件:继承、重写、向上转型。

    继承:在多态中必须存在有继承关系的子类和父类。

    重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。

    向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

    只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

    对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

    面向对象五大基本原则是什么(可选)

    • 单一职责原则SRP(Single Responsibility Principle)
      类的功能要单一,不能包罗万象,跟杂货铺似的。
    • 开放封闭原则OCP(Open-Close Principle)
      一个模块对于拓展是开放的,对于修改是封闭的,想要增加功能热烈欢迎,想要修改,哼,一万个不乐意。
    • 里式替换原则LSP(the Liskov Substitution Principle LSP)
      子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。哈哈~~
    • 依赖倒置原则DIP(the Dependency Inversion Principle DIP)
      高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的抽象是中国人,而不是你是xx村的。
    • 接口分离原则ISP(the Interface Segregation Principle ISP)
      设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。

    类与接口

    抽象类和接口的对比

    抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。

    从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

    相同点

    • 接口和抽象类都不能实例化
    • 都位于继承的顶端,用于被其他实现或继承
    • 都包含抽象方法,其子类都必须覆写这些抽象方法

    不同点

    参数抽象类接口
    声明抽象类使用abstract关键字声明接口使用interface关键字声明
    实现子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现
    构造器抽象类可以有构造器接口不能有构造器
    访问修饰符抽象类中的方法可以是任意访问修饰符接口方法默认修饰符是public。并且不允许定义为 private 或者 protected
    多继承一个类最多只能继承一个抽象类一个类可以实现多个接口
    字段声明抽象类的字段声明可以是任意的接口的字段默认都是 static 和 final 的

    备注:Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。

    现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。

    接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:

    • 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
    • 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。

    普通类和抽象类有哪些区别?

    • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
    • 抽象类不能直接实例化,普通类可以直接实例化。

    抽象类能使用 final 修饰吗?

    不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类

    创建一个对象用什么关键字?对象实例与对象引用有何不同?

    new关键字,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)

    变量与方法

    成员变量与局部变量的区别有哪些

    变量:在程序执行的过程中,在某个范围内其值可以发生改变的量。从本质上讲,变量其实是内存中的一小块区域

    成员变量:方法外部,类内部定义的变量

    局部变量:类的方法中的变量。

    成员变量和局部变量的区别

    作用域

    成员变量:针对整个类有效。
    局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)

    存储位置

    成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。
    局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。

    生命周期

    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:当方法调用完,或者语句结束后,就自动释放。

    初始值

    成员变量:有默认初始值。

    局部变量:没有默认初始值,使用前必须赋值。

    使用原则

    在使用变量时需要遵循的原则为:就近原则
    首先在局部范围找,有就使用;接着在成员位置找。

    在Java中定义一个不做事且没有参数的构造方法的作用

    Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

    在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?

    帮助子类做初始化工作。

    一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么?

    主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

    构造方法有哪些特性?

    名字与类名相同;

    没有返回值,但不能用void声明构造函数;

    生成类的对象时自动执行,无需调用。

    静态变量和实例变量区别

    静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。

    实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。

    静态变量与普通变量区别

    static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

    还有一点就是static成员变量的初始化顺序按照定义的顺序进行初始化。

    静态方法和实例方法有何不同?

    静态方法和实例方法的区别主要体现在两个方面:

    1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
    2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

    在一个静态方法内调用一个非静态成员为什么是非法的?

    由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

    什么是方法的返回值?返回值的作用是什么?

    方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!

    内部类

    什么是内部类?

    在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。

    内部类的分类有哪些

    内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类

    静态内部类

    定义在类内部的静态类,就是静态内部类。

    public class Outer {
    
        private static int radius = 1;
    
        static class StaticInner {
            public void visit() {
                System.out.println("visit outer static  variable:" + radius);
            }
        }
    }
    

    静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;静态内部类的创建方式,new 外部类.静态内部类(),如下:

    Outer.StaticInner inner = new Outer.StaticInner();
    inner.visit();
    
    成员内部类

    定义在类内部,成员位置上的非静态类,就是成员内部类。

    public class Outer {
    
        private static  int radius = 1;
        private int count =2;
        
         class Inner {
            public void visit() {
                System.out.println("visit outer static  variable:" + radius);
                System.out.println("visit outer   variable:" + count);
            }
        }
    }
    

    成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有。成员内部类依赖于外部类的实例,它的创建方式外部类实例.new 内部类(),如下:

    Outer outer = new Outer();
    Outer.Inner inner = outer.new Inner();
    inner.visit();
    
    局部内部类

    定义在方法中的内部类,就是局部内部类。

    public class Outer {
    
        private  int out_a = 1;
        private static int STATIC_b = 2;
    
        public void testFunctionClass(){
            int inner_c =3;
            class Inner {
                private void fun(){
                    System.out.println(out_a);
                    System.out.println(STATIC_b);
                    System.out.println(inner_c);
                }
            }
            Inner  inner = new Inner();
            inner.fun();
        }
        public static void testStaticFunctionClass(){
            int d =3;
            class Inner {
                private void fun(){
                    // System.out.println(out_a); 编译错误,定义在静态方法中的局部类不可以访问外部类的实例变量
                    System.out.println(STATIC_b);
                    System.out.println(d);
                }
            }
            Inner  inner = new Inner();
            inner.fun();
        }
    }
    

    定义在实例方法中的局部类可以访问外部类的所有变量和方法,定义在静态方法中的局部类只能访问外部类的静态变量和方法。局部内部类的创建方式,在对应方法内,new 内部类(),如下:

     public static void testStaticFunctionClass(){
        class Inner {
        }
        Inner  inner = new Inner();
     }
    
    匿名内部类

    匿名内部类就是没有名字的内部类,日常开发中使用的比较多。

    public class Outer {
    
        private void test(final int i) {
            new Service() {
                public void method() {
                    for (int j = 0; j < i; j++) {
                        System.out.println("匿名内部类" );
                    }
                }
            }.method();
        }
     }
     //匿名内部类必须继承或实现一个已有的接口 
     interface Service{
        void method();
    }
    

    除了没有名字,匿名内部类还有以下特点:

    • 匿名内部类必须继承一个抽象类或者实现一个接口。
    • 匿名内部类不能定义任何静态成员和静态方法。
    • 当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。
    • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

    匿名内部类创建方式:

    new/接口{ 
      //匿名内部类实现部分
    }
    

    内部类的优点

    我们为什么要使用内部类呢?因为它有以下优点:

    • 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据!
    • 内部类不为同一包的其他类所见,具有很好的封装性;
    • 内部类有效实现了“多重继承”,优化 java 单继承的缺陷。
    • 匿名内部类可以很方便的定义回调。

    内部类有哪些应用场景

    1. 一些多算法场合
    2. 解决一些非面向对象的语句块。
    3. 适当使用内部类,使得代码更加灵活和富有扩展性。
    4. 当某个类除了它的外部类,不再被其他的类使用时。

    局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?

    局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final呢?它内部原理是什么呢?

    先看这段代码:

    public class Outer {
    
        void outMethod(){
            final int a =10;
            class Inner {
                void innerMethod(){
                    System.out.println(a);
                }
    
            }
        }
    }
    

    以上例子,为什么要加final呢?是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题。

    内部类相关,看程序说出运行结果

    public class Outer {
        private int age = 12;
    
        class Inner {
            private int age = 13;
            public void print() {
                int age = 14;
                System.out.println("局部变量:" + age);
                System.out.println("内部类变量:" + this.age);
                System.out.println("外部类变量:" + Outer.this.age);
            }
        }
    
        public static void main(String[] args) {
            Outer.Inner in = new Outer().new Inner();
            in.print();
        }
    
    }
    

    运行结果:

    局部变量:14
    内部类变量:13
    外部类变量:12
    

    重写与重载

    构造器(constructor)是否可被重写(override)

    构造器不能被继承,因此不能被重写,但可以被重载。

    重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

    重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分

    重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

    对象相等判断

    == 和 equals 的区别是什么

    == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)

    equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

    情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

    情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

    举个例子:

    public class test1 {
        public static void main(String[] args) {
            String a = new String("ab"); // a 为一个引用
            String b = new String("ab"); // b为另一个引用,对象的内容一样
            String aa = "ab"; // 放在常量池中
            String bb = "ab"; // 从常量池中查找
            if (aa == bb) // true
                System.out.println("aa==bb");
            if (a == b) // false,非同一对象
                System.out.println("a==b");
            if (a.equals(b)) // true
                System.out.println("aEQb");
            if (42 == 42.0) { // true
                System.out.println("true");
            }
        }
    }
    

    说明:

    • String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。
    • 当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。

    hashCode 与 equals (重要)

    HashSet如何检查重复

    两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

    hashCode和equals方法的关系

    面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?”

    hashCode()介绍

    hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。

    散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

    为什么要有 hashCode

    我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode

    当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

    hashCode()与equals()的相关规定

    如果两个对象相等,则hashcode一定也是相同的

    两个对象相等,对两个对象分别调用equals方法都返回true

    两个对象有相同的hashcode值,它们也不一定是相等的

    因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

    hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

    对象的相等与指向他们的引用相等,两者有什么不同?

    对象的相等 比的是内存中存放的内容是否相等而 引用相等 比较的是他们指向的内存地址是否相等。

    值传递

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递

    是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的

    为什么 Java 中只有值传递

    首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。 它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。

    Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。

    下面通过 3 个例子来给大家说明

    example 1

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
    
        swap(num1, num2);
    
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    

    结果

    a = 20
    b = 10
    num1 = 10
    num2 = 20
    

    解析

    img

    在swap方法中,a、b的值进行交换,并不会影响到 num1、num2。因为,a、b中的值,只是从 num1、num2 的复制过来的。也就是说,a、b相当于num1、num2 的副本,副本的内容无论怎么修改,都不会影响到原件本身。

    通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样,请看 example2.

    example 2

        public static void main(String[] args) {
            int[] arr = { 1, 2, 3, 4, 5 };
            System.out.println(arr[0]);
            change(arr);
            System.out.println(arr[0]);
        }
    
        public static void change(int[] array) {
            // 将数组的第一个元素变为0
            array[0] = 0;
        }
    

    结果

    1
    0
    

    解析

    img

    array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的时同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。

    通过 example2 我们已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。

    很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员(甚至本书的作者)认为Java程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。

    example 3

    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Student s1 = new Student("小张");
            Student s2 = new Student("小李");
            Test.swap(s1, s2);
            System.out.println("s1:" + s1.getName());
            System.out.println("s2:" + s2.getName());
        }
    
        public static void swap(Student x, Student y) {
            Student temp = x;
            x = y;
            y = temp;
            System.out.println("x:" + x.getName());
            System.out.println("y:" + y.getName());
        }
    }
    

    结果

    x:小李
    y:小张
    s1:小张
    s2:小李
    

    解析

    交换之前:

    img

    交换之后:

    img

    通过上面两张图可以很清晰的看出: 方法并没有改变存储在变量 s1 和 s2 中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝

    总结

    Java程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。

    下面再总结一下Java中方法参数的使用情况:

    • 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型》
    • 一个方法可以改变一个对象参数的状态。
    • 一个方法不能让对象参数引用一个新的对象。

    值传递和引用传递有什么区别

    值传递:指的是在方法调用时,传递的参数是按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。

    引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

    Java包

    JDK 中常用的包有哪些

    • java.lang:这个是系统的基础类;
    • java.io:这里面是所有输入输出有关的类,比如文件操作等;
    • java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
    • java.net:这里面是与网络有关的类;
    • java.util:这个是系统辅助类,特别是集合类;
    • java.sql:这个是数据库操作的类。

    import java和javax有什么区别

    刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来说使用。然而随着时间的推移,javax 逐渐的扩展成为 Java API 的组成部分。但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准API的一部分。

    所以,实际上java和javax没有区别。这都是一个名字。

    IO流

    java 中 IO 流分为几种?

    • 按照流的流向分,可以分为输入流和输出流;
    • 按照操作单元划分,可以划分为字节流和字符流;
    • 按照流的角色划分为节点流和处理流。

    Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java I0流的40多个类都是从如下4个抽象类基类中派生出来的。

    • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
    • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

    按操作方式分类结构图:

    IO-操作方式分类

    按操作对象分类结构图:

    IO-操作对象分类

    BIO,NIO,AIO 有什么区别?

    简答

    • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
    • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
    • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

    详细回答

    • BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
    • NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 SocketServerSocket 相对应的 SocketChannelServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
    • AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。

    Files的常用方法都有哪些?

    • Files. exists():检测文件路径是否存在。
    • Files. createFile():创建文件。
    • Files. createDirectory():创建文件夹。
    • Files. delete():删除一个文件或目录。
    • Files. copy():复制文件。
    • Files. move():移动文件。
    • Files. size():查看文件个数。
    • Files. read():读取文件。
    • Files. write():写入文件。

    反射

    什么是反射机制?

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    静态编译和动态编译

    • **静态编译:**在编译时确定类型,绑定对象
    • **动态编译:**运行时确定类型,绑定对象

    反射机制优缺点

    • 优点: 运行期类型的判断,动态加载类,提高代码灵活度。
    • 缺点: 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。

    反射机制的应用场景有哪些?

    反射是框架设计的灵魂。

    在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

    举例:①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性

    Java获取反射的三种方法

    1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制

    public class Student {
        private int id;
        String name;
        protected boolean sex;
        public float score;
    }
    
    public class Get {
        //获取反射机制三种方式
        public static void main(String[] args) throws ClassNotFoundException {
            //方式一(通过建立对象)
            Student stu = new Student();
            Class classobj1 = stu.getClass();
            System.out.println(classobj1.getName());
            //方式二(所在通过路径-相对路径)
            Class classobj2 = Class.forName("fanshe.Student");
            System.out.println(classobj2.getName());
            //方式三(通过类名)
            Class classobj3 = Student.class;
            System.out.println(classobj3.getName());
        }
    }
    

    网络编程

    网络编程的面试题可以查看我的这篇文章重学TCP/IP协议和三次握手四次挥手,内容不仅包括TCP/IP协议和三次握手四次挥手的知识,还包括计算机网络体系结构,HTTP协议,get请求和post请求区别,session和cookie的区别等,欢迎大家阅读。

    常用API

    String相关

    字符型常量和字符串常量的区别

    1. 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
    2. 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
    3. 占内存大小 字符常量只占两个字节 字符串常量占若干个字节(至少一个字符结束标志)

    什么是字符串常量池?

    字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

    String 是最基本的数据类型吗

    不是。Java 中的基本数据类型只有 8 个 :byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(referencetype),Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。

    这是很基础的东西,但是很多初学者却容易忽视,Java 的 8 种基本数据类型中不包括 String,基本数据类型中用来描述文本数据的是 char,但是它只能表示单个字符,比如 ‘a’,‘好’ 之类的,如果要描述一段文本,就需要用多个 char 类型的变量,也就是一个 char 类型数组,比如“你好” 就是长度为2的数组 char[] chars = {‘你’,‘好’};

    但是使用数组过于麻烦,所以就有了 String,String 底层就是一个 char 类型的数组,只是使用的时候开发者不需要直接操作底层数组,用更加简便的方式即可完成对字符串的使用。

    String有哪些特性

    • 不变性:String 是只读字符串,是一个典型的 immutable 对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。

    • 常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。

    • final:使用 final 来定义 String 类,表示 String 类不能被继承,提高了系统的安全性。

    String为什么是不可变的吗?

    简单来说就是String类利用了final修饰的char类型数组存储字符,源码如下图所以:

    /** The value is used for character storage. */
    private final char value[];
    

    String真的是不可变的吗?

    我觉得如果别人问这个问题的话,回答不可变就可以了。 下面只是给大家看两个有代表性的例子:

    1) String不可变但不代表引用不可以变

    String str = "Hello";
    str = str + " World";
    System.out.println("str=" + str);
    

    结果:

    str=Hello World
    

    解析:

    实际上,原来String的内容是不变的,只是str由原来指向"Hello"的内存地址转为指向"Hello World"的内存地址而已,也就是说多开辟了一块内存区域给"Hello World"字符串。

    2) 通过反射是可以修改所谓的“不可变”对象

    // 创建字符串"Hello World", 并赋给引用s
    String s = "Hello World";
    
    System.out.println("s = " + s); // Hello World
    
    // 获取String类中的value字段
    Field valueFieldOfString = String.class.getDeclaredField("value");
    
    // 改变value属性的访问权限
    valueFieldOfString.setAccessible(true);
    
    // 获取s对象上的value属性的值
    char[] value = (char[]) valueFieldOfString.get(s);
    
    // 改变value所引用的数组中的第5个字符
    value[5] = '_';
    
    System.out.println("s = " + s); // Hello_World
    

    结果:

    s = Hello World
    s = Hello_World
    

    解析:

    用反射可以访问私有成员, 然后反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。但是一般我们不会这么做,这里只是简单提一下有这个东西。

    是否可以继承 String 类

    String 类是 final 类,不可以被继承。

    String str="i"与 String str=new String(“i”)一样吗?

    不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

    String s = new String(“xyz”);创建了几个字符串对象

    两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象。

    String str1 = "hello"; //str1指向静态区
    String str2 = new String("hello");  //str2指向堆上的对象
    String str3 = "hello";
    String str4 = new String("hello");
    System.out.println(str1.equals(str2)); //true
    System.out.println(str2.equals(str4)); //true
    System.out.println(str1 == str3); //true
    System.out.println(str1 == str2); //false
    System.out.println(str2 == str4); //false
    System.out.println(str2 == "hello"); //false
    str2 = str1;
    System.out.println(str2 == "hello"); //true
    

    如何将字符串反转?

    使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

    示例代码:

    // StringBuffer reverse
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer. append("abcdefg");
    System. out. println(stringBuffer. reverse()); // gfedcba
    // StringBuilder reverse
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder. append("abcdefg");
    System. out. println(stringBuilder. reverse()); // gfedcba
    

    数组有没有 length()方法?String 有没有 length()方法

    数组没有 length()方法 ,有 length 的属性。String 有 length()方法。JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。

    String 类的常用方法都有那些?

    • indexOf():返回指定字符的索引。
    • charAt():返回指定索引处的字符。
    • replace():字符串替换。
    • trim():去除字符串两端空白。
    • split():分割字符串,返回一个分割后的字符串数组。
    • getBytes():返回字符串的 byte 类型数组。
    • length():返回字符串长度。
    • toLowerCase():将字符串转成小写字母。
    • toUpperCase():将字符串转成大写字符。
    • substring():截取字符串。
    • equals():字符串比较。

    在使用 HashMap 的时候,用 String 做 key 有什么好处?

    HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更快。

    String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的

    可变性

    String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。

    线程安全性

    String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

    性能

    每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

    对于三者使用的总结

    如果要操作少量的数据用 = String

    单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

    多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

    Date相关

    包装类相关

    自动装箱与拆箱

    装箱:将基本类型用它们对应的引用类型包装起来;

    拆箱:将包装类型转换为基本数据类型;

    int 和 Integer 有什么区别

    Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

    Java 为每个原始类型提供了包装类型:

    原始类型: boolean,char,byte,short,int,long,float,double

    包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

    Integer a= 127 与 Integer b = 127相等吗

    对于对象引用类型:==比较的是对象的内存地址。
    对于基本数据类型:==比较的是值。

    如果整型字面量的值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1的结果是false

    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = 3;  // 将3自动装箱成Integer类型
        int c = 3;
        System.out.println(a == b); // false 两个引用没有引用同一对象
        System.out.println(a == c); // true a自动拆箱成int类型再和c比较
        System.out.println(b == c); // true
    
        Integer a1 = 128;
        Integer b1 = 128;
        System.out.println(a1 == b1); // false
    
        Integer a2 = 127;
        Integer b2 = 127;
        System.out.println(a2 == b2); // true
    }
    

    常用工具类库

    单元测试

    日志

    展开全文
  • Java 程序员常用的开发工具

    万次阅读 多人点赞 2018-03-30 11:45:16
    1、常用开发工具作为一名Java程序开发人员,可以的选择集成开发环境IDE(Integrated Development Environment)非常多,得益于Java是一门开源语言。有开源免费的;有商用收费的。如何选择一款适合自己的集成开发环境...

    1、常用开发工具

    作为一名Java程序开发人员,可以的选择集成开发环境IDE(Integrated Development Environment)非常多,得益于Java是一门开源语言。有开源免费的;有商用收费的。如何选择一款适合自己的集成开发环境,亦或说选择一款符合自己项目开发需要的集成开发环境。如果选择得当,那么就能够使得开发工作事半功倍;否则事倍而功半。

     

    免费开源Eclipse

    Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

    Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++、PHP、Python等语言的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。

    enter image description here

     

    商用收费MyEclipse(中国官网

    MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,由Genuitec公司发布,它是商用收费的。

    MyEclipse 是对Eclipse IDE的扩展,利用它可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML、Struts、JSP、CSS、Javascript、SQL,Hibernate,Spring。

    enter image description here

     

    Oracle公司免费的NetBeans

    NetBeans是Sun公司(2009年被甲骨文收购)在2000年创立的开放源代码供开发人员和客户社区的家园,旨在构建世界级的Java IDE。

    NetBeans当前可以在Solaris、Windows、Linux和Macintosh OS X平台上进行开发,并在SPL(Sun公用许可)范围内使用,是一个屡获殊荣的集成开发环境。NetBeans包括开源的开发环境和应用平台,NetBeans IDE可以使开发人员利用Java平台能够快速创建Web、企业、桌面以及移动的应用程序,NetBeans IDE目前支持PHP、Ruby、JavaScript、Ajax、Groovy、Grails和C /C + +等开发语言。

    NetBeans项目由一个活跃的开发社区提供支持, NetBean开发环境提供了丰富的产品文档和培训资源以及大量的第三方插件。

    enter image description here

     

    IntelliJ IDEA

    IntelliJ IDEA是一款综合的Java 编程环境,被许多开发人员和行业专家誉为市场上最好的IDE。它提供了一系列最实用的的工具组合:智能编码辅助和自动控制,支持J2EE,Ant,JUnit,SVN和Git集成,非平行的编码检查和创新的GUI设计器。IDEA把Java开发人员从一些耗时的常规工作中解放出来,显著地提高了开发效率。具有运行更快速,生成更好的代码;持续的重新设计和日常编码变得更加简易,与其它工具的完美集成;很高的性价比等特点。IntelliJ IDEA以前是收费软件,不过在2009年以后就开始推出了免费的社区开源版本。不过商用还是需要收费的。

    enter image description here

    Eclipse、MyEclipse、NetBeans和IntelliJ IDEA的特点和适用场景:

    Eclipse、MyEclipse、NetBeans和IntelliJ IDEA这四个IDE有着不同的特性和优点,根据开发的不同可能需要选择不同的IDE。在Java开发的每个方面,这四个IDE都能胜任工作,然而根据你所做的不同开发例如Swing开发,web开发或者企业开发,选择IDE就有所偏向。

    • Swing开发:

    如果你专门从事Swing开发,NetBeans无疑是最好的选择,如果你没有选择NetBeans而是选择了Eclipse,建议使用MyEclipse 和它的Matisse4Eclipse构造器。IDEA由于对JGoodies Forms的支持,所以在开发Swing方面与前两者相比并不占有优势。

    • JSP/Struts开发:

    开发JSP/Struts首选的是IDEA,接下来是MyEclipse,然后是NetBeans,由于缺少对内建Struts的支持,Eclipse的基本版本没有竞争优势。

    • JSF开发:

    在开发JSF方面,这三个IDE可以说都是很好的选择,但是IDEA可能会更好一点,接下来是Eclipse/MyEclipse,最后是NetBeans。

    • 企业开发:

    由于NetBeans对JPA的支持和它产生代码的质量以及对持久化单元合适的设置,所以在企业开发方面,NetBeans是首选,接下来是IDEA,由于Eclipse的Dali项目的限制,Eclipse可能是最后选择的。如果放弃标准的JPA,从事Hibernate开发,MyEclipse是最好的选择。

    除了上面提到的这四款由大公司开发的IDE外,JAVA开发的IDE还有很多,例如Spring基于eclipse推出的STS(Spring Tool Suite)、小而且快JCreator,但是以上最常用的eclipse和IntelliJ IDEA。国内Java开发人员使用的最多也是eclipse和IntelliJ IDEA。笔者用的最多是eclipse及Spring基于eclipse推出的STS。如果在使用中遇到什么可以无时无刻咨询。

    enter image description here

     

    2、常用接口测试工具

    作为一名开发人员,完成开发工作后,单元测试及接口测试必不可少。单元测试不用说了,Java人员几乎都是使用JUnit及JUnit相关的测试框架。对于接口测试呢?有什么工具可以使用呢?在说工具之前先来了解两个问题。

    什么是接口测试?

    用来检查各个组件的接口的测试,接口测试主要检查外部系统与系统之间以及各个子系统之间的交互点,测试的重点在数据的传递上。

    为什么要做接口测试?

    如果项目全部推行单元测试,时间上不允许,而接口测试是一种特殊的单元测试,覆盖率没有做到所谓的单元测试的百分之百,不过覆盖了所有的面像用户的功能点,而且接口测试可以采用自动化+持续集成的方式,节约时间了成本,同时提高了效率。

     

    java第三方包httpclient

    如果使用httpclient进行接口测试,免不了开发人员还需要自己动手去编写代码,这个不是首选方案。笔者也不推荐这个方案,增加了程序人员的工作强度。

     

    Postman

    Postman是一款功能非常棒的Chrome扩展,提供功能强大的API&HTTP请求调试。它可以发送几乎所有类型的HTTP请求,并可以附带任何数量的参数和请求头(headers)。可以说Postman满足了HTTP接口测试的大部分功能,只有少部分的功能不被支持,比如:请求流程的控制;使得程序员可以在编写一些单元测试中解脱出来。

    Postman特点:

    • 支持用例管理
    • 支持get、post、文件上传、响应验证、变量管理、环境参数管理等功能
    • 支持批量运行
    • 支持用例导出、导入
    • 支持云端保存用例【付费用户】

    推荐文章

    enter image description here

     

    JMeter

    Apache JMeter是Apache组织开发的压力测试工具,也是目前应用最广泛的开源性能测试工具之一。它最初被设计用于Web应用测试,后来扩展到其他测试领域。像其他性能测试工具一样,JMeter可以用于对服务器、网络或对象模拟巨大的负载,来测试不同压力类别下应用系统的强度,分析应用系统的整体性能。JMeter由100% JAVA开发,开源,具备完全的可移植性;采用Swing界面和轻量组件支持包;支持插件扩展,可以通过扩展插件支持新的协议,监控系统资源,展示更丰富的性能图表等。企业能够在JMeter的基础上实现二次开发,扩展JMeter的功能为己所用。不过要记住Jmeter由JAVA开发,安装Jmeter之前需要先安装JDK。Jmeter功能非常强大是笔者最喜欢的接口测试工具,没有之一。

    enter image description here

    Postman和Jmeter特点:

    (1)测试用例组织形式

    Jmeter和Postman的测试用例组织形式都比较扁平,Jmeter通过测试计划(TestPlan)来组织测试用例;Postman主要通过集合(Collection)来组织测试用例。

    (2)支持的接口类型与测试类型

    从功能上Jmeter最为强大,可以测试各种类型的接口(包括Http、数据库、webservice、ftp等),不支持的也可以通过网上或自己编写的插件进行扩展;Postman是轻量级的,定位也不同,可用来测试http接口和Rest接口。

    (3)流程控制

    Jmeter支持Switch控制器、If控制器、随机控制器等一系列控制器实现流程控制,以及Beanshell脚本;Postman则需要通过JavaScript脚本控制

    (4)断言

    Jmeter中的TestPlan、Threads Group和Sampler均可添加断言;Postman的HTTP请求的Tests中可添加断言。

    (5)脚本扩展能力

    Jmeter支持用java语言编写的Bean shell;Postman支持使用JavaScript语言编写的脚本

    (6)团队协作

    Jmeter的一个TestPlan就是一个jmx(xml)文件,无法分割,但是Jmeter有一个合并的功能,允许将多个文件合并在一起。只能每个团队成员自己建立一个TestPlan,分功能块进行测试,最后整理合并;Postman虽然有团队协作的功能,但是需要付费。

    Jmeter和Postman都还支持数据参数化、自定义变量、显示日志等功能。其中重点要说的是Jmeter还可以在无界面的Linux环境进行压力测试、性能测试;以便分析系统的瓶颈;Jmeter的功能覆盖了Postman的所有功能,所以强烈推荐使用Jmeter。

     

    3、常用远程连接工具

    做开发是国内程序员大部分都是在windows环境开发,但是开发完毕后,免不了需要部署到服务器(Liunx);特别是Java开发的程序,几乎都是部署在Unix或者Linux系统,而Unix和Liunx系统是无界面的系统。如何把程序部署到远程的Unix或者Linux服务呢?这时候远程连接工具就派上用场了。这里特别提一下如果做得是银行项目,远程连接工具是常伴左右的。

     

    SecureCRT和SecureFX

    SecureCRT是一款支持SSH协议(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件;SecureFX是对应的文件上传工具,使用SecureFX可以让我们使用SSH协议上传文件到远程服务器。

    enter image description here

    enter image description here

     

    Xshell和Xftp

    Xshell是一个功能强大的终端模拟器,支持SSH、SFTP、TELNET、远程登录命令连接; Xftp是一个灵活和轻量级SFTP / FTP客户端用户需要安全地通过网络传输文件。它提供了强大的功能,如直接编辑多个窗格、文件夹同步、他们支持服务器到服务器转移和第三方编辑器集成。

    enter image description here

    enter image description here

    远程连接和文件上传工具笔者最常用的就是这两款,有这任何一款都足以满足我们日常工作的需要了。如果只想上传文件话也可以使用Total Commander;如果只想远程连接的话也可以使用Putty.exe,这个远程连接工具非常小巧,而且免费使用。

    enter image description here

     

    4、一些其他常用工具

     
    文本编辑工具Notepad++和UltraEdit
    对比工具beyond compare

    使用场景:在进行版本上线时,有时需要对比一下生产版本与现在马上需要投产的版本有什么区别就需要用到该工具了,该工具提供了非常强大的对比功能。

    enter image description here

     

    反编译工具JD-GUI和JD-Eclipse

    使用场景:有时开发的代码某个接口在开发环境是好好的,跑的没有任何问题和纰漏;但是UAT环境或者准生产环境(部署人员确认已经部署了对应的接口),如果开发人员需要进一步确认部署人员正在部署了Jar包,这时反编译工具就派上用场了,开发人员可以在UAT环境或者准生产环境获取相应的Jar包,然后反编译看看相应接口的逻辑跟开发环境的是否一致。

    enter image description here

     

    快速启动工具TypeAndRun

    TypeAndRun (TAR) 是一个可以用热键呼出的控制台,从这个控制台上可以运行任何程序、打开各类文档、URL、电子邮件和文件目录。除了可以方便的为自己的常用程序建立别名,TypeAndRun也内置了大量“系统别名”用自定义的快捷键调出命令行后,输入别名即可执行相应操作。而且TypeAndRun 可以为已经建立的别名自动补全,无需记住全部名称。也不用像一些快捷键工具一样要记住那么多快捷键。这个工具是我极力推荐给广大开发人员的,使用了它就不需要打开“我的电脑”每次都使用鼠标双击了。

    enter image description here

     

    Source Insight

    Source Insight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++,C#和Java等程序的分析。SourceInsight能分析你的源代码并在你工作的同时动态维护它自己的符号数据库,并自动为你显示有用的上下文信息。

    使用场景:如果想在大量Java代码中搜索某些关键字,使用Source Insight工具可以非常快速找到相应的关键字;同时Source Insight支持Java关键字的高亮功能。

    enter image description here

     

    MySQL连接工具SQLyog

    使用场景:SQLyog是一款小巧的、连接mysql数据库的图形化工具。使用SQLyog主要方便开发人员操作mysql数据库,他提供了补全、关键字高亮、格式化sql语句等功能,在同类mysql图形界面工具中相当好用。

    enter image description here

     

    5、总结

    以上推荐了十几款软件,涉及到开发工具、接口测试工具、远程连接工具、文本工具、数据库连接工具等等。这些工具有免费开源的;有商用收费的(任何长期使用自己想办法哦!!)。在小公司使用以上的这些工具能满足程序员百分之八十的开发需要。这里的工具没有涉及到UML工具、原型工具、项目管理工具等。

    来自:  gitbook
    展开全文
  • Spring 最常用工具类汇总

    千次阅读 2019-01-05 18:07:23
    pattern styles org.springframework.util.PropertyPlaceholderHelper 用于处理占位符的替换 org.springframework.util.ReflectionUtils 反映常用工具方法. 有 findField, setField, getField, findMethod, ...

    jar包位置 spring-core.jar

    1.访问文件资源

    假设有一个文件地位于 Web 应用的类路径下,您可以通过以下方式对这个文件资源进行访问:

    FileSystemResource 以文件系统绝对路径的方式进行访问;
    ClassPathResource 以类路径的方式进行访问;
    ServletContextResource 以相对于 Web 应用根目录的方式进行访问。
    ResourceUtils 它支持“classpath:”和“file:”的地址前缀,它能够从指定的地址加载文件资源,常用方法:getFile()
    

    2.本地化文件资源

    LocalizedResourceHelper 允许通过文件资源基名和本地化实体获取匹配的本地化文件资源并以 Resource 对象返回
    

    3.文件操作

    FileCopyUtils,它提供了许多一步式的静态操作方法,能够将文件内容拷贝到一个目标 byte[]、String 甚至一个输出流或输出文件中。
    

    4.属性文件操作

    PropertiesLoaderUtils 允许您直接通过基于类路径的文件地址加载属性资源
    

    5.特殊编码的资源

    EncodedResource  当您使用 Resource 实现类加载文件资源时,它默认采用操作系统的编码格式。如果文件资源采用了特殊的编码格式(如 UTF-8),则在读取资源内容时必须事先通过 EncodedResource 指定编码格式,否则将会产生中文乱码的问题。
    

    6.操作 Servlet API 的工具类

    WebApplicationContextUtils 工具类获取 WebApplicationContext 对象
    WebApplicationContext wac =WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
    

    7.WebUtils

    主要方法:

    (1).getCookie(HttpServletRequest request, String name)	获取 HttpServletRequest 中特定名字的 Cookie 对象。如果您需要创建 Cookie, Spring 也提供了一个方便的 CookieGenerator 工具类;
    (2).getSessionAttribute(HttpServletRequest request, String name)	获取 HttpSession 特定属性名的对象,否则您必须通过 request.getHttpSession.getAttribute(name) 完成相同的操作;
    (3).getRequiredSessionAttribute(HttpServletRequest request, String name)	和上一个方法类似,只不过强制要求 HttpSession 中拥有指定的属性,否则抛出异常;
    (4).getSessionId(HttpServletRequest request)	获取 Session ID 的值;
    void exposeRequestAttributes(ServletRequest request, Map attributes)	将 Map 元素添加到 ServletRequest 的属性列表中,当请求被导向(forward)到下一个处理程序时,这些请求属性就可以被访问到了;
    

    8.延迟加载过滤器

    OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用 HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。
    

    9.中文乱码过滤器

    CharacterEncodingFilter 当通过表单向服务器提交数据时,一个经典的问题就是中文乱码问题。虽然我们所有的 JSP 文件和页面编码格式都采用 UTF-8,但这个问题还是会出现。解决的办法很简单,我们只需要在 web.xml 中配置一个 Spring 的编码转换过滤器就可以了
    

    10.请求跟踪日志过滤器

    ServletContextRequestLoggingFilter 在日志级别为 DEBUG 时才会起作用
    

    11.监听器配置

    WebAppRootListener 
    Log4J 监听器 Log4jConfigListener 
    缓存清除监听器 IntrospectorCleanupListener 
    

    12.特殊字符转义

    HTML 特殊字符转义
    HtmlUtils  常用方法 htmlEscape(),htmlUnescape()
    JavaScript 特殊字符转义
    JavaScriptUtils 常用方法:javaScriptEscape
    SQL特殊字符转义 (引入 jakarta commons lang 类包)
    StringEscapeUtils 常用方法: escapeSql
    

    13.方法入参检测工具类

    Assert  常用方法:notNull(Object object)/notNull(Object object, String message) 
    isNull(Object object)/isNull(Object object, String message)isTrue(boolean expression) / isTrue(boolean expression, String message)	
    notEmpty(Collection collection) / notEmpty(Collection collection, String message)	
    notEmpty(Map map) / notEmpty(Map map, String message)notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message)hasLength(String text) / hasLength(String text, String message)hasText(String text) / hasText(String text, String message;
    isInstanceOf(Class clazz, Object obj) / isInstanceOf(Class type, Object obj, String message)	如果 obj 不能被正确造型为 clazz 指定的类将抛出异常;
    isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message)	subType 必须可以按类型匹配于 superType,否则将抛出异常;
    

    14.请求工具类 ServletRequestUtils

    //取请求参数的整数值:
    public static Integer getIntParameter(ServletRequest request, String name)
    public static int getIntParameter(ServletRequest request, String name, int defaultVal) -->单个值
    public static int[] getIntParameters(ServletRequest request, String name) -->数组
    还有譬如longfloatdoubleboolean、String的相关处理方法。
    

    15. 字符串工具类 org.springframework.util.StringUtils

    首字母大写: public static String capitalize(String str)
    首字母小写:public static String uncapitalize(String str)
    判断字符串是否为null或empty: public static boolean hasLength(String str)
    判断字符串是否为非空白字符串(即至少包含一个非空格的字符串)public static boolean hasText(String str)
    获取文件名:public static String getFilename(String path) 如e.g. "mypath/myfile.txt" -> "myfile.txt"
    获取文件扩展名:public static String getFilenameExtension(String path)"mypath/myfile.txt" -> "txt"
    还有譬如数组转集合、集合转数组、路径处理、字符串分离成数组、数组或集合合并为字符串、数组合并、向数组添加元素等。
    

    15.1集合工具类 CollectionUtils

    判断集合是否为空 isEmpty
    

    16.对象序列化与反序列化 org.springframework.util.SerializationUtils

    public static byte[] serialize(Object object)
    public static Object deserialize(byte[] bytes)
    

    17.数字处理 org.springframework.util.NumberUtils

    字符串转换为Number并格式化,包括具体的Number实现类,如Long、Integer、Double,字符串支持16进制字符串,并且会自动去除字符串中的空格:
        public static <T extends Number> T parseNumber(String text, Class<T> targetClass)
        public static <T extends Number> T parseNumber(String text, Class<T> targetClass, NumberFormat numberFormat)
    各种Number中的转换,如Long专为Integer,自动处理数字溢出(抛出异常):
    public static <T extends Number> T convertNumberToTargetClass(Number number, Class<T> targetClass)
    

    18.目录复制

    org.springframework.util.FileSystemUtils 递归复制、删除一个目录
    

    19.MD5加密 org.springframework.util.DigestUtils

    字节数组的MD5加密 public static String md5DigestAsHex(byte[] bytes)
    

    xml工具

    org.springframework.util.xml.AbstractStaxContentHandler
    org.springframework.util.xml.AbstractStaxXMLReader
    org.springframework.util.xml.AbstractXMLReader
    org.springframework.util.xml.AbstractXMLStreamReader
    org.springframework.util.xml.DomUtils
    org.springframework.util.xml.SimpleNamespaceContext
    org.springframework.util.xml.SimpleSaxErrorHandler
    org.springframework.util.xml.SimpleTransformErrorListener
    org.springframework.util.xml.StaxUtils
    org.springframework.util.xml.TransformerUtils
    

    其它工具集

    org.springframework.util.AntPathMatcherant 风格的处理
    org.springframework.util.AntPathStringMatcher
    org.springframework.util.Assert 断言,在我们的参数判断时应该经常用
    org.springframework.util.CachingMapDecorator
    org.springframework.util.ClassUtils 用于Class的处理
    org.springframework.util.CollectionUtils 用于处理集合的工具
    org.springframework.util.CommonsLogWriter
    org.springframework.util.CompositeIterator
    org.springframework.util.ConcurrencyThrottleSupport
    org.springframework.util.CustomizableThreadCreator
    org.springframework.util.DefaultPropertiesPersister
    org.springframework.util.DigestUtils 摘要处理, 这里有用于md5处理信息的
    org.springframework.util.FileCopyUtils 文件的拷贝处理, 结合Resource的概念一起来处理, 真的是很方便
    org.springframework.util.FileSystemUtils
    org.springframework.util.LinkedCaseInsensitiveMap key值不区分大小写的LinkedMap
    org.springframework.util.LinkedMultiValueMap 一个key可以存放多个值的LinkedMap
    org.springframework.util.Log4jConfigurer 一个log4j的启动加载指定配制文件的工具类
    org.springframework.util.NumberUtils 处理数字的工具类, 有parseNumber 可以把字符串处理成我们指定的数字格式, 还支持format格式, convertNumberToTargetClass 可以实现Number类型的转化. 
    org.springframework.util.ObjectUtils 有很多处理null object的方法. 如nullSafeHashCode, nullSafeEquals, isArray, containsElement, addObjectToArray, 等有用的方法
    org.springframework.util.PatternMatchUtils spring里用于处理简单的匹配. 如 Spring's typical &quot;xxx*&quot;, &quot;*xxx&quot; and &quot;*xxx*&quot; pattern styles
    org.springframework.util.PropertyPlaceholderHelper 用于处理占位符的替换
    org.springframework.util.ReflectionUtils 反映常用工具方法. 有 findField, setField, getField, findMethod, invokeMethod等有用的方法
    org.springframework.util.SerializationUtils 用于java的序列化与反序列化. serialize与deserialize方法
    org.springframework.util.StopWatch 一个很好的用于记录执行时间的工具类, 且可以用于任务分阶段的测试时间. 最后支持一个很好看的打印格式. 这个类应该经常用
    org.springframework.util.xSystemPropertyUtils
    org.springframework.util.TypeUtils 用于类型相容的判断. isAssignable
    org.springframework.util.WeakReferenceMonitor 弱引用的监控 
    

    web相关的工具

    org.springframework.web.util.CookieGenerator
    org.springframework.web.util.HtmlCharacterEntityDecoder
    org.springframework.web.util.HtmlCharacterEntityReferences
    org.springframework.web.util.HtmlUtils
    org.springframework.web.util.HttpUrlTemplate 这个类用于用字符串模板构建url, 它会自动处理url里的汉字及其它相关的编码. 在读取别人提供的url资源时, 应该经常用 String url = &quot;http://localhost/myapp/{name}/{id}&quot;
    org.springframework.web.util.JavaScriptUtils
    org.springframework.web.util.Log4jConfigListener 用listener的方式来配制log4j在web环境下的初始化
    org.springframework.web.util.UriTemplate
    org.springframework.web.util.UriUtils 处理uri里特殊字符的编码
    org.springframework.web.util.WebUtils
    

    SpringUtil工具类

    import com.alibaba.fastjson.JSONObject;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.context.ApplicationEvent;
    import org.springframework.core.env.Environment;
    import org.springframework.stereotype.Component;
    import java.util.Map;
    
    /**
     * Spring工具类
     */
    @Slf4j
    @Component
    public class SpringUtil implements ApplicationContextAware {
    
        /**
         * spring全局配置项
         */
        private static ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext context) throws BeansException {
            if (applicationContext == null) {
                applicationContext = context;
                log.info("ApplicationContext init success,you can invoke by SpringUtil.getApplicationContext() to get ApplicationContext,init bean count="
                        + applicationContext.getBeanDefinitionCount() + ",bean=" + JSONObject.toJSONString(applicationContext.getBeanDefinitionNames()));
            }
        }
    
        /**
         * @return spring全局配置项
         */
        public static ApplicationContext getApplicationContext() {
            return applicationContext;
        }
    
        /**
         * 通过name获取 Bean.
         *
         * @param name
         * @return
         */
        public static <T> T getBean(String name) {
            return (T) applicationContext.getBean(name);
        }
    
        /**
         * 通过class获取Bean.
         *
         * @param clazz
         * @return
         */
        public static <T> T getBean(Class<T> clazz) {
            return applicationContext.getBean(clazz);
        }
    
        /**
         * 通过name,以及Clazz返回指定的Bean
         *
         * @param name
         * @param clazz
         * @return
         */
        public static <T> T getBean(String name, Class<T> clazz) {
            return applicationContext.getBean(name, clazz);
        }
    
        /**
         * 获取实现相关接口的类关系
         *
         * @param clazz
         * @return
         */
        public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {
            return applicationContext.getBeansOfType(clazz);
        }
    
        /**
         * 发布事件
         *
         * @param event
         */
        public static void publishEvent(ApplicationEvent event) {
            applicationContext.publishEvent(event);
        }
    
        /**
         * 获取环境信息
         */
        public static Environment getEnvironment() {
            return applicationContext.getEnvironment();
        }
        
    }
    
    展开全文
  • MyBatis面试题(2020最新版)

    万次阅读 多人点赞 2019-09-24 16:40:33
    缓存 Mybatis的一级、二级缓存 Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝...
  • Java 程序员开发常用工具

    万次阅读 多人点赞 2018-02-03 14:18:29
    4、一些其他常用工具 5、总结 1、常用开发工具 作为一名Java程序开发人员,可以的选择集成开发环境IDE(Integrated Development Environment)非常多,得益于Java是一门开源语言。有开源免费的;有商用收费的。...
  • 1:现象,红线划掉部分已消失 2:解决办法: 点击View菜单栏下Reset UI to Cadence Default命令选项 即可
  • 1、常用开发工具作为一名Java程序开发人员,可以的选择集成开发环境IDE(Integrated Development Environment)非常多,得益于Java是一门开源语言。有开源免费的;有商用收费的。如何选择一款适...
  • 经济管理学中常用的模型分析法

    万次阅读 2018-03-28 09:24:04
    经济管理学中常用的模型分析法常用的分析模型有:波特五力模型、波士顿矩阵、鱼骨分析法、5W1H分析法、麦肯锡7S模型、杜邦分析法、营销漏斗模型、可行性分析、绩效分析;SMART原则、SWOT分析、PEST分析法、GROW模型...
  • 小甲鱼零基础入门学习python笔记

    万次阅读 多人点赞 2019-08-14 11:06:30
    小甲鱼老师零基础入门学习Python全套资料百度云(包括小甲鱼零基础入门学习Python全套视频+全套源码+全套PPT课件+全套课后题及Python常用工具包链接、电子书籍等)请往我的资源... 000 愉快的开始 ...
  • BAT 程序员们常用的开发工具(建议收藏)

    千次阅读 多人点赞 2019-07-15 21:48:40
    作者:小智,赵钰莹,张晓楠 链接:...工欲善其事必先利其器,一个优秀的程序员除了代码写得好,善于利用各种开发工具同样可以事半功倍。以 BAT 为代表的各大厂程序员们在平时的工作中都用什么开发工...
  • 程序员常用资源工具集合(建议收藏)

    万次阅读 多人点赞 2019-08-10 11:00:00
    点击上方“民工哥技术之路”选择“置顶或星标”每天10点为你分享不一样的干货搜索资源网站学习技术过程我们经常需要使用搜索引擎来检索资料,国内常用的也就是某度了。当然有条件的...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    列举浏览器对象模型BOM里常用的至少4个对象,并列举window对象的常用方法至少5个 72 简述列举文档对象模型DOM里document的常用的查找访问节点的方法并做简单说明 72 希望获取到页面中所有的checkbox怎么做?(不...
  • 常见版本管理工具

    万次阅读 2017-09-19 22:22:05
    VSS最初的名字叫Source Safe,是一家小公司的产品,92年曾经获了最佳小型管理工具奖,然后立即被微软收购。但是微软收购的只是source safe的Windows版本,在美国还有另外两家公司分别获得了继续开发和销售source ...
  • 【无线安全实践入门】基础攻击手段与常用工具简介 1.网络扫描 2.破解wifi密码 3.针对漏洞的攻击手段 4.泛洪攻击 5.DoS攻击 6.Cookie窃取 7.Session劫持 8.1.SSH攻击 8.2.DNS劫持/污染 等
  • 小疯手把手带你整合SpringMVC+Spring+MyBatis三大框架,俗称SSM,用它完全代替传统的SSH框架,把它们最优雅的一面发挥出来。整合配置结束后,会有一个应用实例“图书管理系统”带给大家,希望能快速上手这个框架!
  • 计算机二级考试之Office2010

    万次阅读 多人点赞 2019-09-10 08:28:00
    (最好把杀毒软件也先退掉,以后再打开) 办法/步骤: 1、大家先点击常用的运行对话框,使用win+R快捷键能快速点击。 2、然后大家在点击框中写入点击策略策的命令“gpedit.msc”并且打开确认。 3、这时候本地策略组...
  • 软件测试面试题汇总

    万次阅读 多人点赞 2018-09-27 12:31:09
    缺陷管理工具对软件缺陷(BUG )跟踪的管理的流程? .......................................... 5 6 、你觉得bugzilla 在使用的过程中,有什么问题? ..........................................................
  • Linux中的常用内存问题检测工具

    万次阅读 多人点赞 2015-06-27 12:53:08
    如果crash的地方内存明显不是consistent的,或者内存管理信息都已被破坏,并且还是随机出现的,那就比较麻烦了。当然,祼看code打log是一个办法,但其效率不是太高,尤其是在运行成本高或重现概率低的情况下。另外,...
  • 最详细的虚拟机linux安装教程

    千次阅读 多人点赞 2018-10-30 21:01:23
    介绍 Linux的安装、常用命令、远程访问等入门级知识。学完本课程,具备初级软件工程师对Linux知识的要求。 Linux 学习过程: 首先在 Windows下安装虚拟机管理软件VMWare Workstation Pro 14 或者VirtualBox 5。 ...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    可用访问权限控制字,常用的访问权限控制字如下:private(私有),public(公有)。在数据成员或函数成员前增加访问权限控制字,可以指定该数据成员或函数成员的访问权限。 私有数据成员只能被类内部的函数使用和修改,...
  • 阿里程序员常用的 15 个高效工具,大部分已开源! 阿里将自身在各类业务场景下的技术积淀,通过开源、云上实现或工具等形式对外开放,本文将精选了一些阿里巴巴的开发者工具,希望能帮助开发者们提高开发...
  • win10电脑忘记开机密码的解锁方法

    万次阅读 多人点赞 2020-03-02 01:12:33
    叮嘟!...写篇博客分享一下踩雷经验。 第一种方式 准备工具:  1、win10硬盘加密的请绕道,此方式不适用,谢谢。...2、下载并制作一个快... 1、到快启动下载一个快启动启动盘制作工具U盘启动盘制作工具,如下图所示...
  • Git 版本管理工具(一)

    万次阅读 多人点赞 2012-05-02 14:08:11
    Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git —— The stupid content tracker...Git 与常用的版本控制工具 CVS、Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软
  • :解决问题的根本办法就是不发生问题。把mxd文档与相关图层文件存储在同一路径下,在文件-地图文档属性-下方的“存储数据源的相对路径名”,点上对号即可。 Emmmmm不能一篇都写完,分批写吧
  • 接口规范说起来大,其实也就那么几个部分,接口规范、接口管理工具、接口文档编写、开发文档编写。 接口规范定义 一、协议规范 为了确保不同系统/模块间的数据交互,需要事先约定好通讯协议,如:TCP、HTTP、...
  • 《图书管理系统》毕业论文

    万次阅读 多人点赞 2008-11-24 11:13:00
    图书管理系统毕业论文图书馆管理系统目录 0 前言 1系统设计1.1系统目标设计 1.2开发设计思想 1.3开发和运行环境选择 1.4系统功能分析 1.5系统功能模块设计 2数据库设计2.1数据库需求分析2.2数据库逻辑结构...
  • 史上最全面Java面试汇总(面试题+答案)

    万次阅读 多人点赞 2018-07-06 14:09:25
    此类不能实例化,就像一个工具类,服务于Java的Collection框架。 19.Concurrenthashmap实现原理 具体原理参考文章: ...
  • 2 管理质量 — 管理质量是把组织的质量政策用于项目,并将质量管理计划转化为可执行的质量 活动的过程。 3 控制质量 — 为了评估绩效,确保项目输出完整、正确,并满足客户期望,而监督和记录质量管 理活动执行结果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,007
精华内容 46,002
关键字:

常用工具管理办法