String类为毛不可变?

  前一段时间面试(别人),想着自己虽没有当(面试)官的经验,但有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的算法和简单的缓存处理

原文地址:https://www.cnblogs.com/liuCy/p/3950512.html