首页 > 代码库 > 第一章 关于String的一些

第一章 关于String的一些

  • ==与equals()
  • equals()与hashCode
  • equals()与intern()
  • StringBuilder.append()与String的“+”
1.==比较2个内存单元的内容是否一样。基本类型如byte,int,char等就是直接比较它们的值。引用类型比较引用的值,即对象的逻辑地址,比较引用的2个对象是否为同一个对象。
2.equals方法在Object类中定义,其设计的初衷就是为了子类去重写它,如果子类没有重写则等同与==。
重写equals方法的目的是为了根据实际的目的来比较2个对象,很多时候来判断2个对象是否一致并不需要完全相同,只要根据需要的属性比较即可判断相似性。比如String类重写了equals方法,2个字符串对象内容相同则为true.
3.hashCode方法是为了算法快速定位数据而存在,equals则是为了比较值。要理解hashCode方法,要知道算法操作的其实是数字,hashCode方法将对象标识为数字对象进而能进行算法运算,Java中的许多集合操作则建立在这个基础之上。理解了散列表,对于理解hashCode方法就容易了,hashmap也是一个道理,不同对象可能产生相同的hash值,这取决于方法的实现,应当尽量将hash值分散提高效率。
4.intern方法调用时,jvm会在常量池中通过equals方法查找是否存在等值的String,存在则直接返回这个对象地址,没有则创建这个等值的字符串再返回这个新建的地址。什么地方可能用到intern方法呢?比如有一些固定的字符串要经常比较,像数据库的数据类型,当要检测每个表的列的类型时,可以以intern方式直接放到常量池,在后面的比较中就不用equals了,直接==比较。
5.关于+和StringBuilder.append两种字符串拼接方式的说法有很多,但是性能好坏要具体实际情况分析,在拼接过程中,将扩容的消耗降到最低就是比较好的方法了。
+拼接字符串会产生新的StringBuilder对象,最后再调用toString方法返回String对象,在拼接的过程中,除了新对象所占有的内存外,还要考虑StringBuilder对象扩容所消耗的内存,考虑这样一种情况,在循环体没拼接字符串,就会产生许多的对象,大量内存空间被占用,导致频繁的GC。

第一章 关于String的一些