`

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谜题(CHM)

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

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

    Java Puzzlers是由Java之父James Gosling等人共同创作的一系列挑战性问题,这些问题通常会在代码中引发非预期的行为,而这些行为对于有经验的开发者来说可能也是出乎意料的。 Java是一种广泛使用的面向对象的编程...

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

    ### JAVA解惑中的关键知识点解析 #### 谜题1:奇数性的判断 在《JAVA解惑》一书中,作者通过一系列实例介绍了Java编程语言中的一些不易掌握的知识点。其中一个例子是关于如何正确判断一个整数是否为奇数。 **原始...

    java 解惑 java 解惑 java 解惑

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

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

    在《Java解惑》中,初学者可以学习到以下关键知识点: 1. **基础语法**:了解Java的基本数据类型(如整型、浮点型、字符型、布尔型),变量声明,常量定义,运算符,流程控制(如if语句、switch语句、循环结构),...

    java解惑 PDF版

    文档《java解惑 PDF版》中列举了95个这样的谜题,每个谜题都旨在帮助开发者理解并纠正一些常见的错误理解。以下是根据提供的部分内容解析的几个相关知识点。 ### 表达式谜题与取余操作符(%)的行为 在Java中,...

    java谜题解惑 中文chm

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

    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解惑 中文版

    9. **Java教程**:除了解惑,本书还适合作为Java初学者的教程,从基础语法到高级特性,全面介绍Java编程。 通过阅读《Java解惑中文版》,读者不仅可以解答编程中遇到的困惑,还能系统提升自己的Java技术水平,编写...

    JAVA 解惑 java经典

    "JAVA解惑"的主题针对的是Java学习过程中遇到的一些常见问题和难点,旨在帮助开发者深入理解和解决这些问题。以下是基于这个主题和描述可能涵盖的一些关键知识点: 1. **Java基础**:这可能包括变量、数据类型、...

    java解惑 书籍类 谜题

    ### Java解惑 书籍类 谜题 #### Java谜题1——表达式谜题 **谜题1:奇数性** 本节讨论了一个看似简单的Java方法,旨在判断一个整数是否为奇数: ```java public static boolean isOdd(int i) { return i % 2 ==...

    Java解惑.pdf

    Java编程语言是世界上最流行的开发平台之一,广泛应用于企业级应用、移动应用(尤其是Android系统)、大数据处理、云计算等领域。这份“Java解惑.pdf”文档很可能包含了解决Java开发者在编程过程中遇到的常见问题和...

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

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

    "java解惑" PDF版本

    "java解惑" PDF版本

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

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

Global site tag (gtag.js) - Google Analytics