Android面试一天一题(7 Day)

作者: goeasyway | 来源:发表于2016-06-02 09:38 被阅读6512次

    自2010年起,Google和甲骨文一直就Android系统是否侵犯甲骨文的版权和专利争论不休。其实双方的争论点倒不是Google是否在 Android 中使用了Java APIs,Google对此也没有否定,因为这样能让数百万的开发者为自己开发应用程式。Google的论点是,APIs不能有版权,它本来就是用来让应用程式间相互交流,而很多公司也会让开发者自由使用。甲骨文对此的态度当然是我不听、我不听、我不听。

    最终联邦陪审团裁定Android操作系统并未侵犯甲骨文的版本,37个Java API是正常使用。Android程序员开始喷甲骨文,并庆幸我们的饭碗保住了。

    回到面试上,今天聊一下和Java相关的面试题。没错总有那么一些公司在招Android程序员时,比较侧重考察Java基础和能力的。Java的值传递和引用传递问题,相信很多人都被问题过,当然很多时候面试官都不会这么直白的问,他们会给你设计一个方法让你给出执行这个方法后的输出结果。

    面试题: Java的值传递和引用传递问题

    看过一些Java教材的话,对这句话应该不陌生:

    “在Java里面参数传递都是按值传递”
    这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

    简单的说,基本类型是按值传递的,方法的实参是一个原值的复本。类对象是按对象的引用地址(内存地址)传递地址的值,那么在方法内对这个对象进行修改是会直接反应在原对象上的(或者说这两个引用指向同一内存地址)。不过要注意String这个类型,如下代码:

    public static void main(String[] args) {
        String x = new String("goeasyway");
        change(x);
        System.out.println(x);
    }
     
    public static void change(String x) {
        x = "even";
    }
    

    可以自己思考一下会输出什么结果,为什么。String的对象是不可修改的,如果真正要达到改变字符串的效果,我们需要使用StringBuilder来替代String。

    结论

    很遗憾,我在实际中发现很多人都不会去重视基础问题,保括一些资深的开发也不太清楚Java还有这两种区分。在之前我呆过的一家公司,有一位女程序员直接在代码里使用一个未经声明的方法,并给这个方法传参数,然后来问我为什么编译不过呢。但这却不妨碍她仍然可以为客户解决问题,可以获得组内的最佳员工评选。所以有很多人并不重视基础的问题,总认为不知道也无防,用的时候有问题自然会报出来,到时候再解决就好了,你知道的也没比我多能耐。我只能说,知道的话确实不比别人多能耐,只是多了一份从容。

    相关文章

      网友评论

      • 花郎:这个问题其实是实参和形参的区别
      • 11amok:对象传递的引用,形参和实参两个引用都指向同一个内存地址,形参的修改会影响实参的值,但前提是该对象是可变的。
        对于String这种不可变对象,形参对其重新赋值,实际是将形参引用重新指向了一个新的地址。实参仍然指向旧地址。
      • 4b2d37f9514b:没懂这个例子和传值引用有什么关系。难道不是在考局部变量和全局变量吗?
      • RyanYans32:当执行到change方法时,Main就入栈,change开启一片栈空间,x是形参,在change的栈内存有一份拷贝引用x。(Main栈上的x和change栈上的这时是指向同一片堆空间的即“goeasyway”)。然后在x=“even”,此时chang栈上的x会指向新的一片空间(方法区上的常量池),而Main栈上的x没有改变。
      • 魏震洲:方法里的String x 是形参,main方法里Sting x 是实参。形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。所以当然无法修改String x的值。

        ```
        public class TestString {
        public static String x ;
        public static void main(String[] args) {
        x = "goeasyway";
        x = change(x);
        System.out.println(x);
        }

        public static String change(String x){
        x = "even";
        return x;
        }
        }
        ```
      • 我叫jc:在同一代码块内,x的引用地址不变,所以你在main方法同一代码内操作x输出会变
      • 9b4f2400ea72:这个例子不论在值传递还是引用传递,都不会改变原值的。
        值传递只改形参。
        引用传递修改了引用方向,也就不持有原来的引用了,也不会影响到原来的值。
      • utf8_1436:嗯,看到这篇文章幡然醒悟,好厉害的,最后一句话,希望通过努力我也可以多一份从容
      • 779106eb7ec4:唉,我就是因为没搞懂string的不可变性被鄙视了(҂⌣̀_⌣́),早来看就好了
      • 小桥流水哗拉拉:谦虚使人进步,骄傲使人后退。哇咔咔!
      • 滑稽的命运:局部变量x的值不会被change方法改变
        追寻梦想的人:@DylanW 谢谢,确实是你说的这样的了,刚开始没明白了
        DylanW:@滑稽的命运 如果换成StringBuilder就会被改变了,一般不被改变的是基础类型的变量,而类等实例对象是引用传递,是会被改变的,但String又是特殊的因其有final限制
      • DevWang:如果真正要达到改变字符串的效果,我们需要使用StringBuilder来替代String

        怎么写 有没有大神教一下?
        Jafir:@不时不食 如果非要代替
        private void change(StringBuilder x) {
        x.delete(0,x.length());
        x.append("even");
        }
        DevWang:@坏小桃 这样替代我可以理解,但是本身StringBuilder指向的是goeasyway,现在这样操行并没有指向even,而是goeasywayeven,并没有达到目的?
        e22f668396cf:@不时不食 stringBuilder.append()
      • EMG:如果c/c++学的扎实的话这个问题应该能很明白
      • f024aab9266e:女程序有时候会故意问你问题
        胡二囧:老司机
        f024aab9266e:@kk赵杰 假装不知道
      • 流川枫与苍井小姐:我理解的是,在main方法中打印了两次的对象x跟传入change中的x其是是两个实例,所以在change中去重新赋值,其实赋值的是main方法中x的堆值中得拷贝,因此main中x打印的依然是原始值。
        RyanYans32:不能说是两个实例,实际上是栈上有两个x引用,指向堆中同一个实例对象而已。(其中一个x引用指向改变不影响另一个的指向)
      • google666s:chang函数中使用x.upcase()方法更能说明String不可变性,x=“even”是改变引用所指向的对象
        天青色等煙雨_而我在等妳:@google666s x.upcase(),相当于产生了一个新的String对象是吧?
      • 临窗听雨:使用没声明的方法?这么叼
      • dd8b8e0f297a:最后一句话说的好
      • 9efe1db2c646:测试过代码 打印出来是 even 骗人的…
        李文文丶:@彼时芒种 刚打了,是对的,你还可以用StringBuffer试试
        没有故事的童鞋:@彼时芒种 发代码看看
        goeasyway:@彼时芒种 可以把你的代码发我看一下
      • 咸鱼佬:可以
      • 天青色等煙雨_而我在等妳:总结的不错
        google666s:chang函数中使用x.upcase()方法更能说明String不可变性,x=“even”是改变引用所指向的对象
      • goldfish2017:我也感觉最后一句好😂
      • AD小徐:最后一句收尾,深藏功与名!
      • e811a35be91f:后一句不错,知道的确实比不知道的多一份从容。记得以前我组内也是有一个直接引用传递,然后问为什么原来的值变了
      • alighters:不错。。说的好。。

      本文标题:Android面试一天一题(7 Day)

      本文链接:https://www.haomeiwen.com/subject/outkdttx.html