posts - 10, comments - 4, trackbacks - 0, articles - 1

由String中null和""的区别所想到的?

Posted on 2006-06-06 08:14 yuyu 阅读(1500) 评论(1)  编辑  收藏

在验证一个表单时,如果在服务器端验证提交过来的值,一般先通过request对象取值,然后验证,代码如下:

 

String val  =  request.getParameter( " val " );
   
if (val != "" ) {}
   
else {}


  如果这样写是没有问题的,但是如果写成 if(val!=null) 结果就出问题了,结果总是true。

问题:
""和null的区别是什么?
null表示没有引用任何对象,那""呢是否是堆中的对象呢?

对此问题我编写了一段简单的代码进行了判断:

public   class  TestNull {
  
static  String s;
  
public   static   void  main(String args[]) {
     String s1
= null ;
     String s2
= "" ;
     String s3 
=   new  String( "" );

     System.out.println(
" s: " + s);
     System.out.println(
" s1: " + s1);
     System.out.println(
" s2: " + s2);
     System.out.println(
" s1==s: " + (s1 == s));
     System.out.println(
" s1==s2: " + (s1 == s2));
     System.out.println(
" s2==\ " \ " : " + (s2 == "" ));
     System.out.println(
" s3==s2: " + (s2 == s3));
     System.out.println(
" s2.equals(s1): " + s2.equals(s1));
     System.out.println(
" s2.equals(s3): " + s2.equals(s3)); 
     System.out.println(s1.equals(s2));   
// throw  java.lang.NullPointerException
   }
 
}


结果:
s:null
s1:null
s2:
s1==s:true
s1==s2:false
s2=="":true
s3==s2:false
s2.equals(s1):false
s2.equals(s3):true
Exception in thread "main" java.lang.NullPointerException
        at TestNull.main(TestNull.java:17)

在这里我们可以很清楚的看到""和null的区别了。
""的确是不同于null的,从""可以使用equals()方法我们可以清楚的认识到""是一个堆中值。

在以上程序中s2和s3用"=="来判断得到的结果是false,道理很简单,因为它们的地址是不一样的。但发现用s2==""的结果是true,以次类推,我们使用if(val!="")的时候,先用的是赋""值给val,然后利用val!=""来判断。

由于对jvm不是特别熟悉,所以对String 的存储总是感觉有问题,String既有值变量的一些特征(只要不new就可以用"=="判断)又有引用变量的一些方法(利用equals()判断),所以希望大伙讨论下。

我猜想过程是这样的,当String s="abcde"的时候,并不是在堆中新开辟空间,而是在栈中开辟,只有这样当我们才能方便的使用"==",并且当我们再赋值String s1="abcde"以后s1==s为true。但是这样问题来了,equals()是比较对象的,现在的s,s2根本就不是对象了。着就出现了一个矛盾。
如果反过来String s="abcde"是在堆中的话,那么当我们String s1="abcde"的时候应该是先在堆中找值为"abcde"的对象,如果没有、新建,如果有将对象地址给s1。那么如果我们先String s3 = new String("abcde")然后再String s1="abcde"的话,s1==s3应该为true,但是并不是这样的。很遗憾s1==s3为false,这样两种解释都行不通,那过程到底是怎样的呢?希望大伙都来讨论下。

Feedback

# re: 由String中null和""的区别所想到的?  回复  更多评论   

2011-07-11 11:02 by pkl
Java虚拟机会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象 也就是String s="abcde"和String s1="abcde"是相同引用到 "abcde"
但是String s3 = new String("abcde")创建的"abcde"不会在这个列表里,所以String s2 ="abcde"的时候会找不到已有的而创建新的"abcde"

只有注册用户登录后才能发表评论。


网站导航: