通過java程式模擬實現地鐵票價2+2=12(r3筆記第94天)
地鐵票價在這週六開始就要上漲了,這幾天做地鐵明顯感覺人比平常多了很多。大家也都在默默的等待這一刻的到來,儘管很不情願,但是終究會來。 到時候肯定吐槽的人一抓一大把,畢竟一天上班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的引用 如果能夠妥善使用這個程式,對於大家的生活現實意義是巨大的:)