java 地铁费_通过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的引用

如果能够妥善使用这个程序,对于大家的生活现实意义是巨大的:)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值