通过java程序模拟实现地铁票价2+2=12

地铁票价在这周六开始就要上涨了,这几天做地铁明显感觉人比平常多了很多。大家也都在默默的等待这一刻的到来,尽管很不情愿,但是终究会来。
到时候肯定吐槽的人一抓一大把,毕竟一天上班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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-1379169/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值