问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-28 15:53

我来回答

1个回答

热心网友 时间:2022-06-19 13:48

符的使用

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

[java] view plaincopy

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这个类就了然了。


[java] view plaincopy

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。

2String

接着看代码

[java] view plaincopy

          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的原因。

3final关键字

还是来看一段代码

[java] view plaincopy

public void mRun(final String name){  

    new Runnable() {  

       

        public void run() {  

                        try {  

                          Thread.sleep(1000);  

                       } catch (InterruptedException e) {  

                         // TODO Auto-generated catch block  

                        e.printStackTrace();  

                       }    

                       System.out.println(name);  

        }  

    }.start();  

}  


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


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

4Integer与int那些事

看下面代码

[java] view plaincopy

   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的同学注意了!!!

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:232300090【长按复制】 我们一起学Java!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
深受粉丝喜爱的机体,高达史上最受欢迎模型,到底有多少种独角兽 医生,你们好,我男今年28我的左眼睛上面眼皮靠鼻梁的地方红肿,不是很痛... 眼角靠鼻梁这边欺负下方里面长了麦粒肿 现在有4天左右了里面出现了硬... 你好 我眼睛里的麦粒肿是有点硬的那种 也不是很大 医生不建议手术 麦粒肿手术需要剪掉眼睫毛么 羊绒披肩怎么披好看 怎样挑选高品质的披肩? 入手披肩时需要注意些什么? 如何挑选质量比较好的披肩? 家庭cd机哪个好 java数组基础问题? JAVA基础问题,到底是值传递还是引用传递? Java基础问题(追加80分) 求解Java基础选择题。 Java基础题? JAVA最最基础的问题 JAVA基本问题 java基础问题? 关于Java程序的基础问题 自学java遇到的基础问题!!! 关于Java的基础问题 登陆QQ企点显示当前版本过低,请先升级到QQ最新版本是什么意思? 雄性激素和雌性激素分别是男性和女性特有的吗? 男人身体里的雌性激素有什么作用 男性体内的雌性激素由什么分泌?女性体内的雄性激素由什么分泌? 男女体内都有雌性和雄性激素吗?分别是哪个部位分泌的? 男人体内有雌性激素吗?女人体内有雄性激素吗? 男人会分泌雌激素吗? 有谁知道男人体内有雌性激素吗 男性身上有没有雌性激素,请给出依据 怎么退订农行ETC 星巴克的咖啡粉(拿铁)要怎么弄最好吃 一个男人心里有你时会有哪些表现? 男人心里有没有你的表现 一个男生对你有好感的表现是什么? 和男人交往,如果他“心中有你”,哪4个表现就注定了? 男生心里有人的表现? 两性交往中,一个男人的心里有你都有哪些表现呢? 一个男人心里有这个女人,会有什么样的表现呢? 男生特别在乎一个人,都会有哪些表现? 男人心里你,这几个表现是藏不住的 感情中,一个男人心里是否有你,有怎样的表现? 假如男人心里有你的时候,会有哪些的表现呢? 心里真的有你的男人,都是有哪方面的表现? 相处中的哪些表现可以看出一个男人心里究竟有没有你? 如果心里有你,男人会不自觉流露出哪两个表现? 发酵粉被烫死怎么办? 一个男人心里有没有你,一般会有哪些的表现呢? 孕晚期喝什么花茶好呢,白开水实在喝不下去了? 吃过鹅蛋,喝过菊花茶的孕妈宝宝出生后有黄疸吗?