一道印象深切的口试题:String参数传递题目

    添加时间:2013-7-19 点击量:

             今天小菜去北京某有名公司口试,做了公司的口试题,然后就是轻松的口试。


             口试过程中,口试官让我讲讲此中一个题是怎么选的答案,代码大致内容如下:




     1 public class StringTest{
    
    2 public static void main(String[] args){
    3 String str = s;
    4
    5 changeStr(str);
    6
    7 System.out.println(str);
    8
    9 }
    10
    11 private static void changeStr(String old){
    12 old = old + -change;
    13 }
    14
    15 }




             真实的输出成果应当是s,而小菜则错误的认为是s-change,还跟口试官讲了一堆事理。


             过后刹时感触感染学艺不精,羞愧难当。。。。


             这个成果为什么s呢?经过查阅材料,本来是String固然以对象的情势存在,但仍认为是根蒂根基数据类型,就像Integer、Double那样,固然是根蒂根基类型的包装类,但仍然认为是根蒂根基数据类型。


             既然认为是根蒂根基数据类型,是以无论在办法中如何操纵,都不会影响到外界。


             其实,换个角度,也可以发明如许是错误的。


             起首,大师都知道字符串是不成改变的,简单懂得即可,不做深切评论辩论。


             把字符串当成参数传入办法时,传递的是值,是一个指针,这个指针指向了堆区的真实字符串,是以在办法中可以读到这个字符串,然则仅仅是能读到罢了,试图做如下操纵时:


             str = str.replace(“a”,”b”);


             后边的str中保存的是本来的指针,的确是可以读到本来的字符串,然后履行调换操纵,然则调换操纵履行时,绝对不成能去批改本来的字符串,因为字符串是不成变的,是以只能是在堆区产生一个新的字符串,然后把新字符串的地址(指针)赋给str。


             此时str中保存的已经不再是本来的指针,是以读出的内容产生了变更,但不代表本来指针指向的内容产生了变更。


             别的,小菜趁便再补充一个常识点。


             关于Integer i = 1;和Integer i = new Integer(1);的差别。


             Integer i = 1;会直接从常量池中找到1,然后把地址赋给i,如许充沛哄骗常量池,节俭内存,重视除了字符串,其他类型的常量池都是有局限的,超局限了失效。


             Integer i = new Integer(1);如许写,写几许次,就在内存中创建几许个对象,每个对象里都保存了一个数字1,是以如许是极其浪费内存的,不推荐应用。


             常量池是保存在堆中的。



             小菜程度有限,不当之处多多包涵!



    容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
    分享到: