bigdecimal比较是否相等,java字符串比较是否有相等的字符串
bigdecimal比较是否相等,java字符串比较是否有相等的字符串详细介绍
本文目录一览: JAVA中怎么判断两个浮点数相等
一般情况下: 浮点数的相等 ,可以使用 == 进行比较 . 但是浮点数, 毕竟涉及到精度问题, 如果要考虑精度的问题 ,那么可以使用BigDecimal 类
参考代码
public class Test { public static void main(String[] args) { System.out.println(0.1 * 3 == 0.3);// false System.out.println(0.1 * 3);// 0.30000000000000004 System.out.println(0.3d);// 0.3 BigDecimal b1 = new BigDecimal("0.1"); BigDecimal b2 = new BigDecimal("3"); BigDecimal b3 = new BigDecimal("0.3"); BigDecimal b4 = b1.multiply(b2);//乘法 if (b4.compareTo(b3)==0) {// 如果两者比较结果为0 ,那么就是相等 System.out.println("相等"); } else { System.out.println("不等"); } }}
java字符串比较是否有相等的字符串
【关键字】java 比较 String int Integer BigDecimal 变量 相等【内容】在java中如果想要比较两String类型变量是否相等,可以使用equals函数,函数写法如下: String a;String b; a.equals(b)返回boolean类型。如果比较String和字符串是否相等,如下写法。"abc".equals(a); 这里字符串使用""括起来,不可以使用''。java中''表示的char型,所以''中只可以有一个字符。 parseInt(a)==b){}if(a. equals(c. toString())){}if(a. toString())){}使用Eclipse等IDE开发环境(Integrated Development Environment集成开发环境)的提示功能,可以很方便的找到这些函数.另外,也可以从java的一些API文档中找到.
c语言中double类型值的大小比较
在比较float和double类型的时候,
因为float/double精度的问题
比如 1.000000001 可能和1.0000000000001相等
不应该直接使用 a > b 等类似的方式进行比较
而是采用 两个数做差取绝对值然后跟 你指定的精度进行比较
便可得出 两个double/float的大小
计算机在进行运算时首先根据数据的类型分配地址空间,分配完地址后首先将输入的数据转化为二进制,然后进行运算。你输入的数值a,从逻辑角度来看是正确,但从计算算法来看是病态函数,即计算机进行二进制转换容易出错的数值。从这一点可以看出,计算机没有你聪明。
没有问题,你得这么去想,IF去做判断实际上的操作也就是将a-b的值与0判断。
第一个显然不存在任何问题,同为双精度型。
第二个与整型的比较,减法不丢失精度。
所以这两个都不会存在问题。
大小直接比较, 相等比较他们的差值在一定的误差范围内就认为是相等了。
比如:double d1,d2;
const double d = 0.0001;
if(d1 - d2 > -d && d1 - d2 < d);
认为d1与d2相等,否则不相等
不会有异常,输出后面那个结果。比较时a,b会自动转换格式的,转换到double。
由于double浮点数的精度问题,所以在比较大小的时候,不能像int整数型那样,直接if(a==b),if(a
b)。
要使用一个精度EPS:
const double EPS = 1e-6; //一般这样子就够,但有时具体题目要考虑是否要更小的 ;
if(fabs(a-b) < EPS) //判断是否相等 ;
if(a > b+EPS) // 判断a是否大于b,因为大的肯定大,所以即使你小的加上,还是会更大 。
扩展资料
JAVA double类型比较大小
@org.junit.Test
public void Test(){
BigDecimal big = new BigDecimal(1);
BigDecimal Graphicprice = new BigDecimal(0.01);//图文价格
BigDecimal Speechprice = new BigDecimal(0.02);//语音价格
BigDecimal Videoprice = new BigDecimal(1);//视频价格
System.out.println(Graphicprice + " " + Speechprice +" " + Videoprice);
if(Graphicprice.compareTo(big)<0 || Graphicprice.compareTo(big)==0 ||
Speechprice.compareTo(big)<0 || Speechprice.compareTo(big)==0 ||
Videoprice.compareTo(big)<0 || Videoprice.compareTo(big)==0){
System.out.println("ok");
}
}
Java中Double的比较?
double a = 0.001;
double b = 0.0011;
BigDecimal data1 = new BigDecimal(a);
BigDecimal data2 = new BigDecimal(b);
data1.compareTo(data2)
非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型!
如果只有double,是可以直接比较的
Double没有的,double有 Double是对象,看两个对象是否值相同,调用 equals方法
这也是解决double精度比较的方法。另外还有一种方法,你可以用写一个 double成员属性,然后在eclipse中重写equals方法,你会看到他是怎么处理两个double值是否相同的 sun公司用的是Double.doubleToLongBits(要比较的double值) != Double.doubleToLongBits(另一个double值) 这种方式
bigdecimal传值取不到
BigDecimal是一个可变的、任意精度的浮点数类型,它可以完全模拟基本的算术运算,而且不会丢失精度。在传值的过程中,需要注意以下几点:
1. 要保证传递的值是BigDecimal类型,不要使用double或者float类型;
2. 在传递BigDecimal类型的值时,要使用BigDecimal.valueOf方法,可以确保传递的值不会丢失精度;
3. 在使用BigDecimal类型的值时,要注意使用equals方法来判断两个BigDecimal类型的值是否相等,而不要使用==运算符。
java中BigDecimal怎么与0比较?
标准做法\x0d\x0aintr=big_decimal.compareTo(BigDecimal.Zero);//和0,Zero比较\x0d\x0aif(r==0)//等于\x0d\x0aif(r==1)//大于\x0d\x0aif(r==-1)//小于\x0d\x0a\x0d\x0a或者\x0d\x0aif(big_decimal.equals(BigDecimal.Zero))//是否等于0
谁知道这段Java程序里的异常所在?(部分代码)
记得小学里学过 被除数不能为0 的.
如果你想测试的话,你就把
BigInteger c = new BigInteger("0");
BigDecimal e = new BigDecimal(0);
BigInteger i = new BigInteger("0");
BigInteger x = new BigInteger("0");
BigInteger y = new BigInteger("0");
final BigInteger zero = new BigInteger("0");
把里面的 0 都改成其它的数字,例如 3
程序肯定能跑起来..你也就知道错在什么地方了.
算法异常。
我运行了一下,错误出在e = g.divide(h, mct);这句话,我打印了一下h和mct的值:
0/precision=2 roundingMode=HALF_DOWN
然后再仔细看一下divide函数的定义,我发现
Throws:ArithmeticException - if the result is inexact but the rounding mode is UNNECESSARY or mc.precision == 0 and the quotient has a non-terminating decimal expansion.
翻译一下就是:
如果结果不精确但舍入模式是不必要的或mc.precision = =0和商有无尽小数展开就会抛出异常。
据此判断,你这个舍入模式是不必要的,所以抛出了异常。
我又打印了一下g和h,发现都是0,也有可能是在此0/0引起的错误。
MathContext mct=new MathContext(mcb.intValue(), RoundingMode.HALF_DOWN);
把这个定义改一下,这是个错的
看不出
debug调试下
我找到问题所在了,你循环赋值中,比如
if(i.remainder(three)==zero){
c = a.add(b);
}
这句,i.remainder(three)得到的是一个BigInteger的实例,他的值是0,而zero的值也是0,但是,如果你直接用==去做比较,比对的是内存地址,而不是值,你应该用compareTo这个方法来判断是否相等
上海久雅Java面试题
久雅科技面试题 【JAVA软件工程师】
1、基本集合类有哪些,各自的特点?
集合类型主要有3种:set(集)、list(列表)和map(映射)。
List 关心的是索引,与其他集合相比,List特有的就是和索引相关的一些方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) 。
Set关心唯一性,它不允许重复。
Map关心的是唯一的标识符。他将唯一的键映射到某个元素。当然键和值都是对象。
2、下面代码的运行结果:(A)
public class Foo {
public static void main(String[] args) {
String s;
String.out.println("s="+s);
}
}
A.由于String s没有初始化,代码不能编译通过 B.代码得到编译,输出结果为"s="
C.代码得到编译,并输出"s=null" D.代码得到编译,但捕获到NullPointException异常
3、请说明equal和==的区别。
int i=1;int j=1;
在一个判断条件中使用i==j是否为true?
如果i和j是integer呢?
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
==比较的是2个对象的地址,而equals比较的是2个对象的内容。
4、编写一个方法用于奇偶数判定。
int num=0;
System.out.println("请输入一个整数:");
Scanner inputScanner=new Scanner(System.in);
num=inputScanner.nextInt();
if(num%2==0){
System.out.println(num+"为偶数");
}else{
System.out.println(num+"为奇数");
}
5、以下这段代码是否正确:
String[] name={"tom","dick","harry"};
for(i=0;i<=name.length;i++){
System.out.print(name[i]+'\n');
}
这段代码错误,会触发“ArrayIndexOutOfBoundsException”异常,这是代码在尝试访问不在数组的索引取值范围内的元素时会显示的运行时错误消息。
6、以下两个打印,分别输出什么结果:
double amount1=2.0;
double amount2=1.1;
double amount3=0.9;
System.out.println(amount1-amount2==amount3);
BigDecimal damount1=newBigDecimal("2.0");
BigDecimal damount2=newBigDecimal("1.1");
BigDecimal damount3=newBigDecimal("0.9");
System.out.println(damount1.subtract(damount2).equals(damount3));
7、jsp和servlet有何区别?
jsp在本质上就是servlet但是两者的创建方式不一样。
servlet完全是Java程序代码构成擅长于流程控制和事务处理,而通过jsp来生成动态网页;jsp由HTML代码和JSP标签构成,可以方便地编写动态网页。
因此在实际应用中采用servlet来控制业务流程,而采用JSP来生成动态网页。在struts框架中,jsp位于MVC设计模式的视图层,而servlet位于控制层。
8、以下说法错误的是?(A)
A.session存在服务器,cookie存在硬盘
B.session机制采用的是服务器端保持状态,但是在应用过程中借助于cookie机制来达到保存标识的目的,从而实现用户登录
C.cookie只与你的主机(域)有关,与select和jsp页面无关
D.cookie中不能直接存取java对象,session中可以存对象
9、下面关于forward和redirect的描述,不正确的是?(D)
A.执行forward时,浏览器不知道服务器发送的内容从何而来,地址栏还是原来的地址
B.执行forward时,服务器端告诉浏览器重新去请求地址
C.forward是内部重定向,redirect是外部重定向
D.forward是服务器将控制权转交给另一个内部服务器对象,由新的对象来全权负责响应用户的请求
10、http请求中,get和post的区别?
(1)get是从服务器上获取数据,post是向服务器传送数据。 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(2)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
(3) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(4)安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
11、Spring和Hibernate整合过程中各对象(BO为业务模型)注入的顺序是?(C)
A.DateSource->SessionFactory->Biz->DAO B.SessionFactory->DateSource->DAO->BO
C.DateSource->SessionFactory->DAO->BO D.SessionFactory->DateSource->Biz->DAO
12、所有通过英语六级考试的学生都参加了学校的英语俱乐部,王进参加了英语俱乐部,所以他一定通过了英语六级考试。以下哪项最好的指出了上述论证的逻辑错误?(C)
A.部分通过英语六级考试的学生没有参加英语俱乐部
B.王进参加英语俱乐部是因为他符合加入俱乐部的基本条件
C.有些参加英语俱乐部的学生还没有通过英语六级考试
D.王进曾经获得过年级英语演讲比赛第一名
13、Spring实现ioc是基于何种底层java技术?
基于java的反射机制 , 在spring初始化的时候 , 初始化所有bean , 然后在应用程序需要的时候 , 通过反射机制来获取。
14、为什么有时需要连接池?列出一个连接池的实例,举例说明使用连接池的好处。
使用连接池是为了提升操作数据库的效率,使用连接池就好比一些东西已经造好等着你来用就行了,不使用连接池就像是你在用他们之前还要先造好然后再拿去用,这比不用连接池要耗费更多的时间。
package test;
import java.sql.*;
import java.util.*;
public class DBConnpool
{
private int inUse = 0;
private Vector
connections = new Vector
();
private String poolname = "dbconnpool";
private String dbid = "jdbc:mysql://localhost:3306/teasystem";
private String drivername = "com.mysql.jdbc.Driver";
private String username = "root";
private String password = "123";
private int maxconn = 5000;
public DBConnpool(){ }
public void setdbid(String dbid)
{ this.dbid = dbid; }
public void setusername(String username)
{ this.username = username; }
public void setpassword(String password)
{ this.password = password; }
public void setmaxconn(int maxconn)
{ this.maxconn = maxconn; }
public String getdbid()
{ return dbid; }
public String getusername()
{ return username; }
public String getpassword()
{ return password; }
public int getmaxconn()
{ return maxconn; }
//将连接返还给连接池
public synchronized void reConnection(Connection conn)
{ Connection con = conn;
connections.addElement(con);
inUse--;
}
//从连接池获取一个连接
public synchronized Connection getConnection()
{
Connection con = null;
if(connections.size()>0)
{
con = (Connection)connections.elementAt(0);
connections.removeElementAt(0);
try{
if(con.isClosed())
{ con = getConnection(); }
}catch(Exception e){
e.printStackTrace();
}
}else if(maxconn == 0||inUse
<maxconn)
{ con = newConnection(); }
if(con != null)
{ inUse++; }
return con;
}
private Connection newConnection()
{
Connection con = null;
try{
Class.forName(drivername);
con = DriverManager.getConnection(dbid,username,password);
}catch(Exception e){
e.printStackTrace();
return null;
}
return con;
}
public synchronized void closeConn()
{
Enumeration allConnections = connections.elements();
while(allConnections.hasMoreElements())
{
Connection con = (Connection)allConnections.nextElement();
try{
con.close();
}catch(SQLException e){
e.printStackTrace();
} } } }
使用连接池,把暂时不使用的链接放入连接池,到需要使用的时候,从连接池中取出链接使用。
15、以下给定的数组,如何最简单的把每个值都打印出来?
String[] arry=new String[]{"john","Marry","Bob"};
System.out.println(Array.toString(arry));
16、java项目中引入了一个第三方库,运行到某段代码过程中抛出NoClassDefFoundError或NoSuchMethodError,这个问题如何产生的,你如何解决这个问题?
17、有一个字符串需要判断,条件如下:必须有至少1位数字,有1位字母,10位以上。你用何种技术实现这种判断?
if(/^\d+$/.test(str)) { 全为数字,执行... }当然你也可以用isNaN来判断if(isNaN(str)){ str是个数字,执行...}
18、Chrome浏览器用于调试的快捷键是什么?
F12
19、Chrome浏览器调试面板中,Elemets,Network,Resources分别是什么用途?
Elements 是页面html元素,
Network 是页面加载的时候网络资源加载情况
Resource 是网站的网页资源文件,包括css、js等
20、Eclipse中,让一个java程序看起来更易读的快捷键是什么?
Ctrl+Shift+F
21、简单说说什么是stack trace。
stack trace叫做堆栈轨迹:如果你需要打印出某个时间的调用堆栈状态,你将产生一个堆栈轨迹。
stack trace 中包括三部分,分别为:.bss .text .data
bss: 表示程序中未初始化的全局变量的一块内存区域
text: 表示程序中已初始化的全局变量的一块内存区域
data:表示存放程序执行代码的一块内存区域
</maxconn)
java中 List 与Set 有什么区别?
Java的集合类都位于java.util包中,Java集合中存放的是对象的引用,而非对象本身。\x0d\x0a\x0d\x0aJava集合主要分为三种类型:\x0d\x0aa.Set(集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按特定方式排序。\x0d\x0ab.List(列表):集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象。\x0d\x0ac.Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。它的有些实现类能对集合中的键对象进行排序。\x0d\x0a\x0d\x0aSet、List和Map统称为Java集合。\x0d\x0a\x0d\x0a1.Set(集)\x0d\x0aSet集合中的对象不按特定方式排序,并且没有重复对象。Set接口主要有两个实现类HashSet和TreeSet。HashSet类按照哈希算法来存取集合中的对象,存取速度比较快。HashSet类还有一个子类LinkedHashSet类,它不仅实现了哈希算法,而且实现了链表数据结构。TreeSet类实现了SortedSet接口,具有排序功能。\x0d\x0a\x0d\x0aSet的add()方法判断对象是否已经存在于集合中的判断流程:\x0d\x0aboolean isExists = false;\x0d\x0aIterator it = set.iterator();\x0d\x0awhile(it.hasNext()){\x0d\x0a Object object = it.next();\x0d\x0a if(newObject.equals(oldObject)){\x0d\x0a isExists = true;\x0d\x0a break;\x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0a2.HashSet类\x0d\x0a当HashSet向集合中加入一个对象时,会调用对象的hashCode()方法获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。\x0d\x0a\x0d\x0a当Object1变量和object2变量实际上引用了同一个对象,那么object1和object2的哈希码肯定相同。\x0d\x0a\x0d\x0a为了保证HashSet能正常工作,要求当两个对象用equals()方法比较的结果为相等时,它们的哈希码也相等。即:\x0d\x0acustomer1.hashCode() == customer2.hashCode();\x0d\x0a\x0d\x0a如:对应于Customer类的以下重写后的equals()方法:\x0d\x0a\x0d\x0apublic boolean equals(Object o){\x0d\x0a if(this==o) return true;\x0d\x0a if(!o instanceof Customer) return false;\x0d\x0a final Customer other = (Customer)o;\x0d\x0a if(this.name.equals(other.getName())&&this.age==other.getAge())\x0d\x0a return true;\x0d\x0a else \x0d\x0a return false;\x0d\x0a}\x0d\x0a\x0d\x0a为了保证HashSet正常工作,如果Customer类覆盖了equals()方法,也应该覆盖hashCode()方法,并且保证两个相等的Customer对象的哈希码也一样。\x0d\x0a\x0d\x0apublic int hashCode(){\x0d\x0a int result;\x0d\x0a result = (name==null?0:name.hashCode());\x0d\x0a result = 29*result+(age==null?0:age.hashCode());\x0d\x0a return result;\x0d\x0a}\x0d\x0a\x0d\x0a3.TreeSet类\x0d\x0a\x0d\x0aTreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。TreeSet支持两种排序方式:自然排序和客户化排序,在默认情况下TreeSet采用自然排序方式。\x0d\x0a\x0d\x0aa.自然排序\x0d\x0a在JDK中,有一部分类实现了Comparable接口,如Integer、Double和String等。Comparable接口有一个compareTo(Object o)方法,它返回整数类型。对于表达式x.compareTo(y),如果返回值为0,表示x和y相等,如果返回值大于0,表示x大于y,如果返回值小于0,表示x小于y。\x0d\x0a\x0d\x0aTreeSet调用对象的compareTo()方法比较集合中对象的大小,然后进行升序排列,这种排序方式称为自然排序。\x0d\x0a\x0d\x0a以下列出了JDK中实现了Comparable接口的一些类的排序方式\x0d\x0a类 排序\x0d\x0aBigDecimal\BigInteger\Byte\Double\Float\Integer\Long\Short 按数字大小排序\x0d\x0aCharacter 按字符的Unicode值的数字大小排序\x0d\x0aString 按字符串中字符的Unicode值排序\x0d\x0a\x0d\x0a使用自然排序时,只能向TreeSet集合中加入同类型的对象,并且这些对象的类必须实现了Comparable接口,否则会在第二次调用TreeSet的add()方法时,会抛出ClassCastException异常。\x0d\x0a\x0d\x0a例如:\x0d\x0a以下是Customer类的compareTo()方法的一种实现方式:\x0d\x0apublic int compareTo(Object o){\x0d\x0a Customer other = (Customer)o;\x0d\x0a \x0d\x0a //先按照name属性排序\x0d\x0a if(this.name.compareTo(other.getName())>0) return 1;\x0d\x0a if(this.name.compareTo(other.getName())other.getAge()) return 1;\x0d\x0a if(this.age0) return -1;\x0d\x0a if(c2.getName().compareTo(c2.getName())<0) return 1;\x0d\x0a\x0d\x0a return 0;\x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0a接下来在构造TreeSet的实例时,调用它的TreeSet(Comparator comparator)构造方法:\x0d\x0aSet set = new TreeSet(new CustomerComparator());\x0d\x0a\x0d\x0a4.向Set中加入持久化类的对象\x0d\x0a\x0d\x0a例如两个Session实例从数据库加载相同的Order对象,然后往HashSet集合里存放,在默认情况下,Order类的equals()方法比较两个Orer对象的内存地址是否相同,因此order1.equals(order2)==false,所以order1和order2游离对象都加入到HashSet集合中,但实际上order1和order2对应的是ORDERS表中的同一条记录。对于这一问题,有两种解决方案:\x0d\x0a\x0d\x0a(1)在应用程序中,谨慎地把来自于不同Session缓存的游离对象加入到Set集合中,如:\x0d\x0aSet orders = new HashSet();\x0d\x0aorders.add(order1);\x0d\x0aif(!order2.getOrderNumber().equals(order1.getOrderNumber()))\x0d\x0a order.add(order2);\x0d\x0a\x0d\x0a(2)在Order类中重新实现equals()和hashCode()方法,按照业务主键比较两个Order对象是否相等。\x0d\x0a\x0d\x0a提示:为了保证HashSet正常工作,要求当一个对象加入到HashSet集合中后,它的哈希码不会发生变化。\x0d\x0a\x0d\x0a5.List(列表)\x0d\x0a\x0d\x0aList的主要特征是其对象以线性方式存储,集合中允许存放重复对象。List接口主要的实现类有LinkedList和ArrayList。LinkedList采用链表数据结构,而ArrayList代表大小可变的数组。List接口还有一个实现类Vector,它的功能和ArrayList比较相似,两者的区别在于Vector类的实现采用了同步机制,而ArrayList没有使用同步机制。\x0d\x0a\x0d\x0aList只能对集合中的对象按索引位置排序,如果希望对List中的对象按其他特定方式排序,可以借助Comparator和Collections类。Collections类是集合API中的辅助类,它提供了操纵集合的各种静态方法,其中sort()方法用于对List中的对象进行排序:\x0d\x0aa.sort(List list):对List中的对象进行自然排序。\x0d\x0ab.sort(List list,Comparator comparator):对List中的对象进行客户化排序,comparator参数指定排序方式。\x0d\x0a\x0d\x0a如Collections.sort(list);\x0d\x0a\x0d\x0a6.Map(映射)\x0d\x0a\x0d\x0aMap(映射)是一种把键对象和值对象进行映射的集合,它的每一个元素都包含一对键对象和值对象,而值对象仍可以是Map类型,依次类推,这样就形成了多级映射。\x0d\x0a\x0d\x0aMap有两种比较常用的实现:HashMap和TreeMap。HashMap按照哈希算法来存取键对象,有很好的存取性能,为了保证HashMap能正常工作,和HashSet一样,要求当两个键对象通过equals()方法比较为true时,这两个对象的hashCode()方法返回的哈希码也一样。\x0d\x0a\x0d\x0aTreeMap实现了SortedMap接口,能对键对象进行排序。和TreeSet一样,TreeMap也支持自然排序和客户化排序两种方式。\x0d\x0a\x0d\x0a例:创建一个缓存类EntityCache,它能粗略地模仿Session的缓存功能,保证缓存中不会出现两个OID相同的Customer对象或两个OID相同的Order对象,这种惟一性是由键对象的惟一性来保证的。\x0d\x0a\x0d\x0aKey.java:\x0d\x0a\x0d\x0apackage mypack;\x0d\x0a\x0d\x0apublic class Key{\x0d\x0a private Class classType;\x0d\x0a private Long id;\x0d\x0a\x0d\x0a public Key(Class classType,Long id){\x0d\x0a this.classType = classType;\x0d\x0a this.id = id;\x0d\x0a }\x0d\x0a\x0d\x0a public Class getClassType(){\x0d\x0a return this.classType;\x0d\x0a }\x0d\x0a\x0d\x0a public Long getId(){\x0d\x0a return this.id;\x0d\x0a }\x0d\x0a\x0d\x0a public boolean equals(Object o){\x0d\x0a if(this==o) return true;\x0d\x0a if(!(o instanceof Key)) return false;\x0d\x0a final Key other = (Key)o;\x0d\x0a if(classType.equals(other.getClassType())&&id.equals(other.getId()))\x0d\x0a return true;\x0d\x0a return false;\x0d\x0a }\x0d\x0a\x0d\x0a public int hashCode(){\x0d\x0a int result;\x0d\x0a result = classType.hashCode();\x0d\x0a result = 29 * result + id.hashCode();\x0d\x0a return result;\x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0aEntityCache.java:\x0d\x0a\x0d\x0apackage mypack;\x0d\x0aimport java.util.*;\x0d\x0apublic class EntityCache {\x0d\x0a private Map entitiesByKey;\x0d\x0a public EntityCache() {\x0d\x0a entitiesByKey=new HashMap();\x0d\x0a }\x0d\x0a\x0d\x0a public void put(BusinessObject entity){\x0d\x0a Key key=new Key(entity.getClass(),entity.getId());\x0d\x0a entitiesByKey.put(key,entity);\x0d\x0a }\x0d\x0a\x0d\x0a public Object get(Class classType,Long id){\x0d\x0a Key key=new Key(classType,id);\x0d\x0a return entitiesByKey.get(key);\x0d\x0a }\x0d\x0a\x0d\x0a public Collection getAllEntities(){\x0d\x0a return entitiesByKey.values();\x0d\x0a }\x0d\x0a public boolean contains(Class classType,Long id){\x0d\x0a Key key=new Key(classType,id);\x0d\x0a return entitiesByKey.containsKey(key);\x0d\x0a }\x0d\x0a}