在驗證一個表單時,如果在服務器端驗證提交過來的值,一般先通過request對象取值,然后驗證,代碼如下:
?










??如果這樣寫是沒有問題的,但是如果寫成 if(val!=null) 結果就出問題了,結果總是true。
問題:
""和null的區別是什么?
null表示沒有引用任何對象,那""呢是否是堆中的對象呢?
對此問題我編寫了一段簡單的代碼進行了判斷:

























結果:
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,這樣兩種解釋都行不通,那過程到底是怎樣的呢?希望大伙都來討論下。