<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Just Java IT

    西門町學(xué)士關(guān)于Java的隨便一說而已……

    2008年12月16日 #

    走進JavaFX-(2)

         摘要: 我猶豫了好一陣才決定寫JavaFX的語法部分。個人認為這是學(xué)習(xí)中最枯燥的部分。因為JavaFX的語法非常簡單且直觀,比如Sun提供的在線 Tutorial的GUI部分,即使你是第一次聽說JavaFX這個東西,只要你稍有一點點編程經(jīng)驗,你也基本上能夠毫無障礙地理解這個Tutorial 的內(nèi)容了。
    話雖如此,部分語法可能確實會造成一些理解困難,比如有的地方分隔符用逗號(,)分號(;)和空格都可以,def和var的區(qū)別,=>操作符,等等這些還得初看一遍語法才能理解(當然,基本上就沒有必要看第二遍了吧)。因此,我也在此將JavaFX的語法照著Sun的語法 Tutorial快速地過一遍,為以后打下一個堅實(!)的基礎(chǔ),呵呵。  閱讀全文

    posted @ 2008-12-16 01:05 西門町學(xué)士 閱讀(1815) | 評論 (4)編輯 收藏

    2008年12月12日 #

    走進JavaFX-(1u1)

    /**
    以前寫了一個JavaFX入門例子,但由于JavaFX正式版中變化較大,那個例子已無法在正式版中運行,因此重寫,標題叫1u1,也是遵守Sun的更新規(guī)范,代表update1,呵呵
    文:西門町學(xué)士
    */
    08 年12月4日,Sun正式發(fā)布了JavaFX1.0。JavaFX在演進過程中發(fā)生了很多的變化,因此,我以前寫的JavaFX的第一個 HelloWorld的例子已經(jīng)無法在正式版下運行,于是在這里重寫那個例子。而新的API我也還沒有開始學(xué)習(xí),只好大略地瀏覽了一遍API就草草寫就, 因此,這個例子雖然在1.0版下正確運行,卻未必就是最適合的寫法,以后如發(fā)現(xiàn)問題再來update2吧,呵呵……
    正式版中很多包的命名有了天翻 地覆的變化,class的位置和名稱很多也面目全非。比如GUI這塊就經(jīng)歷了由javafx.ui變化成javafx.gui再變化成 javafx.scene和javafx.application再進化成javafx.scene和javafx.stage,而跟Swing相關(guān)的組 件也統(tǒng)統(tǒng)加上了Swing前綴。有的class我已經(jīng)找不到了,比如以前的javafx.ui.MessageDialog,我在1.0中沒有找到對應(yīng)的 class,只好直接叫用javax.swing.JOptionPane了。好了,廢話不說了,貼新代碼如下:
    package sc.tmp;

    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.paint.Color;
    import javafx.ext.swing.SwingButton;
    import javax.swing.JOptionPane;

    /**
     * 
    @author stevech
     
    */
    Stage {
        title: 
    "Application title"
        width: 
    250
        height: 
    80
        scene: Scene {
            fill: Color.ORANGE
            content: SwingButton {
                text: 
    "Click"
                action: function():Void {
                    JOptionPane.showMessageDialog(
    null"Have Fun!\nThis is your first JavaFX app!")
                }
                translateX: 
    90 translateY: 10
            }
        }
        visible: 
    true
    }

    結(jié)果如圖:

    posted @ 2008-12-12 22:42 西門町學(xué)士 閱讀(1468) | 評論 (1)編輯 收藏

    2008年7月18日 #

    走進JavaFX-(1)

         摘要: JavaFX出來已經(jīng)很長一段時間了。一直在計劃跟進,可是因為比較懶,現(xiàn)在才慢慢地學(xué)習(xí)。這里就暫做做學(xué)習(xí)總結(jié)的地方吧。
    雖然是總結(jié),我還是打算寫詳細一點。本來我對JavaFX了解也不是很多,有的東西還要在網(wǎng)上查證了才能寫(比較JavaFX是如何誕生,如何從F3變成 JavaFX的)。今天要寫的主要是:1、JavaFX的前世今生;(了解了它的歷史也就了解了它是什么,它的發(fā)展方向,呵呵)2、如何擁有 JavaFX;(知道從哪里去下載開發(fā)工具,如何配置它)3、Hello JavaFX World(當然,一個經(jīng)典的Hello World是不能少的)  閱讀全文

    posted @ 2008-07-18 11:12 西門町學(xué)士 閱讀(1845) | 評論 (6)編輯 收藏

    2007年6月10日 #

    NetBeans無好書[順便推薦兩本Java書]

    首先聲明,本文作者信手亂寫,以前候捷寫無責(zé)任書評,無責(zé)任這三個字,在我這兒也差不多——西門町學(xué)士 (注)

    前兩天逛書店,看到一本《精通NetBeans——Java桌面、Web、企業(yè)級程序開發(fā)》 ,遂在書店里站了一個多小時(好厚啊!書厚臉皮也厚),基本把這本書看了一遍,整體感覺失望,內(nèi)容完全配不上精通NetBeans這個標題。基本上就是在NetBeans環(huán)境里寫一些很簡單的JavaSE和JavaEE代碼,而且代碼質(zhì)量也很不高。像Web部分,為了圖簡單,在JSP頁面中寫了大量的scriptlet,很不推薦開發(fā)人員看這種代碼。這本書勉勉強強可以起名叫《初涉NetBeans》,看來要想更好地推介NetBeans,還需要更多的技術(shù)作者的努力。什么時候NetBeans的書能跟Delphi的書媲美了,估計NetBeans的大業(yè)差不多就定了吧,呵呵
    不管用什么IDE,關(guān)鍵是看開發(fā)人員本人對語言和框架的功力,這里也推介兩本書,都是老書了,但內(nèi)容基本不落伍,提升功力更是不錯。
    一本是:Swing,Matthew Robinson 和 Pavel Vorobiev合寫的,學(xué)士手上的很老了,上個世紀末的英文原版,但是真的非常非常經(jīng)典,國內(nèi)應(yīng)該有更新的中文版的,做Swing的一定要看,很不錯。
    一 本關(guān)于JSP和Servlet方面的,學(xué)士是從TSS下載的免費電子版,Servlets and JavaServer Pages, The J2EE technology Web Tier,Jayson Falkner 與 Kevin Jones合著,(基于J2EE4,無JSF方面內(nèi)容),國內(nèi)好像沒有中文版的。這也是一本好書,Java Web入門與提升均應(yīng)多讀此書。
    這兩本書最大的特點就是,呵呵,用侯捷的話說,叫深入淺出。在講一個技術(shù)的同時,也講正確的編碼和設(shè)計方法,既能讓一個新手從正門登堂入室,也能讓一個有經(jīng)驗的開發(fā)人員獲得提升,以此大力推介之。

    posted @ 2007-06-10 23:45 西門町學(xué)士 閱讀(909) | 評論 (1)編輯 收藏

    2006年12月15日 #

    又說Eclipse與NetBeans

    文:西門町學(xué)士

    Eclipse的陣營一向強大,最近又加入了一家重量級的公司:Google,相形之下,NetBeans的陣營顯得有點那么“勢單力薄”。
    我本人則由于對Swing的喜愛及對SWT的不喜愛,一直(從NB3.0以來)使用NetBeans。
    (以前的NetBeans確實不夠好用,建個Project還得先mount一下,典型的Unix思維)雙方這幾年的發(fā)展,從架構(gòu)和功能上來說,現(xiàn)在NetBeans和Eclipse已經(jīng)是大同小異,沒有誰比誰牛×。對于developers,用誰憑喜好。
    可 對于想通過這兩個平臺來賺錢的企業(yè)來說,二者的區(qū)別可就太大了。看看Eclipse的陣營(雙方的家長就不提了):BEA, Borland, Intel, Sybase, Adobe, Oracle, Google, etc全是些IT屆NB哄哄的大牛;再看看NetBeans的部隊:一隊的無名小卒,大名鼎鼎的也有:Amazon:賣書的;eBay:做生意的;HP: 賣PC的;還有賣手機的,做開源的,不一而足,感覺有點歪瓜裂棗似的。我就納悶兒了:同樣都是做Java IDE 的,受到的待遇區(qū)別咋就這么大呢!何況像Borland這樣的本來JBuilder和NetBeans就很相近,為什么還得繞個彎兒去舔SWT的屁股? (李維還在信心滿滿的說什么Java開發(fā)王者,反正我是不信
    今 兒個感覺有點想明白了:Eclipse是搭個基本架子,剩下的這些公司在上面做自己的東東然后就可以拿去賣錢了,像MyEclipse、Borland都 是這么個想法;而NetBeans呢,Sun好像是把它定位成送給Developers的禮物(那里面裝的當然就會是Sun所領(lǐng)導(dǎo)的Java技術(shù),而不會 是那個覬覦者IBM的Java技術(shù)),IDE free, Web pack free, mobility pack free, Enterprise pack free, 等等等等通通free,免費大贈送,咱們開發(fā)者當然是高興了,既不要錢,又是最新技術(shù),還有個Sun蓋的“正統(tǒng)”大章。可對于那些公司就不一樣了,老子吃 的就是這碗飯,你全送人了我喝西北風(fēng)啊?還活不活啊我?你以為我像JBoss那樣傻,不賣產(chǎn)品賣服務(wù)?JBoss不就是發(fā)現(xiàn)這碗飯不好吃才把 Rickard Oberg這個頑固不化的家伙給踹出門的嗎。所以這些公司才紛紛對NetBeans離的遠遠的,像見了娘親一向撲向Eclipse的懷抱~~
    不管怎么說,我還是Swing的堅定支持者,支持Sun,支持NetBeans,最后,感謝James Golsing,感謝Groove Coverage(我是邊聽God is A Girl一邊碼字兒的),感謝你的眼睛不辭辛勞地看到這里!

    posted @ 2006-12-15 22:42 西門町學(xué)士 閱讀(1152) | 評論 (4)編輯 收藏

    2006年4月16日 #

    數(shù)組的力量

    ??? 假如我們要精確計算一個很大的數(shù),比如說,256的階乘(結(jié)果有500多位),怎么辦?
    你會說,很好辦啊,從JDK 1.1起Java不是提供了一個java.math.BigInteger嗎?不錯,用BigInteger確實能解決問題。不過,如果沒有Sun給的這個class,僅僅靠Java最基本的那些類型,我們有沒有辦法來進行計算呢?答案是,肯定是能嘛,要不然在BigInteger之前怎么辦。
    方法之一就是用數(shù)組來表示。比如說:
    ??????????????????????? int[] data = new int[100];
    ??? 我們知道,一個int的最大值為2^31-1即2147483647(10位),如果我們把這100個int值串起來,我們就能表示一個1000位的數(shù)。這里我們就用這種方式來計算256的階乘(256!)。
    ??? 我們先分配100個int的數(shù)組,由于是static,所以每個int的初始值都是0。
    ??? 然后每個int表示6位數(shù),即最大值為999999。因為我們要做乘法,如果給int的位數(shù)過大,如9位,那么999999999乘上一個數(shù),如100,它的值就大于了int的max值,造成溢出。所以int表示的位數(shù)需要根據(jù)需要仔細選擇。(用long來表示也同樣需要仔細權(quán)衡位數(shù))
    ??? 再定義一個num來表示我們占用的數(shù)組的int個數(shù)
    ??? 在乘法的時候,對每個占用的int中的數(shù)都要乘,然后一個一個地判斷每個int中的值是不是超出了6位:
    ??????????????????????? if (data[j]) > 1000000)
    ??? 如果超出了則需要進位:
    ??????????????????????? data[k+1] += data[k]/1000000;
    ??????????????????????? data[k] %= 1000000;
    一個個判斷,最后,如果最高位(即data[num])中的數(shù)值也超過了6位,我們就需要占用一個新的int,同樣地進位,當然也不要忘了給num加一。
    ??????????????????????? if (data[num] > 1000000) num++;
    ??? 最后,將我們的數(shù)組順序輸出即可。在輸出的時候需要小心的是,如果int中的值小于6位,如25,別忘了補上0,即000025,否則你會得到錯誤的答案的。
    ??? 完整的代碼如下:

    package?tmp;

    /**
    ?*
    ?*?
    @author?Stevech
    ?
    */
    public?class?BigNumbers?{
    ????
    static?int[]?data?=?new?int[100];
    ????
    ????
    /**?Creates?a?new?instance?of?BigNumers?*/
    ????
    public?static?void?main(String[]?args)?{
    ????????
    int?num?=?0;????//?占用的個數(shù)
    ????????data[0]?=?1;????//?0和1的階乘是1
    ????????
    ????????
    for?(int?i?=?2;?i?<?257;?i++)?{
    ????????????
    for?(int?j?=?0;?j?<?num?+?1;?j++)?{
    ????????????????data[j]?
    *=?i;????????//?對每個int中的數(shù)都乘上?i
    ????????????}
    ????????????
    for?(int?j?=?0;?j?<?num?+?1;?j++)?{
    ????????????????
    if?(data[j]?>?1000000)?{
    ????????????????????
    for?(int?k?=?j;?k?<?num?+?1;?k++)?{
    ????????????????????????
    if?(data[num]?>?1000000)?num++;
    ????????????????????????data[k
    +1]?+=?data[k]/1000000;????//?進位
    ????????????????????????data[k]?%=?1000000;??????????????????//?進位后的余數(shù)
    ????????????????????}
    ????????????????}
    ????????????}
    ????????}
    ????????System.out.println(
    "占用的int數(shù):"?+?(num+1)?+?"\n值:");
    ????????System.out.print(data[num]);
    ????????
    for?(int?i?=?num-1;?i?>?-1;?i--)?{
    ????????????System.out.print(
    new?java.text.DecimalFormat("000000").format(data[i]));
    ????????}
    ????}
    }
    輸出結(jié)果為:
    占用的int數(shù):85
    值:
    85781777534284265411908227168123262515778152027948561985965565037726945255314
    75893774402913604514084503758853423365843061571968346936964753222892884974260256
    79637332563368786442675207626794560187968867971521143307702077526646451464709187
    32610083287632570281898077367178145417025052301860849531906813825748107025281755
    94594769870346657127381392862052347568082188607012036110831520935019474371091017
    26968262861606263662435022840944191408424615936000000000000000000000000000000000
    000000000000000000000000000000

    posted @ 2006-04-16 21:19 西門町學(xué)士 閱讀(1948) | 評論 (3)編輯 收藏

    2006年4月9日 #

    JTextField內(nèi)容有效性驗證幾種方式

    在使用 SwingJTextField時,我們常常希望只接受那些符合我們要求的錄入,如數(shù)字、電話號碼、郵政編碼、E-mail等。JFC工作組在這方面也做了很多工作,每一次新的Java Se發(fā)布,往往都提供了新的、更方便和強大的有效性驗證方式,在這里列舉幾種不同的驗證方式。

    • 利用鍵盤和焦點事件

    這是最直覺的方式。利用 KeyListener來選擇允許的字符,且添加FocusListener,使得

    內(nèi)容不符合要求時不允許焦點轉(zhuǎn)移。這種方式很繁瑣, Sun的建議是不推薦使用這種方式。

    • 使用自定義的 Document

    我們知道, Swing組件是基于MVC實現(xiàn)的。JTextComponentModel是一個叫做DocumentInterface,我們可以通過限制Document的內(nèi)容來達到有效性驗證的目的。javax.swing.text包中有多個不同的Document的實現(xiàn),JTextField使用的是PlainDocument。如果我們希望JTextField只接受數(shù)字,可以實現(xiàn)我們特定的Document并使之替換默認的Document


       package sdn;

    import javax.swing.text.*;

    public class IntegerDocument extends PlainDocument {

    int currentValue = 0;

    public int getValue() {
    return currentValue;
    }

    public void insertString(int offset, String string,
    AttributeSet attributes) throws BadLocationException {

    if (string == null) {
    return;
    } else {
    String newValue;
    int length = getLength();
    if (length == 0) {
    newValue = string;
    } else {
    String currentContent = getText(0, length);
    StringBuffer currentBuffer =
    new StringBuffer(currentContent);
    currentBuffer.insert(offset, string);
    newValue = currentBuffer.toString();
    }
    currentValue = checkInput(newValue, offset);
    super.insertString(offset, string, attributes);
    }
    }
    public void remove(int offset, int length)
    throws BadLocationException {
    int currentLength = getLength();
    String currentContent = getText(0, currentLength);
    String before = currentContent.substring(0, offset);
    String after = currentContent.substring(length+offset,
    currentLength);
    String newValue = before + after;
    currentValue = checkInput(newValue, offset);
    super.remove(offset, length);
    }
    public int checkInput(String proposedValue, int offset)
    throws BadLocationException {
    if (proposedValue.length() > 0) {
    try {
    int newValue = Integer.parseInt(proposedValue);
    return newValue;
    } catch (NumberFormatException e) {
    throw new BadLocationException(proposedValue, offset);
    }
    } else {
    return 0;
    }
    }
    }

    然后用 IntegerDocument去替換JTextField默認的Document

       package sdn;

    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.*;
    import java.awt.event.*;

    public class NumericInput {
    public static void main(String args[]) {
    Runnable runner = new Runnable() {
    public void run() {
    JFrame frame = new JFrame("Numeric Input");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridLayout(2, 2));

    frame.add(new JLabel("Number"));
    JTextField fieldOne = new JTextField();
    Document doc= new IntegerDocument();
    fieldOne.setDocument(doc);
    frame.add(fieldOne);

    frame.add(new JLabel("All"));
    JTextField fieldTwo = new JTextField();
    frame.add(fieldTwo);

    frame.setSize(250, 90);
    frame.setVisible(true);
    }
    };
    EventQueue.invokeLater(runner);
    }
    }

    代碼很簡單,一目了然。這里說點題外話, Sun建議的Swing Applicationmain函數(shù)寫法如上所示:先建一個Runnable,然后把這個Runnable放到event-dispatch thread中去執(zhí)行。另外,以前有的Developer(比如我)喜歡用SwingUtilities.invokeLater(runner)來將一個thread放到event-dispatch thread中,現(xiàn)在Sun也建議用EventQueue.invokeLater(runner),因為SwingUtilities方法版本僅僅是對EventQueue方法版本的一個包裝。

    • InputVerifier來實現(xiàn)

    J2SE 1.3中加入了一個名為InputVerifier的抽象類,可用于任何JComponent。其中定義了boolean verifiy(JComponent input)方法。如果組件中的文本是有效的,當焦點轉(zhuǎn)移時(如按下TabShift-Tab),verify方法返回true;否則返回false,使得焦點仍停留在當前組件上。我們?nèi)砸詳?shù)字為例:

       package sdn;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class NumericVerifier{
    public static void main(String args[]) {
    Runnable runner = new Runnable() {
    public void run() {
    JFrame frame = new JFrame("Numeric Verifier");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel1 = new JPanel(new BorderLayout());
    JLabel label1 = new JLabel("Numeric-only");
    JTextField textField1 = new JTextField();
    panel1.add(label1, BorderLayout.WEST);
    panel1.add(textField1, BorderLayout.CENTER);

    JPanel panel2 = new JPanel(new BorderLayout());
    JLabel label2 = new JLabel("Anything");
    JTextField textField2 = new JTextField();
    panel2.add(label2, BorderLayout.WEST);
    panel2.add(textField2, BorderLayout.CENTER);

    JPanel panel3 = new JPanel(new BorderLayout());
    JLabel label3 = new JLabel("Numeric-only");
    JTextField textField3 = new JTextField();
    panel3.add(label3, BorderLayout.WEST);
    panel3.add(textField3, BorderLayout.CENTER);

    InputVerifier verifier = new InputVerifier() {
    public boolean verify(JComponent comp) {
    boolean returnValue;
    JTextField textField = (JTextField)comp;
    try {
    Integer.parseInt(textField.getText());
    returnValue = true;
    } catch (NumberFormatException e) {
    Toolkit.getDefaultToolkit().beep();
    returnValue = false;
    }
    return returnValue;
    }
    };

    textField1.setInputVerifier(verifier);
    textField3.setInputVerifier(verifier);

    frame.add(panel1, BorderLayout.NORTH);
    frame.add(panel2, BorderLayout.CENTER);
    frame.add(panel3, BorderLayout.SOUTH);
    frame.setSize(300, 95);
    frame.setVisible(true);
    }
    };
    EventQueue.invokeLater(runner);
    }
    }

    這個例子的效果和上一個是不同的。自定義 DocumentApp中,用戶將會發(fā)現(xiàn)任何非數(shù)字的字符都不會在JTextField中出現(xiàn);而在使用InputVerifierApp中,用戶在錄入字符時不會發(fā)現(xiàn)任何異常,但是當他確認錄入完成后,如果內(nèi)容不符合有效性,焦點將不會轉(zhuǎn)移!這兩種情況都可能讓一個沒有經(jīng)驗的用戶茫然,具體使用哪一種是一個見仁見智的問題。

    • 使用 Document Filter

    J2SE 1.4中,又加入了一個新的類:DocumentFilter。你無需再實現(xiàn)一個新的Document,而是對現(xiàn)有的Document過濾一遍。它的結(jié)果與實現(xiàn)自定義的Document并無二樣,僅僅是思路不同而已。

       package snd;
    import javax.swing.text.*;
    import java.awt.Toolkit;

    public class IntegerDocumentFilter extends DocumentFilter {


    int currentValue = 0;

    public IntegerDocumentFilter() {
    }

    public void insertString(DocumentFilter.FilterBypass fb,
    int offset, String string, AttributeSet attr)
    throws BadLocationException {

    if (string == null) {
    return;
    } else {
    replace(fb, offset, 0, string, attr);
    }
    }

    public void remove(DocumentFilter.FilterBypass fb,
    int offset, int length)
    throws BadLocationException {

    replace(fb, offset, length, "", null);
    }

    public void replace(DocumentFilter.FilterBypass fb,
    int offset, int length, String text, AttributeSet attrs)
    throws BadLocationException {

    Document doc = fb.getDocument();
    int currentLength = doc.getLength();
    String currentContent = doc.getText(0, currentLength);
    String before = currentContent.substring(0, offset);
    String after = currentContent.substring(
    length+offset, currentLength);
    String newValue = before +
    (text == null ? "" : text) + after;
    currentValue = checkInput(newValue, offset);
    fb.replace(offset, length, text, attrs);
    }

    private int checkInput(String proposedValue, int offset)
    throws BadLocationException {
    int newValue = 0;
    if (proposedValue.length() > 0) {
    try {
    newValue = Integer.parseInt(proposedValue);
    } catch (NumberFormatException e) {
    throw new BadLocationException(
    proposedValue, offset);
    }
    }
    return newValue;
    }
    }

    再將這個 Filter應(yīng)用于Document

       package sdn;
    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.*;

    public class NumericInputFilter {
    public static void main(String args[]) {
    Runnable runner = new Runnable() {
    public void run() {
    JFrame frame = new JFrame("Numeric Input Filter");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridLayout(2, 2));

    frame.add(new JLabel("Number"));
    JTextField textFieldOne = new JTextField();
    Document doc= textFieldOne.getDocument();
    DocumentFilter filterOne = new IntegerDocumentFilter();
    ((AbstractDocument)doc).setDocumentFilter(filterOne);
    textFieldOne.setDocument(doc);
    frame.add(textFieldOne);

    frame.add(new JLabel("All"));
    JTextField textFieldTwo = new JTextField();
    frame.add(textFieldTwo);

    frame.setSize(250, 90);
    frame.setVisible(true);
    }
    };
    EventQueue.invokeLater(runner);
    }
    }

    DocumentFilter只能用于Swing中的與text有關(guān)的組件(而InputVerifier可用于任何組件)。除了這幾種方法,在對于TextField而言,我們還有JFormattedTextField,很多時候用JFormattedTextField將是非常容易和簡單的方式。

    注:這篇文章基本根據(jù)SDN的Core Java Tech Tips意譯而來,代碼基本跟其一致,另外還參考了M. Robinson & P. Vorobiev的Swing, Chapter 11

    posted @ 2006-04-09 16:26 西門町學(xué)士 閱讀(2363) | 評論 (0)編輯 收藏

    2006年3月16日 #

    Tiger pitfall

    在SDN踩到一個Tiger的pitfall:
    package sdn;

    import java.util.ArrayList;

    public class BoxingEquality {
       
        /** Creates a new instance of BoxingEquality */
        public BoxingEquality() {
        }
       
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            int i = 1;
            int j = 1;
            ArrayList<Integer> list = new ArrayList<Integer>();
            list.add(i);
            list.add(j);
            System.out.printf("It is %b that i == j.\n", (i==j));
            System.out.printf("It is %b that list.get(0) == list.get(1).\n", (list.get(0)==list.get(1)));
            System.out.printf("It is %b that list.get(0).equals(list.get(1)).",            list.get(0).equals(list.get(1)));
        } 
    }

    輸出結(jié)果出乎意料:
    It is true that i == j.
    It is true that list.get(0) == list.get(1).    // WHY???
    It is true that list.get(0).equals(list.get(1)).

    然而,僅僅將 i 和 j 的值改成1000:
    int i = 1000;
    int j = 1000;
    就這一個改動后輸出結(jié)果雖然符合了java的思維方式,但在這個context中卻更顯得怪異:
    It is true that i == j.
    It is false that list.get(0) == list.get(1). // Oops
    It is true that list.get(0).equals(list.get(1)).

    Sun給出的解釋:
    The primitives are equal and the values of the boxed ints are equal. But this time the ints point to different objects. What you have discovered is that for small integral values, the objects are cached in a pool much like Strings. When i and j are 2, a single object is referenced from two different locations. When i and j are 2000, two separate objects are referenced. Autoboxing is guaranteed to return the same object for integral values in the range [-128, 127], but an implementation may, at its discretion, cache values outside of that range. It would be bad style to rely on this caching in your code.

    呵呵,要不注意說不定還真中招了!

    posted @ 2006-03-16 22:03 西門町學(xué)士 閱讀(333) | 評論 (4)編輯 收藏

    僅列出標題  
    主站蜘蛛池模板: 最近中文字幕高清免费中文字幕mv| 国产精品无码免费专区午夜 | 免费无码毛片一区二区APP| 毛茸茸bbw亚洲人| 一级特黄色毛片免费看| 亚洲人午夜射精精品日韩| 免费大片av手机看片| 四虎永久成人免费影院域名| 国产精品亚洲а∨天堂2021| 啊灬啊灬别停啊灬用力啊免费看| 国产精品久久久久久亚洲小说| 尤物永久免费AV无码网站| 偷自拍亚洲视频在线观看99| 免费大黄网站在线观| ssswww日本免费网站片| 亚洲精品夜夜夜妓女网| 亚洲精品免费视频| 亚洲精品自在线拍| 四虎永久在线精品免费网址 | 亚洲中文字幕无码爆乳app| 成年人在线免费观看| 亚洲高清毛片一区二区| 免费人成网站在线高清| 99热在线日韩精品免费| 亚洲邪恶天堂影院在线观看| 皇色在线视频免费网站| 久久精品国产亚洲AV天海翼| 亚洲一级Av无码毛片久久精品 | 亚洲欧洲国产综合AV无码久久| 四虎永久免费观看| 黄色网址在线免费| 亚洲中文字幕在线无码一区二区| 日本无吗免费一二区| 色www永久免费网站| 亚洲av专区无码观看精品天堂| 日本免费一二区在线电影| 在线观看免费视频一区| 亚洲成a人片在线观看中文app| 国产片免费福利片永久| 久草福利资源网站免费| 自拍偷自拍亚洲精品偷一|