為什么不能將實(shí)數(shù)作為 HashMap 的 key?
Given?n?points?on?a?2D?plane,?find?the?maximum?number?of?points?that?lie?on?the?same?straight?line.
import?java.util.HashMap;import java.util.Map;//class?Point?{//????int?x;//????int?y;//????Point(int?a,?int?b)?{?x?=?a;?y?=?b;?}//}public?class?Solution?{????public?int?maxPoints(Point[]?points)?{????????if?(points.length?<=?2)?{????????????return?points.length;????????}????????int?max?=?2;????????for?(int?i?=?0;?i?1;?i++)?{????????????Map?map?=?new?HashMap<>(16); ????????????//?記錄垂直點(diǎn)數(shù);?當(dāng)前和Points[i]在一條線上的最大點(diǎn)數(shù);?和Points[i]垂直的點(diǎn)數(shù)????????????int?ver?=?0,?cur,?dup?=?0;????????????for?(int?j?=?i?+?1;?j?????????????????if?(points[j].x?==?points[i].x)?{????????????????????if?(points[j].y?!=?points[i].y)?{????????????????????????ver++;????????????????????}?else?{????????????????????????dup++;????????????????????}????????????????}?else?{????????????????????float?d?=?(float)((points[j].y?-?points[i].y)?/?(double)?(points[j].x?-?points[i].x));????????????????????map.put(d,?map.get(d)?==?null???1?:?map.get(d)?+?1);????????????????}????????????}????????????cur?=?ver;????????????for?(int?v?:?map.values())?{????????????????cur?=?Math.max(v,?cur);????????????}????????????max?=?Math.max(max,?cur?+?dup?+?1);????????}????????return?max;????}}
public?static?void?main(String[]?args)?{????int[][]?vals?=?{{2,3},{3,3},{-5,3}};????Point[]?points?=?new?Point[3];????for?(int?i=0;?i????????points[i]?=?new?Point(vals[i][0],?vals[i][1]);????}????Solution?solution?=?new?Solution();????System.out.println(solution.maxPoints(points));}
System.out.println(0.0 == -0.0);
map.put(d, map.get(d) == null ? 1 : map.get(d) + 1);
public?V?get(Object?key)?{????Node?e; ????return?(e?=?getNode(hash(key),?key))?==?null???null?:?e.value;}
static?final?int?hash(Object?key)?{????int?h;????return?(key?==?null)???0?:?(h?=?key.hashCode())?^?(h?>>>?16);}
public native int hashCode();
public?static?void?main(String[]?args)?{????????System.out.println(0.0?==?-0.0);????????System.out.println(new?Float(0.0).hashCode()?==?????????????new?Float(-0.0).hashCode());}
在程序執(zhí)行期間,只要equals方法的比較操作用到的信息沒有被修改,那么對(duì)這同一個(gè)對(duì)象調(diào)用多次,hashCode方法必須始終如一地返回同一個(gè)整數(shù)。
如果兩個(gè)對(duì)象根據(jù)equals方法比較是相等的,那么調(diào)用兩個(gè)對(duì)象的hashCode方法必須返回相同的整數(shù)結(jié)果。
如果兩個(gè)對(duì)象根據(jù)equals方法比較是不等的,則hashCode方法不一定得返回不同的整數(shù)。——《effective java》
System.out.println(new?Float(0.0).equals(0.0f));System.out.println(new Float(0.0).equals((float) -0.0));
public?boolean?equals(Object?obj)?{????return?(obj?instanceof?Float)???????????&&?(floatToIntBits(((Float)obj).value)?==????????????????????floatToIntBits(value));}
/*** Returns a representation of the specified floating-point value* according to the IEEE 754 floating-point "single format" bit* layout.**Bit 31 (the bit that is selected by the mask
* {@code 0x80000000}) represents the sign of the floating-point* number.* Bits 30-23 (the bits that are selected by the mask* {@code 0x7f800000}) represent the exponent.* Bits 22-0 (the bits that are selected by the mask* {@code 0x007fffff}) represent the significand (sometimes called* the mantissa) of the floating-point number.**If the argument is positive infinity, the result is
* {@code 0x7f800000}.**If the argument is negative infinity, the result is
* {@code 0xff800000}.**If the argument is NaN, the result is {@code 0x7fc00000}.
**In all cases, the result is an integer that, when given to the
* {@link #intBitsToFloat(int)} method, will produce a floating-point* value the same as the argument to {@code floatToIntBits}* (except all NaN values are collapsed to a single* "canonical" NaN value).** @param value a floating-point number.* @return the bits that represent the floating-point number.*/public static int floatToIntBits(float value) {int result = floatToRawIntBits(value);// Check for NaN based on values of bit fields, maximum// exponent and nonzero significand.if (((result & FloatConsts.EXP_BIT_MASK) ==FloatConsts.EXP_BIT_MASK) &&(result & FloatConsts.SIGNIF_BIT_MASK) != 0)result = 0x7fc00000;return result;}
當(dāng)浮點(diǎn)運(yùn)算產(chǎn)生一個(gè)非常接近0的負(fù)浮點(diǎn)數(shù)時(shí),會(huì)產(chǎn)生“-0.0”,而這個(gè)浮點(diǎn)數(shù)不能正常表示
System.out.println(Float.floatToIntBits((float)?0.0));System.out.println(Float.floatToIntBits((float)?-0.0));System.out.println(Float.floatToRawIntBits(0.0f));System.out.println(Float.floatToRawIntBits((float)-0.0));
0-21474836480-2147483648
(完)
?關(guān)注公眾號(hào):Java后端編程,回復(fù)下面關(guān)鍵字?
要Java學(xué)習(xí)完整路線,回復(fù)??路線?
缺Java入門視頻,回復(fù):?視頻?
要Java面試經(jīng)驗(yàn),回復(fù)??面試?
缺Java項(xiàng)目,回復(fù):?項(xiàng)目?
進(jìn)Java粉絲群:?加群?
PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。
(完) 加我"微信"?獲取一份 最新Java面試題資料 請(qǐng)備注:666,不然不通過~
最近好文
1、再見了,收費(fèi)的XShell,我改用國(guó)產(chǎn)良心工具!
3、SpringBoot快速開發(fā)利器:Spring Boot CLI
最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。 獲取方式:關(guān)注公眾號(hào)并回復(fù)?java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。 明天見(??ω??)??
