• java中的null和""区别------&&与&的区别


     

    (1)问题一:
    null和""的区别
    String s=null;
    string.trim()就会抛出为空的exception 
    String s=""; 
    string.trim()就不会抛,

    为什么?


    答:
    NULL:代表声明了一个空对象,不是一个字符串,可以赋给任何对象。  
    ""     :代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。

    String s=null;  只是定义了一个句柄,即你有了个引用,但是这个引用未指向任何内存空间 
    String s="";    这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它操作。

    (2)问题二:

    String s1;             //分配了一个内存空间,没存入任何对象 

    String s2=null;   //null是未分配堆内存空间

    String s3="a";   //分配了一个内存空间,存了一个字符串对象

    out.println(s1);  //   出现异常

    out.println(s2);  //    输出null

    out.println(s3);  //    输出“a”

    答:

    主要要理解的是String s; s为一个引用~~它不是对象 
    第一个是没有初始化的引用; 
    第二个为空引用;
    第三个是在字符串池里写入一个字符'a',然后用s指向它。
    另外, 
    String s="a"和String s=new String("a");是有本质上的区别的 :

    (1)
    前者是在字符串池里写入一个字符'a',然后用s指向它;
    后者是在堆上创建一个内容为"a"的字符串对象。

    (2)
    String str="aaa"; //于栈上分配内存
    String str=new String("aaa"); //于堆上分配内存

    (3)问题三:
    String a;

    if(a=="")  //编译阶段即异常  

    String a = null;

    if(a==null)  //返回true

    答:
    在实际处理时,往往认为""和null代表相同的含义,即都代表无值。 
    此时建议用如下语法: 
    if(a==null || a=="") 
    {
    } 

    这就是为什么验证用户名是否为空的时候,先写null在前,然后在判断"".

    username!=null && !username.equals("");

    如果为null,表示连内存空间都没有,就不用判断是否有空字符串了。这个顺序是不能交换的,否则会出现空指针的异常。
    如果a为null,就不会执行后面的判断,直接返回true。

    null:是用来判断引用类型是否分配了存储空间 
    ""  :是针对字符串的; 

    下面说下:&&与&的区别:

    &运算符有两种用法:按位与,和逻辑与

    &&运算符是短路运算:即如果&&左边的表达式的值为false,则右边不用判断,即直接右边的表达式被短路掉了,不进行运算了。

    用法:很多时候我们用的最多的是&&短路与。

    另外注意:或运算:|与||也是这个区别。||这个运算符即表示左边的表达式正确了,右边的就不用判断了。


    (4)问题四:

    String s;在什么情况下可以等同于String s=null;而在什么情况下又不等同?
    考虑下面的代码:

    复制代码
    1 //StringTest.java 
    2 public class StringTest { 
    3     
    4     static String s; 
    5     
    6     public static void main(String[] args) { 
    7         System.out.println(s);   //输出null
    8 } 
    9 }    
    复制代码

    编译并运行上面的代码,将打印null。
    s是自动初始化了的(s被自动初始化为null)。 
    由此得出结论:
    在成员变量的定义中,String s;等同于String s=null;
    而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值。
    还有一点要说明的是:
    只要是在方法在中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器会自动赋初值。

  • 相关阅读:
    c# 三元运算符 表达式赋值的时候 我老容易写错 备注下
    wpf 图片操作类 ImageBrush BitmapImage
    WPF 结合 微软的手写板 进行输入
    c# 经纬度距离计算
    c# 通用类扩展方法 备注
    Android SDK Manager无法更新的解决(转帖)
    GridControl相关设置
    SDK Manager.exe运行一闪而过
    “LC.exe”已退出 或者 设计器提示控件为声明
    建立管理员帐户
  • 原文地址:https://www.cnblogs.com/fengli9998/p/6654660.html
Copyright © 2020-2023  润新知