一.null的概念
首先,null是java中的关键字,大小写敏感;
int类型默认值为0,boolean类型默认值为false,null是任何引用类型的默认值,
null既不是变量,也不是类型,也不是java.lang.Object的实例,它是种特殊的值;你既可以将它赋给任何引用类型,也可以将它转化为任何引用类型;
如果使用了带有null值的引用类型变量,instanceof操作将会返回false。
二.使用null
判断一个引用类型是否为null,一定用“==”来判断;
对一个引用型变量赋值null,如果只有一个引用型变量指向这个对象,则这个操作会让这个原本指向的对象无法被使用,使之等待虚拟机去回收;
null用来判断引用变量是否分配了空间;
在成员变量中,string s,将自动赋初值为null;
在方法变量中,string s则不会这样,必须显式赋初值;
三.null与“”的区别
null是什么都没有,一个引用变量指向null,表示指向空,而“”表示内容为空,根本差别是null没有地址,没有分配内存,而“”有地址,分配了内存,只是没有内容;
你不能对一个值为null的引用对象进行任何操作,而“”是一个实例,有自己的对象空间。
null表示还没new出对象,就是还没开辟空间,指向的对象没有空间,是空的,而“”表示new出了对象,但是这个对象装的是空字符串。
一般推荐使用String s=“”;来初始化字符串变量
string a=null;//赋初值为null,a为空引用
string b;//没赋初值,使用时会报错,b为没有初始化的引用,分配了内存空间,但是没有存入任何对象
string c=“”;//分配了内存空间,存储了一个字符串对象,在栈上;
string d=new String(“123”);//在堆上分配空间
四.顺便说说String
String a=“”;
String b=“”;
a和b将指向同一个内存地址,即“”的内存地址;
String类维护着一个字符串池,像上面的赋值语句,会让StString在字符串池中寻找是否它已经在字符串池中,如果在,将引用变量指向该块内存;如果不在,生成一个实例 放入字符串池中,并指向它。
String a=new String(“”);
String b=new String(“”);
此时,a和b指向不同的地址,堆上;
五.容器与null
List:允许重复元素,可以加入任意多个null。
Set:不允许重复元素,最多可以加入一个null。
Map:Map的key最多可以加入一个null,value字段没有限制。
数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。
import java.util.HashMap;
import java.util.Map;
/**
* An example of Autoboxing and NullPointerExcpetion
*
* @author WINDOWS 8
*/
public class Test {
public static void main(String args[]) throws InterruptedException {
Map numberAndCount = new HashMap<>();
int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
for(int i : numbers){
int count = numberAndCount.get(i);
numberAndCount.put(i, count++); // NullPointerException here
}
}
}
public class Testing {
public static void main(String args[]){
Testing myObject = null;
myObject.iAmStaticMethod();
myObject.iAmNonStaticMethod();
}
private static void iAmStaticMethod(){
System.out.println("I am static method, can be called by null reference");
}
private void iAmNonStaticMethod(){
System.out.println("I am NON static method, don't date to call me by null");
}
输出:
I am static method, can be called by null reference
Exception
in
thread
"main"
java.lang.NullPointerException
at Testing.main(Testing.java:11)
后两小节内容参考以下两篇文章:http://lavasoft.blog.51cto.com/62575/79243/和http://www.importnew.com/14229.html