null和空字符的区别:
1、NULL:代表声明了一个空对象,不是一个字符串,可以赋给任何对象。
空字符:代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。
2、String s=null; 只是定义了一个句柄,即你有了个引用,但是这个引用未指向任何内存空间。
String s=”“; 这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以可以对它操作。
String s=”a”和String s=new String(“a”);是有本质上的区别的 :
(1) 前者是在字符串池里写入一个字符’a’,然后用s指向它; 后者是在堆上创建一个内容为”a”的字符串对象。
(2) String str=”aaa”; //于栈上分配内存 ;
String str=new String(“aaa”); //于堆上分配内存
3、null的定义为(void *)0,也就是将0值定义为无类型的指针值,一个地址常数0,一般地址的数据宽度都是32位的,代表指针为空指针,无效指针,即没有指向任何地址,而地址是无符号整数。
4、'\0'空字符则是char类型的0值,char在C++中是单字节宽度的有符号整数(C#中是32位Unicode字符),所以null和空字符的区别是类型,而类型决定了数据宽度以及编码,虽然说0值在任何场合都是通用的,但是编译器在最终编译时需要确定数据宽度以及编码方式,指针是32位无符号整数(4字节,即0x00000000),而char是8位有符号整数(1字节,0x00)。
虽然你在C++中也可以像char c=null这样写,因为编译器会隐式转换,将(void *)转换为 char,也即将32位的0值截断,丢弃高位3字节,用低位的单字节赋值给char变量(否则就会覆盖冲掉到其他地址中的内容引起程序错误),但是为了可读性以及移植性,指针只用null,字符只用'\0',这样比较明确。
5、NULL说明:
1、等价于没有任何值、是未知数。
2、NULL与0、空字符串、空格都不同,NULL没有分配存储空间。
3、对空值做加、减、乘、除等运算操作,结果仍为空。
4、NULL的处理使用NVL函数。
5、比较时使用关键字用“is null”和“is not null”。
6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查。
7、排序时比其他数据都大(索引默认是降序排列,小→大),所以NULL值总是排在最后。