`

java解惑(谜题56到。。库之谜)

阅读更多
谜题56:大问题
import java.math.BigInteger;

public class BigProblem {
	public static void main(String[] args) {
		BigInteger i = new BigInteger("5000");
		BigInteger j = new BigInteger("50000");
		BigInteger k = new BigInteger("500000");
		BigInteger total = BigInteger.ZERO;
		total.add(i);
		total.add(j);
		total.add(k);
		System.out.println(total); //0??
	}
}

你可能认为这个程序会打印出555000。可结果为0。
因为BigInteger的实例是不可变的。String、BigInteger以及包装类也是如此。不能修改它们的值。对这些类型的操作将返回新的实例。
为了得到预想结果,可修改如下:
total =	total.add(i);
total =	total.add(j);
total =	total.add(k);

谜题57:名字里有什么
import java.util.HashSet;
import java.util.Set;

public class Name {

	private final String first, last;

	public static void main(String[] args) {

		Set<Name> s = new HashSet<Name>();
		s.add(new Name("Mickey","Mouse"));
		System.out.println(s.contains(new Name("Mickey","Mouse")));
	}

	public Name(String first, String last) {
		this.first = first;
		this.last = last;
	}

	public boolean equals(Object o) {
		if (!(o instanceof Name))
			return false;
		Name n = (Name) o;
		return n.first.equals(first) && n.last.equals(last);
	}
}


Name a = new Name("Mickey","Mouse");
		Name b = new Name("Mickey","Mouse");
		System.out.println(a.equals(b)); //true,如果没有重载equals函数,结果为false
		System.out.println(a==b);//false

这里的bug在于Name违反了hashCode约定。无论何时,只要你覆写了equals方法,你就必须同时覆盖hashCode方法。
该集合是根据实例的散列值来选择散列位置的,这个散列值是通过实例的hashCode方法计算出来的。
谜题58:产生它的散列码
下面程序吸取前一个程序的教训,重载了hashCode方法,它输出什么呢?
import java.util.HashSet;
import java.util.Set;

public class Name {

	private final String first, last;

	public static void main(String[] args) {

		Set<Name> s = new HashSet<Name>();
		s.add(new Name("Mickey","Mouse"));
		System.out.println(s.contains(new Name("Mickey","Mouse")));
	}

	public Name(String first, String last) {
		this.first = first;
		this.last = last;
	}

	public boolean equals(Name n) {
		return n.first.equals(first) && n.last.equals(last);
	}
	
	public int hashCode(){
		return 31*first.hashCode()+last.hashCode(); //只要重载即可,
	}
}

输出还是false。 注意:在本题中,覆盖了hashCode方法,但没有覆盖equals方法。该类声明的equals方法的参数类型是Name,而不是Object。
HashSet类是使用equals(Object)方法来测试元素的相等性的。
谜题59:差是什么
import java.util.HashSet;
import java.util.Set;

public class Difference {


	public static void main(String[] args) {
		int vals[] = {789,678,567,456,345,234,123,012};
		for(int k = 0 ;k<vals.length;k++)
			System.out.println(vals[k]);
		
		Set<Integer> s = new HashSet<Integer>();
		for(int i =0 ;i<vals.length;i++){
			for(int j = 0;j<vals.length;j++){
				s.add(vals[i]-vals[j]);
			}
		}
		System.out.println(s.size());
	}
}

连续两个元素之差是111,以此类推,其他之差为222。。。。666,777。但是请注意012是一个八进制数。结果输出为27 = 1(0)+14(012与其他元素的差,请注意有正负两个方向)+12(111。。。。666,以及负的)。以0开头的整型字面常量将被解释为八进制数值。
分享到:
评论

相关推荐

    java解惑 java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题

    java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题 java 高级谜题 ......

    java解惑java解惑java解惑

    java解惑java解惑java解惑java解惑java解惑java解惑

    Java解惑/Java谜题(CHM)

    我整理出来的Java解惑/谜题的CHM版本,包括目录、全文搜索和收藏夹。比目前Word/PDF版本的多个目录,比TXT版本的多一些格式。-- 如果不能打开CHM,请按下面方法解决:-- 右键点击chm文档,查看属性,可以看到...

    Java解惑Java解惑

    Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑

    java解惑(java谜题)中文版的

    java解惑(java谜题)中文版的. 值得一看的JAVA资料. Java puzzlers

    JAVA解惑(JAVA谜题) 中文版(PDF)

    Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...

    java解惑 书籍类 谜题

    java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑

    Java解惑.pdf

    Java解惑.pdf Java解惑.pdf Java解惑.pdf Java解惑.pdf

    java谜题解惑 中文chm

    本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上...

    Java解惑 中文版

    Java解惑中文版 Java解惑 java健壮程序

    JAVA解惑.pdf

    JAVA解惑.pdf JAVA解惑.pdf JAVA解惑.pdf

    Java解惑(谜题)CHM中英文双版本

    Java谜题8——更多的库谜题 谜题76:乒乓 谜题77:搞乱锁的妖怪 谜题78:反射的污染 谜题79:这是狗的生活 谜题80:更深层的反射 谜题81:烧焦(字符化)到无法识别 谜题82:啤酒爆炸 谜题83:诵读困难者的...

    Java PUZZLE Java 解惑

    Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑

    JAVA 解惑 java经典

    JAVA解惑,你面包括一些java经典的问题。

    Java解惑(中文版)_java_java解惑_solve65p_

    与java相关的的学习,适合初学者,可以看看

    最新版的Java-解惑

    《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》

    Java解惑 布洛克 著;陈昊鹏 译

    《Java解惑》 布洛克 著;陈昊鹏 译 扫描清晰带目录,仅供参阅,请支持正版

    《Java Pazzlers》Java解惑.pdf 书签齐全

    该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...

    java解惑 PDF版

    95个谜题,即95个java开发者常见错误,经常混淆的地方,希望对大家有所帮助,这个pdf文档超清晰

Global site tag (gtag.js) - Google Analytics