第一章 关于String的一些
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一章 关于String的一些相关的知识,希望对你有一定的参考价值。
- ==与equals()
- equals()与hashCode
- equals()与intern()
- StringBuilder.append()与String的“+”
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的一些的主要内容,如果未能解决你的问题,请参考以下文章