推荐你们使用字符串直接赋值

 在四海学的时候,可能须要咱们通过沉淀才会去想一些事情,有的时候不知道为何这样或者那样的时候,从今天看是,小王老师打算给你们开辟一个课程,就是个人读书笔记。安全

首先咱们来认识一下String字符串
通常对象都是经过new关键字生成的,可是String还有第二种生成方式,也就是咱们最常常使用的直接的声明方式,好比 String str= "shxt"【建议写法等号两端空格】,便是经过直接量"shxt"进行赋值的。对于String对象[String不是基本数据类型]来讲,这种方式是极力推荐,但不建议使用new String("不推荐")的方式赋值,为何呢?小王老师来给你分析一下缘由:
public class myTest{
public static void main(String[] args){
String str1 = "小王老师";
String str2 = "小王老师";
String str3 = new String("小王老师");
String str4 = str3.intern();
//两个直接量是否相等
boolean b1 = (str1==str2);
//直接量和对象是否相等
boolean b2 = (str1==str3);
//通过intern处理后的对象与直接量是否相等
boolean b3 = (str1==str4);
}
}
注意上面的代码,咱们使用"=="判断的是两个对象的引用地址是否相同,也就是判断是否为同一个对象,打印的结果是true,false,true 。前两答案咱们仍是好理解,两个直接量是同一个对象(通过intern处理后的String对象与直接量是同一个对象),可是经过new生成的对象却与之不相等,
缘由何在?
缘由是Java为了不在一个系统大量使用String对象(为何会大量产生?由于String类型是咱们最常常使用的),因而就设计了一个字符串池(也叫字符串常量池),在字符串池中所容纳的都是String字符串对象,它的建立机制就是这样的:建立一个字符串的时候,首先检查字符串池中是否有字面值相等的字符串,若是有,则再也不建立,直接返回字符串池中该对象的引用,若没有建立之,而后放到字符串池中,并返回新建对象的引用。
那么为何使用new String("小王老师")就不相等呢?由于直接声明一个String对象是不检查字符串池的,也不会把对象放到字符串池中,那固然使用"=="为false了。
那么为何使用intern方法处理后就又相等了呢?由于intern会检查当前的对象在字符串池中是否有字面量相同的引用对象,若是有则返回字符串池中的对象,若是没有则放到字符串池中,并返回当前对象。
---------------------------------
对象方法字符串池中会不会产生线程安全问题?好问题吧,我想也是,可是我猜各位四海的学生历来未曾考虑过,由于这些不须要咱们考虑,Java已经帮咱们考虑好了,String类是一个不可变对象,这个不可变含有两层意思:一个是String类是final类,不可继承,不可能产生一个String的子类;二是在String类提供的左右方法中,若是有String返回值,就会新建一个String对象,不对原对象进行修改,这也就保证了对象是不可变的。
那么,放到字符串池中,是否是须要考虑垃圾回收问题呢?不用考虑了,虽然Java的每一个对象都保存在堆内存中,可是字符串池很是特殊,它的编译期已经决定了其存在JVM【虚拟机】的常量池,垃圾回收器是不会对它进行回收的。
-----------------
综上所述:咱们发现Java在字符串的建立方面确实提供了很是好的安全机制,利用字符串池不只能够提升效率,同时减小了内存空间的占用。
开发中使用直接量赋值方式[推荐]
除非确有必要才新建一个String的对象
相关文章
相关标签/搜索