01 int compareTo (String str)
按字典顺序比较字符串
是实现Comparable重写的方法
比较是基于字符串中各个字符的Unicode值
如果第一个相同,则比较后面的
相同输出为 0
02 源码
输出
6
-19
01 intern() 字符串入池
jdk6 中
如果字符串常量池中有 不会方法 返回已有对象的地址
如果没有 复制一份对象放入池中 返回池中对象的地址
jdk7及以后
如果字符串常量池中有 不会方法 返回已有对象的地址
如果没有 把堆中对象的地址复制一份 放入池中 返回池中的地址(此时池中的地址和 堆中对象的地址是一样的)
02 源码
是vative方法
03 实例一
入池时常量池中已经存在"a" 直接返回地址
输出
false
04 实例二
在jdk6中 输出结果为false
在jdk7及以后输出结果为true
在jdk6中 执行第一行代码会在堆中存在"ab"对象 然后调用intern()入池时会在池中创建一个新的对象 所以stringOne和stringTwo执行不同的引用
在jdk7及以后 执行第一行代码会在堆中存在"ab"对象 然后调用intern()入池时会把堆中对象的地址给常量 所以stringTwo的引用和stringOne的引用是同一个
输出
true
05 实例三
调用intern()时 返回的是stringTwo的地址
输出
false
true
06 实例四
jdk6 中 输出 false true
调用intern()时 字符串常量池中不存在"ab" 所有创建一个"ab"对象返回
jdk7及以后 输出 true true
调用intern()时 字符串常量值池创建一个引用地址 和堆中对象的一样地址是一样的
"ab"也就是字符串常量池的的地址 也就是stringTwo 也就是stringOne
stringTwo指向的和stringOne指向的是一样的
因为字符串常量池中已经存在 "ab"的指向了 就是stringTwo "ab"也就直接指向这引用了
所有stringTwo
输出
ture