1.String是如何做到不可变?为什么要将它设计为不可变类?
    答:首先String类是被final修饰,不能被继承;它把数据存放在一个数组value中,value同样被final修饰;所有对String对象进行操作,包括构造函数等涉及到都是重新创建一个String对象,且涉及到数组value的时候,都是重新copy一个新的数组,避免改动影响原来的value。
         1> 字符串常量池的需要,如果String可变,那么就没法用常量池优化
         2> 安全性考虑
         3> String由于不可变所以缓存了hash,对如HashMap、HashSet存储字符串时性能提升很大
    2.String实现了哪些接口?
    答:Serializable:保证String对象可以被序列化和反序列化;Comparable<String>:String可以记性排序;CharSequence:对数组value的操作
    3.String有哪些内部类,有什么用?
    答:private static class CaseInsensitiveComparator implements Comparator<String>, java.io.Serializable
       该类实现了Comparator接口和序列化接口,作用是忽略大小写比较大小,我们知道String类实现了Comparable接口,所有这里看做是通过内部类对String类的比较的另一种实现,可以在Arrays.sort中使用,且使用了单例模式,并且通过readResolve()方法避免反序列化对单例的破坏
    4.String如何保证equals()和hashcode()方法返回的结果一致?
    答:equals()方法中要进行hash值的判断,如果不相等直接返回false
    5.思考String的replace()的源码,为什么要这样写?
    答:首先char[] val = value; 即创建一个引用指向value是因为后面会频繁取value的值,即从堆中取,那么如果创建一个局部变量就会优化从栈中取,JDK里的注释是avoid getfield opcode。其次为什么源码中要先找出第一个oldchar的下标,这是因为如果不存在oldchar,那么不用创建一个新的数组,节省空间,这些都是对代码的细微优化。
    6.intern()是什么?什么情况下用?
    答:在JDK7之后,intern会首先到常量池查是否存在找该字符串,如果有直接返回;如果没有,那么将缓存值或者引用(new String().intern)到常量池中
        String s = new String("1") 会在堆创建一个对象,同时也会将字符串"1"放到常量池中
        String s = new String("1").intern(); 会在堆中创建一个对象,同时将该对象的引用放入到常量池中

        String s = "aa";//会在常量池中创建aa字符串System.out.println(s.intern()==s);//trueString s1 = new String("eragon");// 会在堆和常量池中都创建字符串eragonSystem.out.println(s1.intern() == s1); //false:s3.intern()返回的是是常量池中的eragonString s2 = new String("计算")+new String("机");//会在常量池和堆中分别创建字符串"计算"和"机"System.out.println(s2.intern() == s2);//true: s1.intern(),由于常量池没有计算机这个字符串,会将堆中的"计算机"的引用放入常量池(jdk1.7之后),// 所以返回的都是堆中的字符串"计算机"String s3 = new StringBuffer("ja").append(new StringBuffer("va")).toString();System.out.println(s3.intern() == s3);//false 因为java已经存在于常量池了,所以返回falseString s4 = new String("aaa") + "bbb";System.out.println(s4.intern() == s4);//true 同s2

7.通过什么方式可以对String进行修改?
    答:反射和UnSafe类

JDK源码阅读 String相关推荐

  1. jdk源码阅读-HashMap

    前置阅读: jdk源码阅读-Map : http://www.cnblogs.com/ccode/p/4645683.html 在前置阅读的文章里,已经提到HashMap是基于Hash表实现的,所以在 ...

  2. jdk javac运行不了_Intellij IDEA搭建jdk源码阅读环境

    一.找到源码位置 直接找到jdk安装的目录,会看到src.zip的压缩包,这里面就是jdk的源码,例如下图: 在这里解压. 第一次尝试建议使用9或更早版本jdk的源码,否则易造成卡死. 二.Intel ...

  3. jdk源码(jdk源码阅读顺序)

    如何在myEclipse中查看JDK源码 myeclipse中查看jdk类库的源码步骤如下: 1.点 "window"-> "Preferences" - ...

  4. Mac搭建JDK源码阅读环境

    点赞再看,养成习惯,微信公众号搜索[虚竹讲程序经],获取更多技术干货! 想要读懂JDK源码,需要在自己电脑上搭建JDK的源码阅读环境,正所谓,工欲善其事,必先利其器.下面演示如何在Mac上结合Idea ...

  5. JDK源码阅读-搭建阅读环境

    1.找到源码位置 其实我们安装jdk的时候源码就已经存在,只要找到jdk的安装位置,就能找到源码,如果不知道jdk具体安装位置的话,可以在idea中查看. 打开目录,找到路径下的src.zip,这就是 ...

  6. JDK源码阅读环境搭建

    内容来源 B站Up主: CodeSheep 视频: https://www.bilibili.com/video/BV1V7411U78L 感谢大佬分享学习心得 Thanks♪(・ω・)ノ~~~ 1. ...

  7. JDK源码阅读之路【不断更新】

    前言 为什么阅读源码? 学习设计模式和思维.总之,知道自己有多菜,在不断学习的过程中发现自身不足并弥补,才能进步. 如何阅读 阅读顺序参考:https://blog.csdn.net/qq_21033 ...

  8. JDK源码阅读--HashMap

    文章目录 核心部分 初始化 添加/移除元素 调试HashMap通过链表法解决hash碰撞 扩容 其他 核心部分 JDK版本: 1.8 几个重要的属性说明: size map中元素的个数,与map的容量 ...

  9. 死磕JDK源码之String

    String本质是对char数组的封装 Serializable接口 实现Serializable接口的类可以被序列化 Comparable接口 实现Comparable接口的类可以支持排序,需要重写 ...

最新文章

  1. Linux之加密及CA证书
  2. delete from inner join
  3. Apache 下更改 DocumentRoot 和新建虚拟目录
  4. maven 私服的使用及settings.xml的配置
  5. 计算机网络信息安全的含义,计算机网络信息安全内涵及其重要性
  6. Lucene实战之基于StandardAnalyzer读写索引
  7. Android焦点问题
  8. SAP CRM和Cloud for Customer的Account merge
  9. 如何在Windows 10上使用触摸板手势
  10. 训练日志 2018.12.2
  11. 用 JNI 进行 Java 编程(1)
  12. 二维码的实现原理和实现过程[纠错码编码]
  13. QT 自定义类访问UI控件的几种方法
  14. ansys添加力矩_ANSYS中加载力矩
  15. 苹果鼠标怎么连接_用手机连接鼠标和键盘的方法(安卓和苹果都可以)
  16. Map_Excise1
  17. 摩拜显示服务器忙,摩拜崩了?用户扫了5辆都失败 摩拜称APP出现短时故障
  18. Word表格外的第一个空行如何删除
  19. java map扩容机制_Java HashMap的原理、扩容机制、以及性能思考
  20. 【多目标进化优化】 MOEA 测试函数

热门文章

  1. select @@session.tx_read_only
  2. Echarts 设置面积区域图(areaStyle核心)
  3. CorelDRAW中内置的视频教程在哪里?
  4. 今天咱们用 Python 将 QQ 好友头像生成祝福语
  5. 如何做企业发布会直播/企业发布会直播流程
  6. android天女散花效果_星星点点的“六月雪”,3个摄影技巧,拍摄出天女散花的效果...
  7. 最美圣诞树!用Python画棵雪夜圣诞树送给你
  8. 开发app价格贵吗?三种app开发方式解析
  9. 一种 RTTI 的实现
  10. 工业经常使用的LDO芯片有哪些