精华内容
下载资源
问答
  • 学员们大家好,众多新学员报考完...答案是有的,根本就无需死硬背!算下来这些年来我已经教过至少上万的学员,大约年年带一千多个,多数我教过的学员,记忆了这些科一理论考试技巧,每个考驾照的通过率都在95%以...

    学员们大家好,众多新学员报考完驾照时都会问驾考科目一怎么考,今天借此机会就来分享下驾考科目一怎么考吧,那小伙伴可以好好看看驾考科目一怎么考讲解!

    899a19b7e3495776d8604bad2957e420.png

    作为一名有着七年经验的驾校教练,我来回答你这个问题!驾照科目一考试有技巧?需要死记硬背?答案是有的,根本就无需死记硬背!算下来这些年来我已经教过至少上万的学员,大约年年带一千多个,多数我教过的学员,记忆了这些科一理论考试技巧,每个考驾照的通过率都在95%以上,根本不必考第二轮!

    b756f894e9cf42e3c7ab52294c26bf5e.png

    考科目一理论题库共有1325道题目组成,题型很多都是判断题、选择题,满分100分,90分合格,那么接下来我自个给朋友演示一下科目一技巧,伙伴认真学习一下!

    47edb5183f5d3306665bb8a6d8a72ae4.png

    1、男子过马路,身后有牌X,没牌√

    b9e553b4ae4ad0c8865d3f4b4cd48663.png
    ca6c56517f062d07c8e4e056082596ab.png

    2、发现“可以不”,打 x

    fdafa5a249eacc19445a0a0e7506890c.png
    1b3f5f556f95b29933fbcf15bf8e94ce.png
    71c9f4fa3633774a1fa730158da0425e.png
    5bccca2b1dc241f560b041f1ab369d55.png

    3、题尾发现“刑”的都是错的!

    471fbb1909761f937a924cef1ac72db5.png
    51e65dc69317ec1f6cd2a12f4cbf1bc5.png

    这样的科一考试技巧,还有很多很多。由于篇幅关系无法一一展示出来。驾考科目四考试技巧也有!全部的科一、科四的考试技巧,所有的科一技巧都在公众号快答题库,很有兴趣的话去看看吧!

    5860f42a5ca6dc38ec281ec242584a5f.png

    还是有一些技巧给大家分享下一下!

    1、记得要早点到考场不要迟到了!要记得出门装好自己的身份证,准考证这些资料,千万别到考场了才发现忘记带上了!

    2、考试期间:答题的时候,千万不要着急,考试时间总共45分钟,45分钟是足够的。所以你要细心的做题,别点错了答案不值得了,也别左右不分,图片上是显示向左的,可你选了向右的。

    3、完成考试后!当天是有2次考试机会,如果第一次考挂了,记得举手示意,听从监考官的安排。

    7d4136fe39ea91a4b1792f2220e6ecc8.png

    最重要的事,注意考试可别迟到!带好身份证,顺便记得带瓶水。最后要记得走之前点个赞!这些就是我的经验,各位看官感觉有作用,请动一下小手点个赞!最重要的是,祝大家考试顺顺利利,尽早拿到驾驶证!

    展开全文
  • 前端面试总结2020前端面试01基础部分 2020前端面试01 总结最近几天的面试问题,算2020新?...怎么判断数据的类型? 追加问题: 1、typeof 和 instanceof的区别是什么? 2、怎么判断是Array还是Object?

    2020前端最新面试题01

    总结最近几天的面试问题,算2020新题?不过,总的来讲又好像也算不上,个人感觉面试技术点基本都是一样,属于大同小异

    基础部分

    js部分,所遇到的面试题,基本是以计算和理论概念为主,计算题就省略了。不难,关键是记不住那么多。题如下:

    1. js的基本数据类型有哪些?复杂型有哪些?
    2. 怎么判断数据的类型?

    追加问题:
    1、typeof 和 instanceof的区别是什么?
    2、怎么判断是Array还是Object?

    1. CSS浮动怎么理解的?

    设置了浮动属性的元素会脱离普通标准流的控制,移动到其父元素中指定的位置的过程,将块级元素放在一行,浮动会脱离标准流,不占位置,会影响标准流,浮动只有左右浮动,不会出现上下浮动。

    4.CSS如何实现盒子水平垂直居中?

    一、没有固定宽高
    方案1、Transforms 变形 这是最简单的方法,不仅能实现绝对居中同样的效果,也支持联合可变高度方式使用

    	position: absolute;
    	top: 50%;
    	left: 50%;
    	transform: translate(-50%, -50%);
    

    方案二2、在父级元素上面加上下面3句话(弹性盒子),就可以实现子元素水平垂直居中

    	display:flex;/*弹性盒模型*/
    	justify-content: center; /*子元素水平居中*/
    	align-items: center; /*子元素垂直居中*/
    

    方案3、margin:auto实现绝对定位元素的居中(该方法兼容ie8以上浏览器)

    	position: absolute;
    	left:0;
    	right:0;
    	top: 0;
    	bottom: 0;
    	margin: auto;
    

    二、有固定宽高(上面的方案三也兼容)
    方案1、margin 负间距
    关键点:1.必需知道该div的宽度和高度,2.然后设置位置为绝对位置,3.距离页面窗口左边框和上边框的距离设置为50%,这个50%就是指页面窗口的宽度和高度的50%,4.最后将该div分别左移和上移,左移和上移的大小就是该DIV宽度和高度的一半。

       	width: 400px;
       	height: 18px;
       	position: absolute;
       	top:50%;
       	left:50%;
       	margin-top: -9px;
       	margin-left: -200px;
    
    1. Href 和 src的区别?

    src用于替换当前元素,href用于在当前文档和引用资源之间确立联系。
    src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内
    href是Hypertext Reference的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接

    6.Px,Rem,Em,% 的区别:

    1. px是固定长度单位,不随其它元素的变化而变化;
    2. em和%是相对于父级元素的单位,会随父级元素的属性(font-size或其它属性)变化而变化;
    3. rem是相对于根目录(HTML元素)的,所有它会随HTML元素的属性(font-size)变化而变化;
    4. px和%用的比较广泛一些,可以充当更多属性的单位,而em和rem是字体大小的单位,用于充当font-size属性的单位
    5. 一般来说:1em = 1rem = 16 px

    7.移动端怎么做适配?

    • 1.meta viewport
    	width=device-width:让当前viewport宽度等于设备的宽度
    	user-scalable=no:禁止用户缩放
    	initial-scale=1.0: 设置页面的初始缩放值为不缩放
    	maximum-scale=1.0: 允许用户的最大缩放值为1.0
    	minimum-scale=1.0: 允许用户的最小缩放值为1.0
    
    • 2.媒体查询(media)

    一个媒体查询由一个可选的媒体类型和零个或多个使用媒体功能的限制了样式表范围的表达式组成,例如宽度、高度和颜色。媒体查询,添加自CSS3,允许内容的呈现针对一个特定范围的输出设备而进行裁剪,而不必改变内容本身

    • 3.rem布局

    rem是根据网页的根元素来设置字体大小,和em的区别是,em是根据父元素的字体大小来设置,而rem则是根据网页的根元素的来设置的

    html {
          font-size: 16px; /*现在大部分浏览器,如果不更改字体配置,默认显示的font-size都是16px。*/
    	}
    /*给一个p标签设置12px的字体就可以这样设置*/
    p {
         font-size: 0.75rem;
       }
    

    8.说下遇到的各种兼容性的处理方法?
    参考网址:兼容处理
    9.
    10.Html盒模型的不同?

    W3C盒模型是与IE盒模型的区别就是对宽高的定义不同。
    W3C认为:宽高是内容区的宽度(只包含节点显示的具体内容)
    IE认为:宽高是显示效果的实际效果(包含节点的全部内容)

    11.透明度opacity和rgba的区别?

    rgba()和opacity都能实现透明效果,但最大的不同是opacity作用于元素,以及元素内的所有内容的透明度,而rgba()只作用于元素的颜色或其背景色

    12.页面性能优化 && 网站如何优化?

    • 常见方式
      1、资源压缩合并,减少http请求;
      2、非核心代码异步加载 --> 异步加载的方式 --> 异步加载的区别;
      3、利用浏览器缓存 --> 缓存的分类 --> 缓存的原理 缓存是所有性能优化的方式中最重要的一步【重要】;
      ps: 有的人可能会回答local storage 和session storage,其实不是这个。浏览器缓存和存储不是一回事。-
      4、使用CDN 浏览器第一次打开页面时,缓存是起不了作用的。这个时候,CDN就上场了;
      5、DNS预解析
    • 1.html
    1. 脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)
    2. 从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)
    3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)
    4. 移除重复脚本 (Remove Duplicate Scripts)
    • 2.css
      1、把 CSS 放到代码页上端 (Put Stylesheets at the Top)
      2、从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)
      3、精简 JavaScript 与 CSS (Minify JavaScript and CSS)
      4、避免 CSS 表达式 (Avoid CSS Expressions)
    • 3.javaScript
      非核心代码异步加载,异步加载的方式
      动态脚本加载document.createElement('script')
      defer:<script src="./defer1.js" defer></script>
      async :<script src="./async1.js" async></script>
    • 4.image
      合并图片(css sprites)、CSS和JS文件合并、CSS和JS文件压缩;
      图片较多的页面也可以使用 lazyLoad 等技术进行优化;
      精灵图

    13.Js闭包是如何理解的

    • 1、闭包是什么?
      理解一: 闭包是嵌套的内部函数;
      理解二: 包含被引用变量(函数)的对象;即函数中有 Closure 对象(在chrome可以查看).
    • 2、产生闭包的两个条件?
      * 1.函数嵌套;
      * 2.内部函数引用了外部函数的数据(变量/函数) ===>> 内部函数执行函数定义就会产生闭包(不用调用内部函数).

    14.请描述一下cookies,sessionStorage和localStorage的区别?

    特性 cookies localStorage sessionStorage
    特性 一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效 除非被清除,否则永久保存 仅在当前会话下有效,关闭页面或浏览器后被清除
    存放数据大小 4K 一般5M 一般5M
    与服务器端通信 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 仅在客户端(即浏览器)中保存,不参与和服务器的通信 仅在客户端(即浏览器)中保存,不参与和服务器的通信
    易用性 需要程序员自己封装,源生的Cookie接口不友好 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持

    15.一次完整的HTTP事务是怎样的一个过程?

    网络答案:域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户;

      	1.在浏览器中输入url(解析IP地址);
    	2.应用层DNS解析域名;
    	3.应用层客户端发送HTTP请求;
    	4.传输层TCP传输报文(3次握手)5.网络层IP协议查询MAC地址;
    	6.数据到达数据链路层;
    	7.服务器接收数据;
    	8.服务器响应请求;
    	9.服务器返回相应文件。
    

    16.从URshiL发送请求到页面渲染发生了什么?

    • 1.url解析,即协议、服务器、域名、端口、虚拟文件目录、参数。
    • 2.DNS解析,即域名解析,

    DNS阶段发生的事:
    * 1.查看浏览器缓存,如果没有;
    * 2.检测系统缓存,如果没有;
    * 3.查看路由缓存,如果没有;
    * 4.查看本地服务器缓存,如果没有;
    - 5.递归查询(迭代查询):从根域名服务器 -> 顶级域名服务器 -> 极限域名服务器,依次对目标查询。

    • 3.建立浏览器与服务器端的连接:通过TCP/IP协议三次握手机制建立连接。
    • 4.接收数据
    • 5.渲染DOM树(下载接收的数据)

    加载中过程:
    * 1.解析HTML文档,生成DOM
    * 2.解析CSS文档,生成CSSDOM
    * 3.将JS代码交给JS引擎执行
    * 4.合并DOM和CSSDOM,生成Render Tree
    * 5.根据Rende Tree进行渲染

    DOM树的加载步骤:

    	1. 解析HTML文档
    	2. 引入样式和脚本文件
    	3. 解析并执行脚本
    	4. DOM树构建完成
    	5. 加载图片等资源文件
    	6. 页面加载完成
    

    17.什么是TCP/IP协议,什么是HTTP协议?

    网络协议是对网上进行数据交互而建立的一种规则、标准、约定的集合。
    TCP/IP 是协议集合,即是一个网络通信模型,以及一整个网络传输协议家族。其中==TCP(传输控制协议)==是通过三次握手机制实现TCP客户端和服务器端的数据交互的,IP协议是网络传输的地址,有两个基本功能 寻址和分段,主要是为计算机分配IP地址和确定那些地址是在同一个子网络的下面。
    核心要点:TCP协议是安全的把数据传输给对方,IP协议是找到对方的详细地址。
    HTTP协议(超文本传输协议) 是网络应用最广泛的一种协议,是WWW都要遵循的标准。是在TCP协议之上建立的应用,客户端发送一次请求,服务器端就要响应一次的"一次连接"。

    18.怎么实现节点的添加、复制、删除、移动、创建和查找?

    • 1、首先创建DOM片段 document.createDocumentFragment();添加DOM节点时,也可以使用document.body.append();进行添加,但是,这种方法每使用一次就会刷新一次页面,会造成效率低下。
    • 2、创建节点 document.createElement(‘名称’)//具体节点,document.createTextNode(‘内容’)//创建文本节点;
    • 3、添加节点document.appendChild()
    • 4、删除节点 document.removeChild()
    • 5、移动节点
        var newLi =document.getElementById('Document1').lastChild;
       document.getElementById('Document2').appendChild(newLi); 
    
    • 6、插入节点 document.inserBefore()
    • 7、替换节点 document.replaceChild(newnode,oldnode)
    • 8、查找节点
       getElementsByTagName() //通过标签名称;
       getElementsByClassName() //通过元素的class属性名称;
       getElementById() //通过元素 Id,唯一性;
    
    • 9、复制节点
       var newLi =document.getElementById('Document1').Child(('名称'));
       document.getElementById('Document1').appendChild(newLi);
    

    19.模块开发要遵循的规范?

    1. AMD规范也叫异步模块加载规范,在这个规范下模块会异步加载,不影响后面语句的执行,可以使用define定义模块,使用require调用模块。
    2. CommonJS规范是服务器端模块的规范,node.js就采用了这个规范,每个模块都有一个单独的作用域,模块内部的变量无法被其他模块读取,除非定义为global的对象和属性。
    3. CMD规范通用模块定义.CMD是按需加载,一个模块就是一个文件。

    20.什么是BFC?怎么触发BFC?

    1. 什么是BFC?
      BFC它是一个独立的渲染区域,只有Block-level box(块元素)参与,它规定了内部的Block-level box如何布局,并且与这个区域外部毫不相关。
    2. BFC的原理是什么?
      1)内部的Box会在垂直方向,一个接一个地放置;
      2)Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠;
      3)每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此;
      4)BFC的区域不会与float box重叠;
      5)BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之也如此;
      6)计算BFC的高度时,浮动元素也参与计算。
    3. 如何创建BFC?
      1)根元素; 
      2)float属性不为none; 
      3)position不为static和relative; 
      4)overflow不为visible; 
      5)display为inline-block, table-cell, table-caption, flex, inline-flex。
    4. BFC作用?
      1)防止外边距重叠。
      bfc导致的属于同一个bfc中的子元素的margin重叠(Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠);
      我们可以在div外面包裹一层容器,并触发该容器生成一个BFC。那么两个div便不属于同一个BFC,就不会发生margin重叠了。
      2)清除浮动的影响(块级子元素浮动,如果块级父元素没有设置高度,其会有高度塌陷的情况发生。);
      原因:子元素浮动后,均开启了BFC,父元素不会被子元素撑开;
      解决方法:由第六条原理得,计算BFC的高度时,浮动元素也参与计算。所以只要将父容器设置为bfc,就可以把子元素包含进去:这个容器将包含浮动的子元素,它的高度将扩展到可以包含它的子元素,在这个BFC,这些元素将会回到页面的常规文档流;
      3)防止文字环绕。
    展开全文
  • 一、判断题 1.软件测试的目的是尽可能多的找出软件的缺陷。(Y) 2.Beta 测试是验收测试的一种。(Y) 3.验收测试是由最终用户来实施的。(N) 4.项目立项前测试人员不需要提交任何工件。(Y) 5.单元...
  • 问了注解用代码是如何写的(我这不清楚啊),然后就是问注解是如何自己解析的,我说可以通过Class对象,获取到注解信息,从而判断。 基础方面 1、问了Redis的线程模型,单线程模式,怎么实现的,说了IO多路复用,...

    java面试题及答案2020

    三面-2020/3/30-牛客网

    文末持续更新面试题及答案
    项目方面

    问了自己实现的SpringIOC的整个流程,直接细节到了代码,说了一遍没听清楚,然后又说了一遍。问了LRU缓存的设计,后面就是直接口述LRU缓存的实现(代码)。问了注解用代码是如何写的(我这记不清楚啊),然后就是问注解是如何自己解析的,我说可以通过Class对象,获取到注解信息,从而判断。

    基础方面

    1、问了Redis的线程模型,单线程模式,怎么实现的,说了IO多路复用,然后就是epoll,然后介绍了IO多路复用模型的其他实现,对比。

    2、然后就是问我Redis的epoll实现,我这个好像有点懵。

    3、线程的状态(NEW,RUNNABLE,BLOCKED,TIME_WAITING,WAITING)少了一种,然后就是BLOCKED 和 WAIT的区别

    4、锁,我讲了synchronize,reentrantlock和锁升级的过程,从无锁状态到偏向锁到轻量级锁到重量级锁(markword,和cas操作替换线程id,然后问我cas是什么,我说比较和替换,Compare and swap,然后我说底层是通过硬件的cmpxchg命令保证的)。然后就是我们的ReentrantLock,将了AQS的底层(双向链表,Node节点(Share,Exclusive,waitStatus),state变量(对不同的实现,所代表的含义不同),然后就是acquire方法和release方法的流程。reentrantlock的公平和非公平(没说),好像是被打断了)

    5、LRU算法的实现

    6、类加载,class.forname 和 classloader的区别,双亲委派原则。被问到不使用双亲委派原则,如何自定义java.lang.Integer会怎么样(我自定义过 java.lang.Integer,使用直接抛出异常,说包违法)。可能还是不够深入。

    7、就是问了自己的缺点和优点,和奖项的项目和做了什么

    所有面试题持续更新+答案整理见这里:
    java面试题及答案2020

    展开全文
  • 1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分) int a = 4; (A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++); a = ? 答:C错误,左侧不是一个有效变量,不能赋值,可...
  • 面试过程中关于Integer的比较“==”的问题内容层出不穷,但无论怎么变化,只要了解了其中的底层原理,马上就可以得出答案,再也不用死硬背考题了。 《阿里巴巴Java开发手册》中有这样一项强制要求: “所有整形...

    《Java面试题系列》:对面试题中经典内容进行深入挖掘,分析源码、汇总原理,形成公众号系列文章,面试与否均可提升技能。欢迎大家持续关注【程序新视界】。本篇为系列第3篇。

    面试过程中关于Integer的比较“==”的问题内容层出不穷,但无论怎么变化,只要了解了其中的底层原理,马上就可以得出答案,再也不用死记硬背考题了。

    《阿里巴巴Java开发手册》中有这样一项强制要求:

    “所有整形包装类对象之间值的比较,全部使用equals方法比较。说明:对于Integer var= ?在-128到127范围内的赋值,Integer对象在IntegerCache.cache产生,会复用已有对象,这个区间的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。”

    其实,如果将上面一段话背下来,那么你基本上已经可以答对百分之五十(跟猜的概率差不多)的面试题了。但如果想了解深层原理和剩下的百分之五十的问题,就咱们就继续往下看。

    面试题

    先来看一道常见的面试题,对照上面的结论,看看能够答对几项。下面代码中打印结果为true的有几项?

    @Test
    public void test2() {
    	Integer i1 = 64;
    	int i2 = 64;
    
    	Integer i3 = Integer.valueOf(64);
    	Integer i4 = new Integer(64);
    
    	Integer i5 = 256;
    	Integer i6 = Integer.valueOf(256);
    
    	System.out.println("A:" + (i1 == i2));
    	System.out.println("B:" + (i1 == i3));
    	System.out.println("C:" + (i3 == i4));
    	System.out.println("D:" + (i2 == i4));
    	System.out.println("E:" + (i3.equals(i4)));
    	System.out.println("F:" + (i5 == i6));
    }
    

    执行上面的程序,打印结果为:

    A:true
    B:true
    C:false
    D:true
    E:true
    F:false
    

    只有C和F项打印为false。你是否疑惑为什么i1等于i2,i1等于i3,i2等于i4,都为true,那么根据等号的传递性,i3应该等于i4啊?

    为什么i1和i3相等,但i5和i6却不相等呢?

    先保留疑问。下面,我们从int及Integer在JVM中的存储结构来进行分析。掌握了底层存储结构,你会发现无论题面如何变化,都万变不离其宗。

    变量在JVM中的存储

    在彻底弄清楚上问题之前,我们先来了解一下基础类型变量、引用类型变量在JVM中的存储。

    通常变量分为局部变量和全局(成员)变量。局部变量是声明在方法内的变量;全局变量是声明在类中的成员变量。

    基础类型的变量和值在分配的时候是在一起的,都在方法区或栈内存或堆内存。而引用类型的变量和值不一定在一起。

    局部变量存储在方法栈中

    当方法被调用时,Java虚拟机都同步创建一个栈帧,局部变量便存储在其中。当方法结束虚拟机会释放方法栈,其中声明的变量随着栈帧的销毁而结束。因此,局部变量只能在方法中有效。

    此过程中,基础类型和引用类型的存储有所区别:

    (1)基本类型:变量和对应的值存放在JAVA虚拟机的栈中;

    (2)引用类型:变量存储在栈中,是一个内存地址,该地址值指向堆中的对象。

    image

    栈属于线程私有的空间,局部变量的生命周期和作用域一般都很短,为了提高gc效率,所以没必要放在堆里面。

    全局变量存储在堆中

    全局变量存放在堆中,不会随着方法结束而销毁。同样在类中声明的变量也是分为基本类型和引用类型。

    (1)基本类型:变量名和值存放在堆内存中。

    (2)引用类型:变量是一个引用地址,该地址指向所引用的对象。此时,变量和对象都在堆中。

    举个简单的例子,如下代码:

    public class Person {
    	int age = 10;
    	String name = "Tom";
    }
    

    对应的age和name的存储结构如下图:
    image

    结合上面的理论,我们通过一段代码来分析一下各种类型所存储的位置。

    public class DemoTest {
    
     int y; // 变量和值均在堆上
     
     public static void main(String[] args) {
    
         int x = 1; // 变量和值分配在栈上
         
         String name = new String("cat"); // 数据在堆上,name变量的指针在栈上
         
         String address = "北京"; // 数据在常量池,属于堆空间,指针在栈上
         
         Integer price = 4; // 包装类型为引用类型,编译时会自动装拆箱,数据在堆上,指针在栈
     }
    }
    

    基础类型的栈内存储

    通过上面的实例,基本了解了不同类型的值的内存分配情况。下面我们重点讨论局部变量。

    下面先来看看在同一栈帧中,针对int类型的处理模式。

    int a = 3;
    int b = 3;
    

    上述代码中a和b均为局部变量。假设编译器先处理int a=3,此时会在栈中创建a的引用变量,然后查找栈中是否存在3这个值,如果没有就将3存放进来,然后将a指向3。

    接着处理int b=3,创建完b的引用变量后,同样进行查找。因为在栈中已经有3这个值,便将b直接指向3。

    此时,a与b同时指向3这个值,自然是相等的。

    关于基础类型与引用类型的底层比较,可稍微延伸一下:对于“==”操作符号,JVM会根据其两边相互比较的操作数的类型,在编译时生成不同的指令:

    (1)对于boolean,byte、short、int、long这种整形操作数会生成if_icmpne指令。该指令用于比较整形数值是否相等。

    (2)如果操作数是对象的话,编译器则会生成if_acmpne指令,与if_icmpne相比将i(int)改成了a(object reference)。

    回归正题

    学习了上面的底层理论知识,我们基本上可以得出如下结论:(1)两个int类型比较,直接使用双等号即可;(2)int的包装类Integer对象比较时,使用equals进行比较即可。

    但上面的结果只能说E项目是正确的。其比较项还涉及到整形的装箱拆箱操作、Integer的缓存。我们下面逐一分析。

    不同创建形式的比较

    先看Integer的初始化,根据Integer的内部实现,创建Integer有三种,分别是:

    Integer a = new Integer(1); //创建新的类
    
    Integer b = Integer.valueOf(2);  
    
    Integer c = 3; //自动包装,会调用valueOf方法
    

    其中直接赋值底层会调用valueOf方法进行操作的,因此这两种操作效果是一样的。

    因为通过new和valueOf创建的是完全两个对象,那么针对题目中的C项,直接比较两个对象的引用肯定是不相等的,因此结果为false。但B项为什么为true呢?后面我们会讲到。

    比较中的拆箱

    在题目中,我们发现A、D都为true,而且它们的比较格式都是基础类型与包装类型的对比。

    针对这种形式的对比,包装类型会进行自动拆箱,变成基础类型(int)。很显然,结果是相等的。

    Integer的缓存

    为什么i1和i3相等,但i5和i6却不相等呢?对应题目中的B和G项。这里就涉及到Integer的缓存机制。

    我们上面已经知道,Integer直接赋值和valueOf是等效的,那先看一下valueOf及相关的方法。

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    
    private static class IntegerCache {
            static final int low = -128;
            static final int high;
            static final Integer cache[];
    
            static {
                // high value may be configured by property
                int h = 127;
                String integerCacheHighPropValue =
                    sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
                if (integerCacheHighPropValue != null) {
                    try {
                        int i = parseInt(integerCacheHighPropValue);
                        i = Math.max(i, 127);
                        // Maximum array size is Integer.MAX_VALUE
                        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                    } catch( NumberFormatException nfe) {
                        // If the property cannot be parsed into an int, ignore it.
                    }
                }
                high = h;
    
                cache = new Integer[(high - low) + 1];
                int j = low;
                for(int k = 0; k < cache.length; k++)
                    cache[k] = new Integer(j++);
    
                // range [-128, 127] must be interned (JLS7 5.1.7)
                assert IntegerCache.high >= 127;
            }
    
            private IntegerCache() {}
        }
    

    valueOf方法判断数字是否大于low(-128)并且小于high(127),如果满足条件,则直接从IntegerCache中返回对应数字。

    IntegerCache用于存储一些常用的数,防止重复创建,在Integer类装入内存时通过静态代码进行初始化。

    所以只要是用valueOf或者Integer直接赋值的方式创建的对象,其值小于127且大于-128的,无论对其进行==比较还是equals 比较,都是true。

    上面的源码及原理也解释了阿里Java开发手册中所说明的原因。

    为什么equals可以规避问题

    对于不满足-128到127范围的数,无论通过什么方式创建,都会创建一个新的对象,只能通过equals进行比较。接下来我们再看看equals方法。

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
    

    equals实现比较简单,先比较类型是否一致,如果不一致,直接返回false;否则,再比较两者的值,相同则返回true。

    小结

    关于Integer的比较核心点有以下三点:引用对象的存储结构、Integer的缓存机制、自动装箱与拆箱。

    Integer在==运算时,总结一下:

    (1)如果==两端有一个是基础类型(int),则会发生自动拆箱操作,这时比较的是值。

    (2)如果==两端都是包装类型(Integer),则不会自动拆箱,首先会面临缓存问题,即便在缓存范围内的数据还会再次面临创建方式的问题,因此强烈建议使用equals方法进行比较。

    如果觉得文章写的还不错,就关注一下。下篇文章,我们来讲讲equals和hashcode方法的重写底层逻辑。

    原文链接:《面试题系列第3篇:Integer等号判断的内幕,你可能不知道?


    程序新视界

    公众号“程序新视界”,一个让你软实力、硬技术同步提升的平台,提供海量资料

    微信公众号:程序新视界

    展开全文
  • 面试过程中关于Integer的比较“==”的问题内容层出不穷,但无论怎么变化,只要了解了其中的底层原理,马上就可以得出答案,再也不用死硬背考题了。《阿里巴巴Java开发手册》中有这样一项强制要求:“所有整形包装...
  • 二、 判断题 1. 软件就是程序,编写软件就是编写程序。(×) 2. 瀑布模型的最大优点是将软件开发的各个阶段划分得十分清晰。(×) 3. 结构化方法的工作模型是使用螺旋模型进行开发。(×) 4. 结构化方法和JSP方法...
  • 面试过程中关于Integer的比较“==”的问题内容层出不穷,但无论怎么变化,只要了解了其中的底层原理,马上就可以得出答案,再也不用死硬背考题了。 《阿里巴巴Java开发手册》中有这样一项强制要求: “所有整形...
  • 全两册剑指offer新增大量python书104.6元包邮(需用券)去购买 &...面试过程中关于Integer的比较“==”的问题内容层出不穷,但无论怎么变化,只要了解了其中的底层原理,马上就可以得出答案,再也不用死硬背考题了。...
  • 对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。那...
  • 面试过程中关于Integer的比较“==”的问题内容层出不穷,但无论怎么变化,只要了解了其中的底层原理,马上就可以得出答案,再也不用死硬背考题了。《阿里巴巴Java开发手册》中有这样一项强制要求:“所有整形包装...
  • 面试过程中关于Integer的比较“==”的问题内容层出不穷,但无论怎么变化,只要了解了其中的底层原理,马上就可以得出答案,再也不用死硬背考题了。 《阿里巴巴Java开发手册》中有这样一项强制要求: “所有整形...
  • 欢快地安排了大半个晚上来做这次线上期末考,最后...一、判断题5道 1-1 对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。 1-2 对一棵平衡二叉树,所有非叶结点的平衡因子都..
  • 对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。那...
  • 二分答案后,要判断它是否为第m大,只需判断比它大的数超不超过m个,不超过还可更小,r=mid-1. 超过则相反。 判断方法:利用尺取法(假如统计区间中满足某种条件的数要超过k,则统计时r(右边界)随l(左边界)递增) ...
  • asp.net面试

    2011-05-27 17:56:26
    选择题答案: 1.B,2.D,3.C,4.BC,5.B,6.AC,7.C,8.A,9.D,10.D,11.B,12.AC,13.D,14.B 填空题答案: 1.(k & 1) == 0 或 k % 2 == 0 2.1,2,4,8(答案不定,看情况) 3.internal 4.select * from table order...
  • Find All Anagrams in a String时,我使用的思路就是滑动窗口,也就是和这道的解法是一样的,但是我一提交就会出现答案错误,我找了半天的错误,甚至还再评论区找到了类似的写法,但还是没有找到错误。...
  • 15. 三数之和 题目 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?...这一看我以为是两数之和的翻版,不过hash我怎么也用不上.难受 暴力解法就是三
  • 那么怎么用函数柯里化优化这个封装函数。 <pre><code>javascript var addEvent = (function() { if(window.addEventListener) { return function(el, type, fn, capture) { el.addEventListener(type, ...
  • 【面试题库网整理 .net 面试(附答案)(四)】 7. 某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则: (1) 密码单词的最小长度是两个字母,可以相同,也可以不同 ...
  • 软件测试经典面试 (超实用)

    热门讨论 2012-02-16 13:48:08
    48、在配置测试中,如何判断发现的缺陷是普通问题还是特定的配置问题? 15 49、为什么尽量不要让时间有富裕的员工去做一些测试? 16 50、完全测试程序是可能的吗? 16 51、软件测试的风险主要体现在哪里? 16 52、...
  • 你是怎么判断他们处于那一层的? 当时我瞬间心虚,因为当时我也是记忆的,还不算很理解。这是我才明白面试官想要的是什么~,他想要的是思考过程,然后一顿讲解,才放过我。 前方高能,开始飙车: 先来看一下...
  • 1. 判断第二个日期比第一个日期大 82 2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? ...
  • 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例: 给定数组 nu...
  • 也更容易判断问题可能点,节省判断的时间,而不用来回问答。 同时也鼓励群友们积极回复已知的问题,大家相互帮助共同成长。如有bug或新需求也可以直接提交issue到github,我会酌情处理。 如果你发现你的问题很久都...
  • 题库来源:安全生产模拟考试一点通公众号小程序 2021年高处安装、维护、拆除复审考试及高处安装、维护、拆除理论考试,包含...2、【判断题】 广告施工吊装作业中,被吊桁架或广告结构吊装到位后应经校准和固定后方可...
  • 洛谷 P4116 Qtree3

    2018-07-26 18:55:00
    读完大概不难判断是一道树剖的 这道的关键是记录两种状态,以及黑点的序号(不是编号) 线段树啊当然 定义两个变量v,f,v表示距离根节点最近的黑点,默认-1,f则表示区间内是否含有黑点,有为1,无为0 那么,...
  • 题库来源:安全生产...1、【判断题】生产经营单位应当建立安全生产教育和培训档案,如实记录安全生产教育和培训的时间、内容、参加人员以及考核结果等情况。(√) 2、【单选题】当连续5天日平均气温低于( ),一般...
  • 我们在连接一个点到另一个点之前,先用并查集判断是否构成一个环,如果是的话,我们就可以记录下这个答案,然后维护最小的答案。 那么,如果构成一个环的话,怎么记录它的长度呢? 我们可以先定义一个变量cnt,在并...

空空如也

空空如也

1 2 3 4
收藏数 67
精华内容 26
关键字:

判断题怎么记答案