通过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的引用
如果能够妥善使用这个程序,对于大家的生活现实意义是巨大的:)

时间: 2024-09-30 09:15:33

通过java程序模拟实现地铁票价2+2=12的相关文章

《Java程序员面试秘笈》—— 1.12 线程组中不可控异常的处理

1.12 线程组中不可控异常的处理 提供应用程序中对错误情景的管理,是编程语言很重要的一面.和几乎所有的现代编程语言一样,Java语言也实现了通过异常管理机制来处理错误情景,它提供了很多类来表示不同的错误.当错误情景发生时,Java类将抛出这些异常.你可以使用这些异常,或者实现自己的异常,来管理类中的错误. Java也提供了捕获和处理这些异常的机制.有的异常必须被捕获,或者必须使用方法的throws声明再次抛出,这类异常叫做非运行时异常.还有一类异常叫做运行时异常,它们不需要被捕获或者声明抛出.

用Java实现一个地铁票价计算程序,该用到什么数据结构和算法?

问题描述 根据某市地铁线路图写一个地铁票价计算程序需求描述:1.计费规则:最低2元,超过5站以上每站加收0.5元,换乘重新起算,例如L1先坐4站,换乘L2再坐6站,结果就是2+2.5=5.5元2.程序启动以后读取输入文件(in.txt),内容格式如:L2-8,L2-2X3,L3-8....每行表示一次行程,起点站和终点站之间用逗号分隔,行数不限4.系统按最短路径方案(尽量少换乘且站数少,假设乘客换乘一次用的时间相当于坐4个站)规划路线,计算票价,并把路线和票价输出到文件(out.txt),内容格

动态编译JAVA程序

编译|程序|动态 在Sun JDK 1.2及后续版本中,包含了一组可在程序运行时刻编译和执行Java代码的API.这些API被包含在tools.jar类库中.这个功能允许Java程序在运行时动态编译.执行小的代码块,在有些情况下这个功能会让Java应用程序的架构更加灵活.开放. 本文假定读者已经在计算机中安装并配置好了Sun JDK 1.2或更高的版本,并对javac编译器命令有所了解. 在Java程序中使用编译器 假定要使用javac命令编译 /home/mytest目录下Test.java文

Java程序员学习Flex和BlazeDS的十三个理由

在阐述Java程序员应当学习BlazeDS的13条理由时,我以一个假想的苏打分派 系统来展示如何让已有的Java程序转变为RIA应用.通过这个例子,我同时还会 讲解到BlazeDS在已有Java应用或新建Java应用中的多种不同用法. 理由 一:开源 Flex软件开发工具箱(SDK)的核心是个开源框架,专门用来开 发.维护那些在不同浏览器.不同操作系统下界面都相同的RIA应用.Flex发布 采用的是Mozilla公共许可证(Mozilla Public License).编译后的Flex应用 在

Java程序员在写SQL程序时候常犯的10个错误

  Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用"模式-模式",举个例子,模式可以应用到任何地方,而且都可以归为某一类模式) 心境(首先,要写个好的面向对象程序是比命令式程序难的多,你得花费一些功夫) 但当Java程序员写SQL语句时,一切都不一样了.SQL是说明性语言而非面向对象或是命令式编程语言.在SQL中要写个查询语句是很简单的.但在Java里类似的语句却不

阿里面试回来,想和Java程序员谈一谈

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论"面试前该不该刷题"这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习

浅谈关于java程序员面试的一些事项

本篇博文针对的是应届毕业生以及工作两三年左右的java程序员. 为什么要跳槽? 这是一个很广义的问题,每个人心中都有一份答案. 例如: 公司的待遇不好, 薪资涨幅不符合预期要求, 厌倦了出差的荒无天日的繁重工作, 公司的妹子太少, 领导太傲娇, 同事之间关系太逼格, 某某同学跳槽到某某公司之后涨到了多少多少钱, 某某同学的朋友的同事的三姑妈家的大儿子的好基友在某某高就, 等等辞职理由. 咱们就不多说了,还是谈谈怎么应付面试吧. 以下内容是我在面试中总结的一些经验,希望这些可以给各位带来帮助和启迪

有人做过java httpclient 模拟登陆outlook 获取邮件的吗

问题描述 有人做过java httpclient 模拟登陆outlook 获取邮件的吗 有人做过java httpclient 模拟登陆outlook 获取邮件的吗 解决方案 其实现在很多可以做模拟登录的httpClient,JSOUP,htmlUnit,我做过用Jsoup做模拟登录,要做两次模拟,第一次是获得Cookie,第二次带入cookie就行了,大致思想就是这样. 解决方案二: 这种程序没有意义,因为网页是不断变化的,你应该用mapi从本地outlook获取,或者用pop协议从邮箱服务器

Java程序员应当知道的10个面向对象设计原则

(设计原则)底线是永远追求高内聚.低耦合的编码或设计. Apache 和 Sun的开源代码是学习Java和OOPS设计原则的良好范例.它们向我们展示了,设计原则在Java编程中是如何使用的.Java JDK 使用了一些设计原则:BorderFactory类中的工厂模式.Runtime类中的单例模式.java.io 类中的装饰器模式.顺便说一句,如果您真的对Java编码原则感兴趣,请阅读Joshua Bloch 的Effective Java,他编写过Java API.我个人最喜欢的关于面向对象设