通過java程式模擬實現地鐵票價2+2=12

jeanron100發表於2014-12-24
地鐵票價在這週六開始就要上漲了,這幾天做地鐵明顯感覺人比平常多了很多。大家也都在默默的等待這一刻的到來,儘管很不情願,但是終究會來。
到時候肯定吐槽的人一抓一大把,畢竟一天上班4塊的時代就要終結,一下子變成十幾塊,票價漲了,生活成本都在上漲,其它都沒有變化,生活著實不容易啊。
我每天從二號線轉到四號線,一天下來成本是6+6=12塊。如果還是4塊錢的成本就好了。最後通過程式來模擬了實現了2+2=12.

我們先來看一個簡單的例子。
import java.lang.reflect.Field;


public class TestPlus {
 public static void main(String args[]) {
  Integer ticket_fee1=new Integer(2);
  Integer ticket_fee2=new Integer(2);
  System.out.println(ticket_fee1==ticket_fee2);
  
  ticket_fee1=2;
  ticket_fee2=2;
  System.out.println(ticket_fee1==ticket_fee2);
  System.out.println(ticket_fee1+ticket_fee2);
   }
 

}

程式的輸出是:
false
true
4
這個程式是用java實現,巧妙地運用了物件快取。物件申請的原則來說,每次new出來的物件地址是不一樣的。但是標黃的部分使用到了快取,所以這個時候得到的地址是相同的。這個是在JVM中,預設生成了一些物件的例項,如果需要例項在池中已經存在的時候,直接返回已經生成物件的引用。這樣可以減少例項的數目和改善程式效能。
補充一下,如果上面的Integer換成int,結果又會不一樣。

明白了這些之後我們來實現2+2=12,畢竟我們想要的是這個結果。

import java.lang.reflect.Field;
public class TestPlus {
 public static void main(String args[]) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
  Integer ticket_fee1=new Integer(2);
  Integer ticket_fee2=new Integer(2);

  Class ticket_fee=Integer.class.getDeclaredClasses()[0];
  Field c =ticket_fee.getDeclaredField("cache");
  c.setAccessible(true);
  Integer[] array=(Integer[]) c.get(ticket_fee);
  array[132]=array[140];
  
  System.out.printf("票價實付金額為:%d元",ticket_fee1+ticket_fee1);

 }
 

}

程式的輸出就是:
票價實付金額為:12元
基本原理就是利用快取的讀寫介面,把4這個快取物件的指標改為指向12的例項物件了。這樣程式取出4的時候,實際上返回的是12的引用
如果能夠妥善使用這個程式,對於大家的生活現實意義是巨大的:)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1379169/,如需轉載,請註明出處,否則將追究法律責任。

相關文章