• 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的算法和简单的缓存处理

  • 相关阅读:
    私有云是伪命题:真正的私有云 ≈ 公有云
    云计算的重新构建架构:优化迁移策略
    五个顶级的大数据架构
    Algorithm Gossip: 费式数列
    Algorithm Gossip: 河内塔
    Mysql连接报错:Unknown system variable 'language'
    ssm整合的时候出现的abstactMethodArror 解决
    java集合整理
    Oracle的序列和索引
    关于java堆栈的理解与说明
  • 原文地址:https://www.cnblogs.com/liuCy/p/3950512.html
Copyright © 2020-2023  润新知