一、==符的使用

首先看一段比较有意思的代码

Integer a = 1000,b=1000;
Integer c = 100,d=100;    public void mRun(final String name){new Runnable() {public void run() {System.out.println(name);}};}System.out.println(a==b);
System.out.println(c==d);

如果这道题你能得出正确答案,并能了解其中的原理的话。说明你基础还可以。如果你的答案 是 true 和true的话,你的基础就有所欠缺了。

首先公布下答案, 运行代码,我们会得到 false  true。我们知道==比较的是两个对象的引用,这里的abcd都是新建出来的对象,按理说都应该输入false才对。这就是这道题的有趣之处,无论是面试题还是论坛讨论区,这道题的出场率都很高。原理其实很简单,我们去看下Integer.java这个类就了然了。

  public static Integer valueOf(int i) {return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];}/*** A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing*/private static final Integer[] SMALL_VALUES = new Integer[256];static {for (int i = -128; i < 128; i++) {SMALL_VALUES[i + 128] = new Integer(i);}}

当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128-127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。

二、String

接着看代码

                String s1 = "abc";String s2 = "abc";String s3 = new String("abc");System.out.println(s1 == s2);System.out.println(s1 == s3);

大家又来猜一猜这道题的答案是什么?

按照==的语法来看, 首先s1、s2、s3是三个不同的对象,常理来说,输出都会是false。然而程序的运行结果确实true、false。第二个输出false可以理解,第一个输出true就又让人费解了。我们知道一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new 出来的对象和数组。然而除此之外还有一块区域叫做常量池。像我们通常想String s1 = "abc"; 这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = "abc"这样一个对象之后,"abc"就存储到了常量池(也可叫做字符串池)中,当我们创建引用String s2  = "abc" 的时候,Java底层会优先在常量池中查找是否存在"abc",如果存在则让s2指向这个值,不会重新创建,如果常量池中没有则创建并添加的池中。这就是为什么答案是true 和false的原因。

三、final关键字

还是来看一段代码

 public void mRun(final String name){new Runnable() {public void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}  System.out.println(name);}}.start();}

这种代码相信大家写过很多,当内部类访问局部变量的时候,需要在局部变量前加final修饰符,不然编译器就会报错。通常我们也是这么干的。好的,第二个问题来了,为什么要加final修饰符?相信大多数小伙伴都没有思考过这个问题,但凡使用的时候,直接加上就得了,从来没去深究过其中的原理。这对于一个优秀的程序员来说是不可取,我们不仅要知其然还要知其所以然。

现在我们来分析一下,为什么要加final关键字。首先内部类的生命周期是成员级别的,而局部变量的生命周期实在方法体之类。也就是说会出现这样一种情况,当mRun方法执行,new 的线程运行,新线程里面会睡一秒。主线程会继续执行,mRun执行完毕,name属性生命周期结束。1秒之后,Syetem.out.printh(name)执行。然而此时name已经寿终正寝,不在内存中了。Java就是为了杜绝这种错误,严格要求内部类中方位局部变量,必须使用final关键字修饰。局部变量被final修饰之后,此时会在内存中保有一份局部变得的复制品,当内部类访问的时候其实访问的是这个复制品。这就好像是把局部变量的生命周期变长了。说到底还是Java工程师提前把这个坑给我们填了,不然不知道又会有多少小伙伴会为了内部类局部变量而发愁了。

四、Integer与int那些事

看下面代码

         Integer a = new Integer(1000);int b = 1000;Integer c = new Integer(10);Integer d = new Integer(10);System.out.println(a == b);System.out.println(c == d);

这道题是继第一题的后续,如果这道题你能很快速的得出答案,那么恭喜你,==比较符你就算掌握的比较透彻了。

------------------------------------------------------分割线-----------------------------------------------------------------------------------------

正确答案: true  、false

看到这个答案很多小伙伴又会不解,先来说下第二个,按第一题来说Integer不是把-128-127缓存起来了吗?这不是应该是true嘛,但是你仔细看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。但是注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。

