[] String类生成对象剖析

string是java中用的频率最高的类,可真正理解其内部对象创建机制的人不多,本文就将对其对像创建机制做个小小的总结,若有不对的地方还往各位资深人士多多指教。。。

1.string类是final的,所以你不可能通过面向对象的多态机制去重载或者重写他的方法。

2.string对象被设计成immutable,被创建后的对象原则上是不能被改变的,一个唯一的办法就是通过java的反射机制去改变string对象的值,但这样往往存在着一些隐患,比如你重新赋值后的value值超过本来string对象的长度,将得不到你理想的结果,所以原则上是不提倡去改变string对象的值。

3.在jvm规范中,明确所有的java类都维护了一个叫做常量池的数组用以存储class中各种常量,string constant赫然在列,所以在创建java对象时首先是在常量池中创建一个string对象,如果采用new string("abc"),那么在常见一个常量池中的string对象之后,将这个对象拷贝一份,放到heap里,所以上面的语句创建了两个string对象,当然jvm会先探测常量池中是否已经存在这个对象!

4.在对string对象进行比较的时候,==比较内存地址,equals比较string对象中字符数组的真正内容,

5.在对string对象调用hashcode的时候,只有在第一次调用的时候生成唯一的哈希值,再次调用hash值将不会重新生成,所以你在通过反射机制改变对象的值的时候不会重新为该对象设置新的hash值

6.实例

string s = "hello";  string s1 = "hello"; if (s==s1){      system.out.println("equal without new operator");  }  //你也许会觉得equal without new operator永远不会被打印,因为==比较的pointer本身而不是value,但由于jvm处理不带new创建string时的重用已经创建好的相同值的对象,所以s==s1是返回true的string t = new string("hello");  string u = new string("hello"); if (t==u){      system.out.println("equal with new operator");   }output:equal without new operator//new强制创建了两个不同的对象,虽然value一样
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值