在驗證一個表單時,如果在服務器端驗證提交過來的值,一般先通過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