1. 程式人生 > 其它 >通過java程式模擬實現地鐵票價2+2=12(r3筆記第94天)

通過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的引用 如果能夠妥善使用這個程式,對於大家的生活現實意義是巨大的:)