java中的null的剖析

PS: 

     判断对象是否等于null,if( null == 对象|| 对象.变量.equals(""))

     判断字符串是否为空的三种方法: if(null==str||str.length()==0) (首选)
                                                            if(null==str|| str.equals(“”));                           

                                                            if(null==str||str.isEmpty());

(一) java中的null的学问剖析

一、null是代表不确定的对象 

     Java中,null是一个关键字,用来标识一个不确定的对象。

                  因此可以将null赋给引用类型变量,表示该引用变量没有引用任何对象。  但不可以将null赋给基本类型变量。 

              但null值可以强制转换为任何java类类型。


比如:int a = null;是错误的。Ojbect o = null是正确的。 

Java中,变量的适用都遵循一个原则,先定义,并且初始化后,才可以使用。我们不能int a后,不给a指定值,就去打印a的值。这条对对于引用类型变量也是适用的。 

有时候,我们定义一个引用类型变量,在刚开始的时候,无法给出一个确定的值,但是不指定值,程序可能会在try语句块中初始化值。这时候,我们下面使用变量的时候就会报错。这时候,可以先给变量指定一个null值,问题就解决了。例如:   
Java code 
Connection conn = null;        
      try {            
             conn = DriverManager.getConnection("url", "user", "password");        
           } catch (SQLException e) { 
                     e.printStackTrace();        
          }        
          String catalog = conn.getCatalog(); 



如果刚开始的时候不指定conn = null,则最后一句就会报错。 

二、null本身不是对象,也不是Objcet的实例。null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。可以做一个简单的例子:   


//null是对象吗? 属于Object类型吗?   
Java code 
      if (null instanceof java.lang.Object) {            
      System.out.println("null属于java.lang.Object类型");  
      } else {            
          System.out.println("null不属于java.lang.Object类型"); 
      } 


结果会输出:null不属于java.lang.Object类型 

三、Java默认给变量赋值 


  在Java的类中(j见thinking in java),定义变量的时候,如果定义后没有给变量赋值,则Java在运行时会自动给变量赋值。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各供引用类型变量自动赋值为null。 
这个具体可以通过调试来看。 

四、容器类型与null 


    List:允许重复元素,可以加入任意多个null。

    Set:不允许重复元素,最多可以加入一个null。

    Map:Map的key最多可以加入一个null,value字段没有限制。

    数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。

               引用类型数组,不给定初始值,则所有的元素值为null。 


五、null的其他作用 


1、判断一个引用类型数据是否null。 用==来判断。 

2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。 


