-
一道印象深切的口试题: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,是以如许是极其浪费内存的,不推荐应用。
常量池是保存在堆中的。
小菜程度有限,不当之处多多包涵!
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永