Java基础精选,你答对了几道?

转载 2017年12月12日 00:00:00

没有技术深度是大多程序员的一种常态。

但是当你成为一个资深的工程师的时候,很多公司并不希望你还是那样平庸,没有深度。虽然你会纳闷,我就算有深度你们也不一定用得上呀?然而到了这个级别的人需求量并不像初中级开发那么多,公司更理性和稳妥的做法是选择有深度的人,不是吗?

Integer比较

看下面这段有意思的代码,对数字比较敏感的小伙伴有没有发现异常?

public static void main(String[] args) {

        Integer a = 128,b=128;  

        Integer c = 127,d=127;

              

        System.out.println(a==b);  

        System.out.println(c==d);

}

如果你的回答是false,false,可能你有一定的基础,知道Integer是一个封装类。当然如果你的答案是true,true的话,也在一定的认知范围之内,但是基础知识掌握的不够好。

好了,我们运行main方法,正确答案应该是false,true。前几年这道题出现在很多面试题中,当然你也会说了,我会做项目就ok了,用到查就是了,何必要知道,这我没话说。

其实当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,让我们看下源代码是怎么实现的。

IntegerCache方法有明确的注释,缓存范围,如何修改等等。

 /**

     * Cache to support the object identity semantics of autoboxing for values between

     * -128 and 127 (inclusive) as required by JLS.

     *

     * The cache is initialized on first usage.  The size of the cache

     * may be controlled by the -XX:AutoBoxCacheMax=<size> option.

     * During VM initialization, java.lang.Integer.IntegerCache.high property

     * may be set and saved in the private system properties in the

     * sun.misc.VM class.

     */


    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) {

                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);

            }

            high = h;


            cache = new Integer[(high - low) + 1];

            int j = low;

            for(int k = 0; k < cache.length; k++)

                cache[k] = new Integer(j++);

        }


        private IntegerCache() {}

    }


 public static Integer valueOf(int i) {

        assert IntegerCache.high >= 127;

        if (i >= IntegerCache.low && i <= IntegerCache.high)

            return IntegerCache.cache[i + (-IntegerCache.low)];

        return new Integer(i);

}

神奇不神奇,其实代码描述的很清晰,如果整型字面量的值介于-128到127之间,就不会new一个新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的运行结果是a==b=false,而c==d=true。

String比较

接下来这道题,相对来说应该比较简单了。

public static void main(String[] args) {

        String s1 = "abc";  

        String s2 = "abc"; 

        String s3 = new String("abc"); 

        System.out.println(s1 == s2); 

        System.out.println(s1 == s3);

    }

小伙伴们看了是不是很熟悉?可能有的人一眼就扫出了答案true,false。当然没有扫出正确答案的小伙伴们也不要气馁,下面跟大家分析分析为毛是这么一个答案。

按照==的语法来看, 首先s1、s2、s3是三个不同的对象,常理来说,输出都会是false。然而程序的运行结果确实true、false。第二个输出false可以理解,第一个输出true就又让人费解了。

我们知道一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new 出来的对象和数组。然而除此之外还有一块区域叫做常量池。

像我们通常想String s1 = "abc";这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = "abc"这样一个对象之后,"abc"就存储到了常量池(也可叫做字符串池)中。

当我们创建引用String s2 = "abc" 的时候,Java底层会优先在常量池中查找是否存在"abc",如果存在则让s2指向这个值,不会重新创建,如果常量池中没有则创建并添加的池中。这就是为什么答案是true 和false的原因。

Integer与int比较

public static void main(String[] args) {

        Integer a = new Integer(128);  

        int b = 128; 

        Integer c = new Integer(6); 

        Integer d = new Integer(6); 

        System.out.println(a == b); 

        System.out.println(c == d); 

    }

相信又有不少小伙伴懵比了吧,ture还是false?还是直接公布答案吧,true,false。

c == d=false,我觉得没什么好说的,可能有的小伙伴要问了不是-128-127被缓存起来了么?但是我们这里的Integer是new出来的,并不是用的缓存,所以结果是false。

a == b=true,大家注意一下这里的b是int类型,当int和Integer做==比较的时候,Integer类型会自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。

0?wx_fmt=gif

Java团长

微信号:javatuanzhang

每日分享Java技术干货

640?wx_fmt=jpeg

长按识别二维码

Java基础精选,你答对了几道-

没有技术深度是大多程序员的一种常态。 但是当你成为一个资深的工程师的时候,很多公司并不希望你还是那样平庸,没有深度。虽然你会纳闷,我就算有深度你们也不一定用得上呀?然而到了这个级别的人需求量并不像初...
  • zhanglao33
  • zhanglao33
  • 2017年09月10日 17:26
  • 141

java 笔试之继承基础(看看你能做对几道题)初学者不要小看啊

先笔试,全是基础题,共30道简笔题, 1. abstract class Name {  private String name;  public abstract boolean isStu...
  • a564663276
  • a564663276
  • 2013年05月20日 21:40
  • 3096

【微信开发】“你问我答”

前言   如题,我们在使用像中国移动等公众号时,可以通过输入一些文本内容来查询我们需要的信息,实现我们“提问”,公众号自动“回答”,将微信公众号接入我们自己的网站,通过微信将消息转发给用户。 ...
  • u013201439
  • u013201439
  • 2017年07月30日 20:23
  • 3207

答案公布 | AI冲顶大会你答对了几道?

前天为大家准备了12道人工智能领域的题目,答题的过程让大家都get到新姿势了吗?在收到的48个回答中,有两位读者全部答对,真的是非常厉害啦!今天,就让我们一起回顾一下题目,并看看正确答案的解释吧!1、...
  • Y2c8YpZC15p
  • Y2c8YpZC15p
  • 2018年01月26日 00:00
  • 95

计算机应用基础选择精选100题

选择题精选  1. 目前人们普遍使用的电子计算机是()  A.数字电子计算机  B.模拟电子计算机  C.数字模拟混合电子计算机  D.优化电子计算机  2. 20世纪50年代到60年代,3. 电子计...
  • m57091003
  • m57091003
  • 2007年09月16日 18:15
  • 1530

java基础经典练习题

【程序1】    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?    //这是一个菲波拉契数列问...
  • lxl403853563
  • lxl403853563
  • 2016年03月21日 15:18
  • 1664

男生做对了几道题

他们作对试题的数量各不相同,最多作对10道,最少作对4道
  • weiyanghuadi
  • weiyanghuadi
  • 2014年01月27日 15:55
  • 413

哥:我要嫁给你!(让人巨感动)

一周前,在加拿大的同学给我电话,顾城和他妹妹,还有他们没有出生的孩子出了车祸,当场死亡; 我的大脑瞬间一片空白,甚至于不敢相信电话那头的老同学是不是在开愚人节的玩笑;然而,这的确是真的,顾城一家在多伦...
  • ychxallen
  • ychxallen
  • 2007年04月08日 19:07
  • 7573

敏捷开发,你真的做对了吗?阿里文娱广告团队敏捷实践总结

阿里妹导读:很多人对敏捷开发有个普遍的误解,认为敏捷就是快,经常在需求没定义清楚的情况下就急于开工。事实上,这样做往往得不偿失。今天,我们邀请阿里巴巴敏捷教练问菊,为我们带来阿里文娱广告团队敏捷实践,...
  • zz901214
  • zz901214
  • 2018年02月02日 15:40
  • 112

四道Java基础题 你能对几道?

一、==符的使用 首先看一段比较有意思的代码 Integer a = 1000,b=1000; Integer c = 100,d=100;    public void mRun(final S...
  • soul_code
  • soul_code
  • 2015年12月21日 09:04
  • 7296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java基础精选,你答对了几道?
举报原因:
原因补充:

(最多只允许输入30个字)