I have two objects as below:
Object obj1 = new BigDecimal(123);
Object obj2 = new Long(123);
if(obj1.equals(obj2))
System.out.println("both are equal");
else
System.out.println("both are not equal");
it is showing that both are not equal. Is it comparing based on datatype?

Is it comparing based on datatype?
Yes, exactly as it's documented to. From BigDecimal.equals:
Returns true if and only if the specified Object is a
BigDecimalwhose value and scale are equal to thisBigDecimal's.
And from Long.equals:
The result is true if and only if the argument is not null and is a
Longobject that contains the samelongvalue as this object.
It's very rarely a good idea for objects of different types to compare equal to each other - typically in an equals implementation you'll have something like:
if (getClass() != other.getClass()) {
return false;
}
Or if your class is final, you can just use:
if (!(other instanceof MyClass)) {
return false;
}
See more on this question at Stackoverflow