前一段时间面试(别人),想着自己虽没有当(面试)官的经验,但有N多的被面经验,于是就尝试着展示自己心中的面试官...问题是我花了N天去思考出什么样的题,最后才发现行政压根不管你,不知道从哪里弄下来一份就让别人做了--尼玛,给我分卷子准备下也行啊,像这种笔试题的错,你懂的,作为我心目中的面试官,自然要听小学弟一一进行解释....此次面试官经历无法用文字形容,技术宅,你懂的
String类是否可修改?
战5渣的问题,答案就一个不字,开玩笑,tell me why?。。。大多数人告诉我因为String是final是不可修改的,so,String是不可修改的,至少在这个时候我会问他关于final和泛型的问题,很有意思哦。。。
我的理解:api上的描述说String是一个不可变的字符串,so,他是不可变的...至于他的模型/原形/源码/结构,我相信大家一定都看过,一个关键的public final class String描述,一个关键的 private final char value[]属性,那么final的描述就非常重要,final代表的意思的确是不可变,而且是变量的引用不可变,至于这个变量的内部结构...who care- -,换句话说将value重新赋值是不可以的,不过修改value[0]什么的还是允许的....至于关心它内部结构的方式,我所了解的就只有传说中的只读模式了比如List<?>[] list,char[]什么的,不要在意...所以如果有一种方法能够改变获取value的值,我就可以修改value[0],这样的话,String就可以被修改了,至于方法嘛,反射,你懂的
String val="12345"; System.out.println(val+":"+val.hashCode()); Class clazz=String.class; Field[] fileds = clazz.getDeclaredFields(); for(Field f:fileds){ if(f.getName().equals("value")){ f.setAccessible(true); char[] object = (char[]) f.get(val); object[0]='a'; } } System.out.println(val+":"+val.hashCode()); System.out.println(val+"==12345:"+(val=="12345")); System.out.println(val+"==a2345:"+(val=="a2345")); //12345:46792755 //a2345:46792755 //a2345==12345:true //a2345==a2345:false
看,value被修改了,这又有一个问题hashcode的计算方法(我被问过--,好长的说)以及value被修改了,为什么hashcode不变?(String是不可修改的+缓存机制)
无论是我以前回答这个问题还是前一段时间面试这个问题解释后,都会被告知,没错,但是String是不应该这样被访问的...可问题是,你是如何考虑如"如何像加入泛型的List中添加不同类型的对象?"这个问题的?为什么就不说泛型就是不可以添加其他没有被指定的类型累类?吐槽果然很爽,虽然这么做的意义也就一毛钱,不过至少你需要知道
1.fanal和泛型的<?>
2.get/set的意义(没有set就是不可以修改--)
3.反射以及反射对封装的破坏
4.hashcode的算法和简单的缓存处理