Java学习笔记21:””与null的区别、常量池的理解

””与null的区别

“”是字符串常量,同时也是一个String类的对象,作为对象可以调用String类里的方法。

null 是空常量,不能调用任何的方法,否则会出现空指针异常,null常量可以给任意的引用数量类型赋值。

String str1 = null; str引用为空
String str2 = ""; str引用一个空串

也就是null没有分配空间,""分配了空间,因此str1还不是一个实例化的对象,而str2已经实例化。

注意因为null不是对象,"“是对象。所以比较的时候必须是 if(str1==null){…}和if(str2.equals(”")){…}。

对象用equals比较,null用等号比较。因此,如果str1=null;
下面的写法错误:

if(str1.equals(" ")||str1==null){
//如果str1没有值,则.... //。。
} 

正确的写法是:

 if(str1==null||str1.equals(" ")){ 
 //先判断是不是对象,如果是,再判断是不是空字符串 //...
  }

打个比方:一个空玻璃杯,你不能说它里面什么都没有,因为里面有空气,当然也可以把它弄成真空,null与" "的区别就象真空与空气一样。

常量池的定义

常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = “java”这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。

所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。

而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。

常量池的优缺点
常量池的优点
常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。
例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
(1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。
(2)节省运行时间:比较字符串时,比equals()快。对于两个引用变量,只用判断引用是否相等,也就可以判断实际值是否相等。

常量池的缺点
如果硬要说弊端的话,就是牺牲了CPU计算时间来换空间。CPU计算时间主要用于在字符串常量池中查找是否有内容相同对象的引用。不过其内部实现为HashTable,所以计算成本较低。

常量池的使用场景
Integer的实现中,当大于等于-128小于等于127的Integer实例,在常量池中保存的。
//TODO 需要看下JDK中常见的使用常量池的地方都有哪些.

参考文章
http://www.cnblogs.com/iyangyuan/p/4631696.html
http://www.jianshu.com/p/c7f47de2ee80
http://baike.baidu.com/item/常量池

猜你喜欢

转载自blog.csdn.net/qq_30242987/article/details/85695200