黑马程序员技术交流社区

标题: 学完基础的来做2道面试题吧,保证打击自信心 [打印本页]

作者: Yov正    时间: 2015-5-26 18:22
标题: 学完基础的来做2道面试题吧,保证打击自信心
本帖最后由 Yov正 于 2015-5-28 22:38 编辑

心里素质不好的慎看啊,不过做出来你岂不是太吊了?
一、
public static void main(String[] args) {
                int a = 0;
                a = a++;
                System.out.println(a);
        }
二、
public static void main(String[] args) {
                String str = "apple";
                changeStr(str);
                System.out.println(str);
        }

        private static void changeStr(String str) {
                str = str+" phone";
        }-----------------------最新编辑
看到很多人说简单,也有很多人给出了解释,但有些人没有答到点上甚至打错了哦。
第一题我知道答案,硬让我解释我也能逻辑解释通,但是实际上这涉及到java的a++底层实现问题,如果没有了解过这方面的肯定是不会而只能蒙的,这也不是基础就能学到的知识。(只是我最近了解到的一个很新奇的知识点,by the way,c和java的结果不一样哦)
关于第二题确是我想跟大家分享的,这题每个java程序员都要会做,而且要知道为什么。其实是考的java调用方法时,传递的引用还是值,方法的参数是哪儿来的。str只是一个单纯的对象而已,不涉及到String的特性。类似的题看下面(tip:如果这一类题不懂为什么,那以后你写的任何代码都是可能出问题的哦,换言之你java没入门,所以不但要知道答案,还要知道为什么。画图可能有助于理解)
public static void main(String[] args) {
                Stu stu = new Stu();
                stu.name = "zhang";
                changeStr(stu);
                System.out.println(stu.name);//结果?
        }

        private static void changeStr(Stu stu) {
                stu.name = "li";
                stu = new Stu();
                stu.name = "wang";
        }

        public static class Stu {
                public String name = "zhao";
        }


作者: hui1107464497    时间: 2015-5-26 18:37
额,这个啊基础扎好么有问题吧。。
作者: as604049322    时间: 2015-5-26 18:45
这种简单到不行的基础楼主搞的好像好难一样????

唉,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
作者: Sky丶    时间: 2015-5-26 18:52
这是面试题?

作者: Yov正    时间: 2015-5-26 19:24
Sky丶 发表于 2015-5-26 18:52
这是面试题?

是面试题,不过是我出的,基础好的话第二题应该没问题,不过有一大批工作一年的都做不粗来
作者: 海洋你好    时间: 2015-5-26 20:12
我无语了,这很难吗,个人觉得很easy
作者: forTomorrow    时间: 2015-5-26 20:32
这是水贴 逗你玩的 看不出来吗
作者: YRDHelloworld    时间: 2015-5-26 21:00
这个你确定很难???
作者: 曲终烟尽    时间: 2015-5-26 21:05
本帖最后由 曲终烟尽 于 2015-5-26 21:07 编辑

看第一题的时候很犹豫,是0,还是1,在C语言里,它就是1,在JAVA里就是0,编译器的处理不同,第二个是和内存空间有关的,堆,栈的问题,值类型都是在栈中存储,new的对象和数组是在堆中存储,栈是临时空间,用完就释放,堆里的东西用完后JAVA会随机进行垃圾回收。堆里的对象和数组要复用可以进行引用,而栈中的数据要复用只能复制,。这里 String str是字符型变量,存储在栈中.只是复制过去了而已,并不是传递引用。
a=a+1;
a+=1;
a=++a;
这都是成立的,a都等于1.
作者: 时光匆匆    时间: 2015-5-26 21:17
。。。学了前几天就可以答了吧
作者: 大西洋    时间: 2015-5-26 21:24
这是黑马老师给你出的面试题吗??

1、0;
2、apple
作者: 半世心修    时间: 2015-5-26 21:27
a++是先赋值再运算,++a是先运算再赋值。
作者: mars_b0ZZ0    时间: 2015-5-26 21:33
Are you kidding me?
作者: 13699266500    时间: 2015-5-26 21:40
基础学的不错呀
作者: wwb1105    时间: 2015-5-26 21:46
基础题啊   好好加油
作者: niuapp    时间: 2015-5-26 21:48
第一题为什么是 0  呢? 大神给说说
作者: 张清华    时间: 2015-5-26 21:51
还可以,这应该是基础的题吧
作者: 人在旅途~东营    时间: 2015-5-26 21:51
这个。。。你确定不是逗我们玩么?感觉讲过很多次了啊,跟基础扎不扎实真关系不大。

1.0
2.apple
作者: 高强520    时间: 2015-5-26 21:55
这个。。。。
作者: 快乐Anne    时间: 2015-5-26 22:01
还好,基础题
作者: zhangjnia    时间: 2015-5-26 22:44
嗯,还行吧
作者: feng0606    时间: 2015-5-26 23:55
今天刚学到String这里,第一个其实记住了++在前还是在后时的运算规律就知道了,下面那个字符串的记住一句话就行了,老毕String类视频第一个视频里面就说了,字符串一旦被初始化就不能被改变.第二个题目的答案就出来了.
作者: EnderDBluse    时间: 2015-5-26 23:59
。。。。。。
作者: 18425178    时间: 2015-5-27 00:27
我才看了一天就会~这是简单的基础吧
作者: mmakun    时间: 2015-5-27 08:37
还行,不错的考基础的
作者: sjaiwl    时间: 2015-5-27 09:28
我没看错吧?????
作者: Jeremy_Yao    时间: 2015-5-27 14:25
够基础了

