在验证一个表单时,如果在服务器端验证提交过来的值,一般先通过request对象取值,然后验证,代码如下:
如果这样写是没有问题的,但是如果写成 if(val!=null) 结果就出问题了,结果总是true。
问题:""和null的区别是什么?null表示没有引用任何对象,那""呢是否是堆中的对象呢?
对此问题我编写了一段简单的代码进行了判断:
结果:s:nulls1:nulls2:s1==s:trues1==s2:falses2=="":trues3==s2:falses2.equals(s1):falses2.equals(s3):trueException 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,这样两种解释都行不通,那过程到底是怎样的呢?希望大伙都来讨论下。
Powered by: BlogJava Copyright © yuyu