Java - String compare by intern method

最近在寫簡易的JSP Web,先實作了一個註冊頁面,而當我在檢查這個account是否有人

使用時,若已有人使用,我會使用jsp tag forward返回前一頁,並且會將我之前填過的資料

帶出來。

我在其他欄位的部分是這樣寫,如下:

<input type="text" name="acc" size="16" value="<%= request.getParameter("acc") == null ? "" : request.getParameter("acc") %>">

這一段可以帶出我之前所填account column,此時我就可以知道我之前填啥!

但是,若我們選擇了一個radio時,在返回時已幫我們選擇了之前選的,此時我一開始

這樣寫,如下:

<input type="radio" name="gender" value="1" <%= request.getParameter("gender") == "1"  ? "checked" : "" %>>

這一段一直會跑到進入 :,即使我前一頁填的是1,forward之後還是印出""


後來才發現原來是String Pool的問題,由於 "1"這個物件存在於String Pool中,假設我們利用

request.getParameter("gender") 去跟它比較,即使知道request.getParameter("gender") 的值是"1",

但它也不會去String Pool中找是否已存在"1"的物件,而自己另立了一個,導致兩個是不同的

物件。如果您堅持還是要使用==去比較的話,可以改寫成如下:

<input type="radio" name="gender" value="1" <%= request.getParameter("gender") == null  ? "" : request.getParameter("gender").intern() == "1" ? "checked" : "" %>>

那麼intern()就會先去檢查String Pool內是否已有存在的"1"物件,有的話就直接引用

也可以直接使用equals去判斷是否值相等,這樣就不用考慮object address是否相同

<input type="radio" name="gender" value="1" <%= request.getParameter("gender") == null  ? "" : request.getParameter("gender").equals("1") ? "checked" : "" %>>

而請注意要使用了兩個 ? : 是因為必須先檢查object是否為null,否則會exception。

留言