作者: Heroe    时间: 2015-5-27 14:43
好吧....
作者: 姬光普    时间: 2015-5-27 15:14
好吧,我犹豫了
作者: guojiadui    时间: 2015-5-27 15:34
按你这说,我觉得我好厉害啊
作者: wx_yTUQXu69    时间: 2015-5-27 16:39
过来趟水的
作者: 爱李萝卜    时间: 2015-5-27 20:00
第一个应该是1,第二个应该是apple
作者: l598790586    时间: 2015-5-27 20:12
着道了!!
作者: xxz    时间: 2015-5-27 20:51
爱李萝卜 发表于 2015-5-27 20:00
第一个应该是1,第二个应该是apple

第一个是0 耶。
作者: 小车车    时间: 2015-5-27 20:54
基础题哦!
作者: 791180016    时间: 2015-5-27 21:09
谁能准确的告诉我这是水贴吗
作者: 533洋洋    时间: 2015-5-27 21:17
不至于楼主说的那么难
作者: 王建伟    时间: 2015-5-27 21:35
0     apple这面试题有这么简单?
作者: 曲终烟尽    时间: 2015-5-27 22:06
看这么多人都说简单,但我觉得这个问题第一题还是需要深入了解,
只是直到它的结果是0,但为什么是0呢,
a=a++;
等号右侧先做运算,
而右侧a++的值是0,后加这个动作应该是当前语句的末了才执行。也就是整个语句最后执行。如果我这么说没错,那就是
a=a;a++;  这两句是等于  a=a++;的
一开始a=a 得到 a==0,之后对a进行加1操作,a++,那么问题来了,这时候a为什么输出是0,而不是1呢???
看上去我说的似乎是没错的啊,我也觉得我说的没错啊!那你们说说为什么不等于1而是等于0,你们上边都说很基础,那解释一下,谁能理解其中的真正原理呢!
我当时看到你这个题我就很纳闷,我百度了,之后觉得这个问题有点深奥不是目前学基础知识后能理解的,这个和编译器和虚拟机有关,说白了,要看汇编的代码执行过程才能理解其中的原因。我是潦草看了一下,没有深究,但是知道个大概。
其中a++这句话在内存中新建了一个临时变量a,所以对a的操作就不会对原来的变量a产生影响,最后输出的是原来的a的结果0,而不是变成1的另一个a。!!!
作者: 杨宇俊    时间: 2015-5-27 23:34
答案是:0,apple
作者: JavaStudy770    时间: 2015-5-27 23:41
我以为有多难哦,都是考过的题目
作者: zuoyou    时间: 2015-5-28 00:46
有点简单吧,,,
作者: niuapp    时间: 2015-5-28 08:33
曲终烟尽 发表于 2015-5-27 22:06
看这么多人都说简单,但我觉得这个问题第一题还是需要深入了解,
只是直到它的结果是0,但为什么是0呢,
a= ...

我感觉还是有点晕,a++如果是临时的,那是被左边的 a覆盖了?为什么C里边输出的是 1呢,纠结

作者: kingowe    时间: 2015-5-28 09:02
对楼主无语了。。。。。,楼主好好练练基础吧,
作者: hellotaomi    时间: 2015-5-28 09:55
一、答案是:0
二、答案是:apple
作者: kmlitheima    时间: 2015-5-28 09:58
这也有问题?估计是标题党哎~真心给跪了!
作者: 张海旭    时间: 2015-5-28 19:14
学习了:victory:
作者: 开到荼靡    时间: 2015-5-28 19:49
真够水的
作者: 小水    时间: 2015-5-28 20:10
妥妥水贴。呵呵
作者: Huylens    时间: 2015-5-28 20:14
结果是0,apple
作者: 守株人    时间: 2015-5-28 21:48
谢谢分享,长知识了
作者: 爱李萝卜    时间: 2015-5-28 21:49
xxz 发表于 2015-5-27 20:51
第一个是0 耶。

恩恩,知道了,谢谢
作者: ZYZQ    时间: 2015-5-28 21:54
Your water too well, I'm out!!
作者: Yov正    时间: 2015-5-28 22:41
同学们查看最新结果啦。
作者: 仅此一抹心醉    时间: 2015-5-28 22:45
我发现大婶好多啊   作为渣渣的我表示我都看不懂这两个题目
作者: 唐海    时间: 2015-5-28 22:53
你在干什么
作者: 雪域星辰    时间: 2015-5-28 23:14
这个东西很是细节啊。。。
作者: Yov正    时间: 2015-5-29 18:29
雪域星辰 发表于 2015-5-28 23:14
这个东西很是细节啊。。。

第二题要好好掌握啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2