六、JAVA中null,"",equals,==相互之间使用详解(判断引用类型是否为null,最好用==


  1、      equals只是比较值是否相同 ,Hashcode是看这两个变量是不是引用的同一个地址

  2 、     ==则是比较两个变量 是不是同一个变量,也应时是说 要看看这两个变量是不是引用的同一个地址。java 中只有引用地址相同的两个变量才被视为== 


如果明白值传递与地址传递的话,这个问题应该不难理解 

 <a href="http://blog.csdn.net/wenzhibinbin_pt/article/details/8940271">Java中 hashCode-equals的完全理解</a>

 3、a==null与 null==a 

   null放在前面就是为了避免变量为空时 引了空指针异常 
   如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了 

if(str==null||str.equals("")){ 
return 0; 
因为在java里,String是一个对象,如果对象不存在,就返回0,或对象存在,但包含的字符为"",也返回0,上面那if就是这个意思了。 

我遇到过一种情况,就是从后台String xsvinm = (String) request.getParameter("xsvinm"); 

如果,xsvinm 为空,就是没有值,注意不是为“”那传到前台页面,xsvinm="null", 

则 

xsvinm==null 是false , 

xsvinm.equals("null") 是true 

注意 xsvinm.equals(" ") 是false 

七、String 类 中 : ==、equals、null (String中判断来个字符串是否相等,首推用equals

                                                                                          (    基本类型判断是否相等,首先用==                     

1、String 的==与equal() 

在对字符串的相等判断,==判断的是地址是否相同,equal()判断的是字符值是否相同。大多数时候==跟equal()的结果都是相同的。这是因为String对象是不变模式的,如果你不是明确地new一个String对象,Java对于String对象的保存默认的是会把新生成的String 对象放到一个缓冲区,然后每次判断缓冲区中是否已经有了这个对象,如果有了,那么后建立的同样字符值的String对象也会指向最初建立是该字符值对象的地址。也就是说字符值相同的时候,大多数情况下地质也是相同的。==与equal()效果是相同的。但是当对象是str = new String(“abc”)生成的而不是直接str = “abc”这样赋值生成,或者经过了一些字符串连接处理,或者通过StringBuffer等对象生成,都会在内存中开辟新的地址的这个时候==和 equal()结果是不同的。 

是不是稍微有些复杂?这里需要一些关于内存,堆栈,对象保存方面的理解。我不想纠缠于这个问题的讨论。如果不能理解,那么只要记住如果你想要判断两个字符串的字符值是否相等,没有别的要求的时候,那么请使用equal()而不是==,至于什么时候需要使用==,我想当你需要的时候,你自然就会明白了。实际上,对于字符串的判断,我们很少需要用==的。 

     

   ==是用来判断对象句柄地址的。说明s还未定义内容。此时,谈不上是否为空。     
      equal是用来判断句柄内容的。   
   “ ==” 想要实现equal的效果可以使用这样 :   s.intern=="".intern


2、关于str.equal(“abc”)和”abc”.equal(str) 


这个好像争论也挺多的,第一种常量写在后面可能符合大多数人的习惯,也符合我们的逻辑思维。但是需要多一个str是否为null的判断。否则这里是有可能出现异常的。而后一种写法不需要多做关于是否为null这个判断。就我个人喜好来说,比较喜欢后一种写法。 

3、关于String的null 

/** 
* 测试java的String为null 的情况 
* create date:2009-6-3 
* author:Administrator 

*/ 
public static void testNull(){ 
String a= null,b = null,c="呵呵"; 
System.out.println(a == null); 
System.out.println(a+b+c); 

方法运行结果: 
true 
nullnull呵呵 
所以大家要注意了做字符串合并操作时,别忘记判断null,否则结果会不太让你爽啊 

八、null使用学问 

&&短路:deptid!=null&&!deptid.equals(""))默认分类 2006-08-30 11:29:48 阅读1 评论0   字号:大中小 订阅 . 

情况: 
这样写就不会出错!: 
String deptid = (String) ctx.getParameterMap().get("deptId"); 
if(deptid!=null&&!deptid.equals(""))//如果有动态选择部门 

这样写就会出错!: 
String deptid = (String) ctx.getParameterMap().get("deptId"); 
if(!deptid.equals("")&&deptid!=null)//如果有动态选择部门 

原因分析:因为&&会短路,当deptid为null时,首先遇到deptid!=null的判断是可以比较的,但是如果是先遇到 
deptid.equals(""),则不能比较,便会出错! 

解决: 
     所以以后要先判断取得的值deptid ,到底是可以和哪个比较,就把哪个放在最前面,只有当前面哪个通过了,才会检测第二个! 
通常写法:把deptid!=null放置最前面,先判断其是否为对象,然后如果是对象了才能比较其内容, 

即!deptid.equals("")!

九 Java中判断String为空的三种方法:    

str==null   ||   str.equals(""))    (注意顺序)
  再澄清一个概念:   
    如果str==null说明str还未定义内容。此时,谈不上是否为空。     str="",说明str是个空字符串。只不过长度为0。

------------------------------------------------------------------------------------------------------

String   s;   
  ...   
  if(s==null)   
  {   
    //为null;   
  }   
  if   (s.equals(""))   
  {   
  //为空字符串;   
  }   
  if   (s.length()==0)   
  {   
  //为空字符串;   
  }   
  ==是用来判断对象句柄地址的。说明s还未定义内容。此时,谈不上是否为空。     
  equal是用来判断句柄内容的。   
 “ ==” 想要实现equal的效果可以使用这样 :   s.intern=="".intern

  ------------------------------------------------------------------------------------------------------

    总结起来: 

   法一: (s==null|| s.equals(""))
   法二: (s==null|| s.length()==0)
   法三: (s==null || s.isEmpty()) 


方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法.
方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二.

方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低.


(二)  Java中对应 if(true==a) 和 if(a==true) 区别的代表性回复

对于Java,两种书写方式都是不推荐的,sun编码规范里 if (condition) { statements; } 以及 while (condition) { statements; } 才是标准的书写方式, 另外尽可能少的使用Boolean.在大多数情况下boolean基本类型就足够.如果一定要使用Boolean,那么请注意初始值和空值问题. 一旦Boolean型对象的值为null,三种书写方式都会抛出NullPointerException.实际上某猫工作一年多,从没碰上必须使用Boolean的情况,假如碰上了,请注意if( a!=null && a ),并且针对null做处理. Java和js以及c++不同,在js和c++里任何值都可以做条件表达式的结果,哪怕是undefined. 但是Java的语法严格限制:条件表达式的结果必须是true或者false,因此没必要加上==ture,==false的判断. 在推荐贴if(true==a) 和 if(a==true) 的区别里,很多回复的朋友都没有注意遵循通常的编码规范,所以单发这一贴说明一下. 这是个人的理解,以交流为目的,不是高考标答,也许会有错误,如果有说错的地方欢迎大家指出.
 
这里选了一些有代表性的回复:
1.if(true==a)是两个变量之间的比较,if(a==true)是变量a是否为真的判断!不知这样说可否.. true是关键字,不是变量,不存在"两个变量"
 
2.根据java代码的编写规则 是不允许写if(a==true)这样的代码的。Java中Boolean值的判定

         正确:if(a) or if(!a). 编码规范都推荐的if(a)或者if(!a)的方式,无论是sun还是IBM
 

3.以我在项目中经验,这两个区别我们在项目中推荐使用true==a,是为了防止有人漏写一个=号,做这种判断时定值放在前面少写=号会报编译错,而反过来写就不会,导致结果出错后还不容易调试出来。 老大要是看到某在公司里这么写Java代码,就离裁员不远了
 
4.效果上没区别 只是 a==true, 常会被误写成 a=true (赋值表达式),从而导致bug,并且不容易看出来 所以一般写程序的时候,是把常量写在前面的, 即 true==a 如果错写成true=a(赋值表达式)的话,是编译不过的 只是利用编译器,避免一些低级bug而已 写为if(a)就不会漏写=了---压根不去写它,当然不会写漏.如果是其他类型比较,比如a是一个int,错写为if(a=1)会因为值不为布尔类型而无法通过编译.
 
5.一般来说 a ==b 和b==a 结果程序肯定会认为是一致的 这个要求用户自己实现objet父类中的equals方法 而这个方法要求用户实现时必须满足等价关系,这个属于等价关系中的 自反性 ==比较与任何方法或对象无关,它是由JVM完成的,注意不要和equals之类的方法调用混淆了
 
6.我也是慢慢地习惯"abc"==a 这种写法了,字符串内容比较请使用equals
 
7.在写代码的时候为了避免手误,把“==”(判等)敲成“=”(赋值)引起错误,推荐采用 if(常量 == 变量) 的模式。 但这个模式一般不用在 java 中,而是在 C++ 或 c 中。因为 java 中如果用IDE的话,会直接给出提示,没有用IDE也会在编译时报错。 非常同意喵.Java的使用者也许对c++陌生,但是js应该熟悉吧,js里使用if(true==a)或者if(true===a).这个习惯貌来自c,不过对于Java,if(a)足够了
 
8.尚学堂在讲这个问题的时候的确讲的是对的,楼主不去听听看看,就胡下定论。记住:科学是严谨的,就算有培训的地方有错误也很是正常,如果没错误,还要我们这些程序员干嘛! sxt没看过,但是同意"记住:"之后的话,不但是培训,百度,论坛,blog,甚至文档里都可能有错.幸可音佳娃一文刚面世,被网络上的朋友挖出了一摩尔的bug,用作者的话就是"指出了许多文章中的问题
 
9.if(true==a)有时候这种判断之所以把变量放后面是为了防止空指针异常,因为如果a为null的话把a放前面就会报空指针异常,而放后面不会。代码是从前往后执行的 假如a为Boolean类型并且值为null,那么就算竖着写也避免不了NullPointerException,必须写为if( a!=null && a ),所以Boolean包装类极为少见
 
10.我认为还是有区别的,就像 if(null!=a){}和if(a!=null){} 这个真没什么区别.如果a是基本类型,两种顺序都通不过编译,如果a是对象,两种顺序都不影响结果

参考:

  1 http://quningstudy.iteye.com/blog/983534

 2 http://blog.csdn.net/easonx1990/article/details/7887951

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值