序言
一直在看java的一些知识,使用到最多的是String,但是在工作中,很少去关注在使用String的时候其内存分配的方式,写的时候的效率问题。好了,废话不多说,开始,欢迎 广大爱好者分享。
String对象
在Java中,String对象时一个不可变的对象,在检查源码的时候会发现一些结果。
查看String的源码会发现,它是一个final对象,在最低层使用的final修改的一个char数组实现的,所以,string对象是不可变的。
使用
那么在使用的时候,有啥子区别呢,看图
帅气的你是不是知道答案了呢,==和equals的区别是什么?
对答案就是
对,就是这样的,==运算是姑且是比较两个对象的内存地址是否相同 ,而equals是比较的内容(在重写equals时需要重写hashcode方法,为什么?)。在Jvm第一次遇到String的时候,会专门去内存里面开辟一片区域出来,存放String对象,叫做String池。当遇到"hello"的时候,JVM会去String区域里面检查是否有"hello"对象,没有,则创建一个返回,然后返回给引用,如果有,则直接把这个对象返回。所以==和equals都是true。相信你已经知道了吧,s和s1指向的都是同一个对象。
然后下面这种情况呢?
对,没错,是不是喜欢这样写,没注意到呢,聪明的你是不是知道了?
你的答案是不是一样呢,为什么呢?
因为JVM遇到"hello"的时候会像上面那种情况一样,new String("hello")里面的"hello"会去String池里去找,如果有,就返回,没有就创建了返回,问题就出在前面的那个new上面,JVM会在内存上创建一个Strng对象返回,所以内容一样,但是内存却不一样了。
所有,hashcode一样,但是不一定是同一个对象,但是如果是同一个对象,hashcode必定一样。
总结
打完收工。
在使用String的时候,尽量避免使用new运算符。