JDK源码阅读 String
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相关推荐
- jdk源码阅读-HashMap
前置阅读: jdk源码阅读-Map : http://www.cnblogs.com/ccode/p/4645683.html 在前置阅读的文章里,已经提到HashMap是基于Hash表实现的,所以在 ...
- jdk javac运行不了_Intellij IDEA搭建jdk源码阅读环境
一.找到源码位置 直接找到jdk安装的目录,会看到src.zip的压缩包,这里面就是jdk的源码,例如下图: 在这里解压. 第一次尝试建议使用9或更早版本jdk的源码,否则易造成卡死. 二.Intel ...
- jdk源码(jdk源码阅读顺序)
如何在myEclipse中查看JDK源码 myeclipse中查看jdk类库的源码步骤如下: 1.点 "window"-> "Preferences" - ...
- Mac搭建JDK源码阅读环境
点赞再看,养成习惯,微信公众号搜索[虚竹讲程序经],获取更多技术干货! 想要读懂JDK源码,需要在自己电脑上搭建JDK的源码阅读环境,正所谓,工欲善其事,必先利其器.下面演示如何在Mac上结合Idea ...
- JDK源码阅读-搭建阅读环境
1.找到源码位置 其实我们安装jdk的时候源码就已经存在,只要找到jdk的安装位置,就能找到源码,如果不知道jdk具体安装位置的话,可以在idea中查看. 打开目录,找到路径下的src.zip,这就是 ...
- JDK源码阅读环境搭建
内容来源 B站Up主: CodeSheep 视频: https://www.bilibili.com/video/BV1V7411U78L 感谢大佬分享学习心得 Thanks♪(・ω・)ノ~~~ 1. ...
- JDK源码阅读之路【不断更新】
前言 为什么阅读源码? 学习设计模式和思维.总之,知道自己有多菜,在不断学习的过程中发现自身不足并弥补,才能进步. 如何阅读 阅读顺序参考:https://blog.csdn.net/qq_21033 ...
- JDK源码阅读--HashMap
文章目录 核心部分 初始化 添加/移除元素 调试HashMap通过链表法解决hash碰撞 扩容 其他 核心部分 JDK版本: 1.8 几个重要的属性说明: size map中元素的个数,与map的容量 ...
- 死磕JDK源码之String
String本质是对char数组的封装 Serializable接口 实现Serializable接口的类可以被序列化 Comparable接口 实现Comparable接口的类可以支持排序,需要重写 ...
最新文章
- Linux之加密及CA证书
- delete from inner join
- Apache 下更改 DocumentRoot 和新建虚拟目录
- maven 私服的使用及settings.xml的配置
- 计算机网络信息安全的含义,计算机网络信息安全内涵及其重要性
- Lucene实战之基于StandardAnalyzer读写索引
- Android焦点问题
- SAP CRM和Cloud for Customer的Account merge
- 如何在Windows 10上使用触摸板手势
- 训练日志 2018.12.2
- 用 JNI 进行 Java 编程(1)
- 二维码的实现原理和实现过程[纠错码编码]
- QT 自定义类访问UI控件的几种方法
- ansys添加力矩_ANSYS中加载力矩
- 苹果鼠标怎么连接_用手机连接鼠标和键盘的方法(安卓和苹果都可以)
- Map_Excise1
- 摩拜显示服务器忙,摩拜崩了?用户扫了5辆都失败 摩拜称APP出现短时故障
- Word表格外的第一个空行如何删除
- java map扩容机制_Java HashMap的原理、扩容机制、以及性能思考
- 【多目标进化优化】 MOEA 测试函数
热门文章
- select @@session.tx_read_only
- Echarts 设置面积区域图(areaStyle核心)
- CorelDRAW中内置的视频教程在哪里?
- 今天咱们用 Python 将 QQ 好友头像生成祝福语
- 如何做企业发布会直播/企业发布会直播流程
- android天女散花效果_星星点点的“六月雪”,3个摄影技巧,拍摄出天女散花的效果...
- 最美圣诞树!用Python画棵雪夜圣诞树送给你
- 开发app价格贵吗?三种app开发方式解析
- 一种 RTTI 的实现
- 工业经常使用的LDO芯片有哪些