四道Java基础题 你能对几道?相关推荐

  1. 达内java作业_【达内JAVA教程】达内Java基础题

    原标题:[达内JAVA教程]达内Java基础题 [达内JAVA教程]达内Java基础题.的小编收集了四道JAVA基础题,下面快来跟随的小编来了解一下吧! 话说很多java程序员学过一段时间后,都应该找 ...

  2. Java基础题2从入门到放弃的第五天

    Java基础题2从入门到放弃的第5天 小博主也是初学者,肯定有地方可以用更简单的方法,希望可以指点出来.谢谢! 1分支语句 1. 让用户输入一个100以内的整数x,再输入一个100到200之间的整数y ...

  3. Java基础题(错题小结)

    Java基础题(错题小结) 1. 字符串 1.1 题1 下面程序的输出是: String x="fmn"; x.toUpperCase(); String y = x.replac ...

  4. Java基础题——15只狮子围成一圈,依次报数,报到7被剔除,最后剩下的狮子成为狮王,求狮王为第几只?

    问题如下:Java基础题--15只狮子围成一圈,依次报数,报到7被剔除,最后剩下的狮子成为狮王,求狮王为第几只? 解决问题所使用的重点:利用循环. 大体思路:每只狮子都设为true,然后循环报数,到7 ...

  5. 三面美团Java岗,面试竟然被这31道Java基础题难倒了

    01 分布式限流:Nginx+ZooKeeper 1.1 分布式限流之Nginx 请解释一下什么是 Nginx? 请列举 x Nginx 的一些特性. 请列举 x Nginx 和 和 Apache 之 ...

  6. 一些java基础题答案汇总

    一.Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java ...

  7. java 一二三四五_五道java小题,补更四道java小题

    一:分析以下需求,并用代码实现 1.定义List集合,存入多个字符串 2.删除集合中字符串"def" 3.然后利用迭代器遍历集合元素并输出 import java.util.Arr ...

  8. Java基础题(三)

    1. 有以下程序片段,下列哪个选项不能插入到第一行 .(A ). 1. 2.public class A{ 3.//do sth 4. } A.public class MainClass{ } B. ...

  9. 初识Java-20道经典java基础题分享-一定有你不知道的方法

    文章目录 使用函数求最大值 求 N 的阶乘 求阶乘和 求斐波那契数列的第n项.(迭代实现) 求和的重载 求最大值方法的重载 递归求和 递归打印数字的每一位 返回的数字之和 递归求解汉诺塔问题 创建的数 ...

最新文章

  1. 菜鸟学exchange之一:exchange邮件系统的简单安装和部署
  2. ScheduledThreadPoolExecutor定时任务线程池执行原理分析
  3. POJ 1449 amp; ZOJ 1036 Enigma(简单枚举)
  4. [HTML] Google IE-x.js 解决IEx与W3C标准的冲突
  5. ubuntu知道文件名查找文件路径
  6. typeof 和instanceof
  7. 抓住人工智能红利,百度AI达人养成营带你速成深度学习
  8. c# txt代码转换成HTML格式
  9. android+去掉飞行模式,在Android中关闭飞行模式
  10. 水箱液位计算机控制系统设计,水箱水位PLC自动控制系统的设计_吕宁.pdf
  11. 究竟什么是电脑蠕虫病毒,电脑蠕虫病毒解析
  12. 量化投资:研报文本挖掘选股策略
  13. monthCalendar (日历)控件常用操作
  14. 文案撰写方法三:制造反差
  15. 灰、黄、蓝三种颜色的收集装置模型练习及实现思路
  16. 长文解读|Progress in Neurobiology:监督式机器学习在神经科学中的应用
  17. 电子设计硬件知识要点(1) 电阻、电容、电感、二极管、三极管
  18. ValueError: List argument ‘indices‘ to ‘Sparse Concat‘ Op with length 0 shorter than minimum length2
  19. 乐理基础知识-4.音程
  20. 可视化指标计算公式_股票交易数据可视化:技术分析常用指标绘制

热门文章

  1. 课程设计小组报告——基于ARM实验箱的捕鱼游戏的设计与实现
  2. Linux下 Yum 是什么
  3. VC6.0 快捷键整理
  4. 高速串行总线设计基础(七)揭秘SERDES高速面纱之时钟校正与通道绑定技术
  5. 全球及中国空气净化器市场销售模式与营销策略前景咨询报告2022版
  6. 全国软件2. 三人年龄
  7. iso-8859-1表示中文汉字
  8. DICOM MPPS 的原理及应用(Principle and Application of DICOM MPPS)
  9. mysql 难点_数据库技术的重点与难点有什么?
  10. 苹果手机相机九宫格怎么设置_瞧不起iPhone相机?苹果手机5个逆天拍照功能,效果惊艳堪比单反...