1.定义罪犯Criminal类,height(身高)/weight(体重)/blood(血型)/home(籍贯)属性。

重写hashcode和equals,使用四个属性的组合进行实现。

创建HashSet集合,里面存放20个Criminal对象,其中O型血2人,A型血3人,B型血4人,AB型血1人,其余血型不详。

注意:hashcode()方法实现时,要求身高、体重、和血型三个属性合成一个数字,实现两两比较的高效算法。


2.Map:

-----------

key(键) - value(值) :kv对.


创建HashMap,Person为key,Dog为value。

存放100元素,遍历map集合,两种方式。EntrySet + KeySet.

删除操作。remove();


3.HashTable:线程安全的。

---------------


=================================================================

1.

package com.it18zhang11.job;



public class Criminal {


private int height;

private int weight;

private int blood;

private String home;


public Criminal(int height, int weight, int blood) {

if (height <= 0) {

System.out.println("身高不能为负数 ");

System.exit(-1);

} else if (weight <= 0) {

System.out.println("体重不能为负数 ");

System.exit(-1);

} else if (blood > 3 || blood < 0) {

System.out.println("血型,必须为0-3之间的值 ");

System.exit(-1);

} else {

this.height = height;

this.weight = weight;

this.blood = blood;

}


}


public int getHeight() {

return height;

}


public void setHeight(int height) {

this.height = height;

}


public int getWeight() {

return weight;

}


public void setWeight(int weight) {

this.weight = weight;

}


public int getBlood() {

return blood;

}


public void setBlood(int blood) {

this.blood = blood;

}


public String getHome() {

return home;

}


public void setHome(String home) {

this.home = home;

}


/**

* 重写hashcode方法

*/

@Override

public int hashCode() {

int i0 = 0 << 24;

int i1 = (ArrayTools.int2Bytes(height)[0] & 0xff) << 16;

int i2 = (ArrayTools.int2Bytes(weight)[0] & 0xff) << 8;

int i3 = (ArrayTools.int2Bytes(blood)[0] & 0xff) << 0;


int newResult = i0 | i1 | i2 | i3;


return home == null ? newResult : newResult + home.hashCode();

}


@Override

public boolean equals(Object obj) {

if (obj == null)

return false;

if (obj == this)

return true;


// 精准判断

if (obj.getClass() == Criminal.class) {

Criminal c = (Criminal) obj;


if (c.height == this.height && c.weight == this.weight

&& c.blood == this.blood) {

return true;

}

}


return false;

}


}



package com.it18zhang11.job;


public class ArrayTools {


/**

* 整数转换为字节数组 ;向右移位,然后强转截断。

*/

public static byte[] int2Bytes(int i) {

byte[] bytes = new byte[4];

bytes[0] = (byte) i;// 低位

bytes[1] = (byte) (i >> 8);// 次低位

bytes[2] = (byte) (i >> 16);// 次高位

bytes[3] = (byte) (i >> 24); // 高位

return bytes;

}


/**

* 字节数组 转 为整数 ,向左移位,由于向左移位,先转换为整数 ,缺的用符号位补齐,故用&0xFF去除

*/

public static int bytes2Int(byte[] bytes) {

int i0 = bytes[3] << 24;

int i1 = (bytes[2] & 0xFF) << 16;

int i2 = (bytes[1] & 0xFF) << 8;

int i3 = (bytes[0] & 0xFF) << 0;

return i0 | i1 | i2 | i3;

}

}


package com.it18zhang11.job;


import java.util.HashSet;

import java.util.Set;


public class HashSetTest {


public static void main(String[] args) {


Set<Criminal> cSet = new HashSet<Criminal>();


Criminal c1 = new Criminal(180, 170, 2);

Criminal c2 = new Criminal(170, 180, 0);

Criminal c3 = new Criminal(160, 180, 1);

Criminal c4 = new Criminal(150, 180, 3);

Criminal c5 = new Criminal(150, 180, 3);


cSet.add(c1);

cSet.add(c2);

cSet.add(c3);

cSet.add(c4);

cSet.add(c5);


System.out.println(c1.equals(c2));

System.out.println(c5.equals(c4));

for (Criminal c : cSet) {

out(c);

}


}


public static void out(Criminal c) {

String blood = "";

switch (c.getBlood()) {

case 0:

blood = "A";

break;

case 1:

blood = "B";

break;

case 2:

blood = "AB";

break;

case 3:

blood = "O";

break;

}


System.out.println("身高:" + c.getHeight() + "\t 体重: " + c.getWeight()

+ "\t" + "血型:" + blood);

}


}

2.

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;


public class HashMapTest {

public static void main(String[] args) {

Map<Person, Dog> map = new HashMap<Person, Dog>();

List<Person> keys = new ArrayList<Person>();

for (int i = 0; i < 100; i++) {

Person p = new Person("person" + i, i);

map.put(p, new Dog("dog" + i, i));

keys.add(p);

}

System.out.println("-----------keySet-------------");

for (Person p : map.keySet()) {

System.out.println(p.getName() + "    " + map.get(p).getName());

}

System.out.println("-----------EntrySet-------------");

for (Entry<Person, Dog> entry : map.entrySet()) {

System.out.println(entry.getKey().getName() + "    "

+ entry.getValue().getName());

}

System.out.println("-----------before remove-------------map.size  :  " + map.size());

for (Person p : keys) {

map.remove(p);

}

System.out.println("-----------after remove-------------map.size  :  " + map.size());

}


}



package com.it18zhang11.job;


/**

 * hashcode + equlas

 */

public class Person {

private String name;

private int age;

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

//

public int hashCode() {

//System.out.println(super.hashCode());

return name == null ?age : name.hashCode() + age ;

}

public boolean equals(Object obj) {

if(obj == null)

return false ;

if(obj == this)

return true ;

//精准判断

if(obj.getClass() == Person.class){

Person p = (Person)obj;

//name是否相同

boolean nameEqu = false ;

if(this.name == null){

if(p.name == null){

nameEqu =true ;

}

else{

nameEqu = false ;

}

}

//name 不null

else{

nameEqu = name.equals(p.name);

}

//age 是否相同

boolean ageEqu = (this.age == p.age) ;

//

return nameEqu && ageEqu ;

}

return false ;

}

}



package com.it18zhang11.job;


/**

 * 

 */

public class Dog {


private String name;

private int age;


public Dog() {

}


public Dog(String name, int age) {

this.name = name;

this.age = age;

}


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public int getAge() {

return age;

}


public void setAge(int age) {

this.age = age;

}

}

3.

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Hashtable;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;



public class HashTableTest {

public static void main(String[] args) {

Map<Person, Dog> map = new Hashtable<Person, Dog>();

List<Person> keys = new ArrayList<Person>();

for (int i = 0; i < 100; i++) {

Person p = new Person("person" + i, i);

map.put(p, new Dog("dog" + i, i));

keys.add(p);

}

System.out.println("-----------keySet-------------");

for (Person p : map.keySet()) {

System.out.println(p.getName() + "    " + map.get(p).getName());

}

System.out.println("-----------EntrySet-------------");

for (Entry<Person, Dog> entry : map.entrySet()) {

System.out.println(entry.getKey().getName() + "    "

+ entry.getValue().getName());

}

System.out.println("-----------before remove-------------map.size  :  " + map.size());

for (Person p : keys) {

map.remove(p);

}

System.out.println("-----------after remove-------------map.size  :  " + map.size());

}


}