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

相关文章

  • Android面试一天一题-goeasyway

    以下文章作者:goeasyway Android面试一天一题(1 Day) Android面试一天一题(2 Day...

  • MS(6):Java篇

    MS思考:Android面试一天一题(7 Day):Java相关 1.Switch能否用string做参数? 在J...

  • MS(1):Android之架构篇

    一、架构相关 1、MVC,MVP,MVVM MS思考:Android面试一天一题(Day 33:Android开发...

  • 面试题

    最全的BAT大厂面试题整理答案Android面试一天一题(Day 37:一套高级工程师的面试题)Android面试...

  • MS(2):Android之基础知识篇

    二、组件 1、Activity----------1 MS思考:Android面试一天一题(3 Day):Acti...

  • MS(7):非技术问题篇

    一、GM问非技术问题汇总 MS思考:Android面试一天一题(Day 34:常去的Android相关站点) 说下...

  • MS(3):Android之机制原理篇

    五、重点机制原理 1、Handler机制 MS思考:Android面试一天一题(8 Day):Handler相关分...

  • MS(5):android之进阶篇

    七、自定义View MS思考:Android面试一天一题(Day 30:老外的自定义View面试题)MS思考:老外...

  • android Service 一些思考

    看了Android面试一天一题(1 Day),对Service 的一些总结与思考 作者原文章链接: http://...

  • 读goeasyway文章有感

    今天在地铁上读goeasyway的文章《Android面试一天一题(Day 39:写博客很重要吗?)》,很有感触,...

网友评论

  • 花郎:这个问题其实是实参和形参的区别
  • 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赵杰 假装不知道
  • 59760618f7b6:我理解的是,在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