package 作业;
//定义罪犯Criminal类,height(身高)/weight(体重)/blood(血型)/home(籍贯)属性。
//重写hashcode和equals,使用四个属性的组合进行实现。
//创建HashSet集合,里面存放20个Criminal对象,其中O型血2人,A型血3人,B型血4人,AB型血1人,其余血型不详。
//注意:hashcode()方法实现时,要求身高、体重、和血型三个属性合成一个数字,实现两两比较的高效算法。
import java.util.HashSet;
import java.util.Set;
class Criminal{
private int height;
private int weight;
private int blood;
private String home;//籍贯
//带参构造
//注意:hashcode()方法实现时,要求身高、体重、和血型三个属性合成一个数字,实现两两比较的高效算法。
public Criminal(int height,int weight,int blood){
if(height<=0){
System.out.println("身高不能为负数");
System.exit(-1);
//public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非零的状态码表示异常终止。
}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;
}
}
//get,set方法
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和equals,使用四个属性的组合进行实现。
* -----------------------------重写hashcode方法
*/
public int hashCode(){
//×××有32位,这里还要先写ArrayTools类
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();
}
//重写euuqals方法
public boolean equals(Object obj){
if(obj==null)
return false;
if(obj==this){
return true;
}
//精准判断
if(obj.getClass()==Criminal.class){
//public final Class extends Object> getClass()返回一个对象的运行时类。该 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
Criminal c=(Criminal)obj;
if(c.height==this.height&&c.weight==this.weight&&c.blood==this.blood){
return true;
}
}
return false;
}
}
class ArrayTools{//和重写hashCode,equals相关的工具类
/**
* ×××转换为字节数组,然后强转截断
*/
public static byte[] int2Bytes(int i){
byte[] bytes=new byte[4];//new一个长度为4的字节数组
bytes[0]=(byte)i;//低位
bytes[1]=(byte)(i>>8);//第9-16位在操作
bytes[2]=(byte)(i>>16);//17-24位的在操作
bytes[3]=(byte)(i>>24);//第25-32位的在操作
return bytes;
}
/**
* 字节数组转为整数,向左移位,由于向左移位,先转换为整数,缺的用符号位补齐,故用&0xFF去除--应该不用&0xff也可以,这里<<是无符号位移,补的是0
*
*/
public static int byte2Int(byte[] bytes){
int i0=bytes[3]<<24;//变为25-32位
int i1=(bytes[2]&0xFF)<<16;//变为17到24位----.
//F是15,就是 1111,两个ff就是1111 1111
//和他做与运算的话0000 0000 0000 0000 0000 0000 1100 0110 &1111 1111 ----还是有点没弄懂-应该不用&0xff也可以,这里<<是无符号位移,补的是0
int i2=(bytes[1]&0xFF)<<8;//变为9-16位
int i3=(bytes[0]&0xFF)<<0;//待在原位
return i0|i1|i2|i3;//32位数重新或在了一起
}
}
public class HashSetTest1 {
public static void main(String[] args) {
Set
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));//用了罪犯类里面重写的equals方法
System.out.println(c5.equals(c4));
for(Criminal c:cSet){//对cSet进行迭代,定义了一个局部变量c,来引用cSet集合的每个元素
out(c);//为这里增强for循环写一个方法
}
}
public static void out(Criminal c){
String blood="";
switch(c.getBlood()){//在构造函数里面有定义血型的数值,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-------------------------------------------】
package 作业;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
//key(键) - value(值) :kv对.
//
//创建HashMap,Person为key,Dog为value。
//存放100元素,遍历map集合,两种方式。EntrySet + KeySet.
//删除操作。remove();
/**
*
* hashcode+equals
*
*/
class Person{//Person为key,Dog为value。
private String name;
private int age;
//构造带参
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
//get,set
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;
}
//重写hashCode
public int hashCode(){
return name==null?age:name.hashCode()+age;
}
//重写equals
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是否相同
//name是null
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;
}
}
/**
* 狗
* @author Administrator
*
*/
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;
}
}
//key(键) - value(值) :kv对.
//
//创建HashMap,Person为key,Dog为value。
//存放100元素,遍历map集合,两种方式。EntrySet + KeySet.
//删除操作。remove();
public class HashMapTest2 {
public static void main(String[] args) {
Map
List
///////////////////////////////重要//////////////////////////////////////////////////////////
///////////////////////////////重要//////////////////////////////////////////////////////////
///////////////////////////////重要//////////////////////////////////////////////////////////
for(int i=0;i<100;i++){
Person p=new Person("person"+i, i);
map.put(p, new Dog("dog"+i,i));//往map里面添加元素
keys.add(p);//把person对象加入list集合列表里面
}
System.out.println("-------------------keySet----------");
for (Person p : map.keySet()) {//Set
System.out.println(p.getName()+" "+map.get(p).getName());
//public V get(Object key)返回指定键在此标识哈希映射中所映射的值,如果对于此键来说,映射不包含任何映射关系,则返回 null。-map.get(person)
}
System.out.println("-------------------EntrySet----------");
//Set
for (Entry
System.out.println(entry.getKey().getName()+" "+entry.getValue().getName());
}
//----------------
System.out.println("=-----before remover-----------map.size:"+map.size());
for(Person p:keys){
map.remove(p);//删除操作
//public V remove(Object key)如果此映射中存在该键的映射关系,则将其删除。
}
///////////////////////////////重要//////////////////////////////////////////////////////////
///////////////////////////////重要//////////////////////////////////////////////////////////
///////////////////////////////重要//////////////////////////////////////////////////////////
//重新遍历就没有了
for (Person p : map.keySet()) {//Set
System.out.println(p.getName()+" "+map.get(p).getName());
}
//for(Person p:keys){//对集合列表keys进行迭代,定义了一个局部变量p,来引用keys集合的每个元素(里面的每个元素是Person的对象)
//System.out.println(p.getName());;//删除操作----没用,就写写
//}
System.out.println("=-----after remover-----------map.size:"+map.size());
}
}
【--------------------------------作业3
package 作业; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class HashTableTest3 { public static void main(String[] args){ Mapmap=new Hashtable (); List keys=new ArrayList (); 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 person : map.keySet()) { System.out.println(person.getName()+" "+map.get(person).getName()); // public V get(Object key)返回指定键在此标识哈希映射中所映射的值,如果对于此键来说,映射不包含任何映射关系,则返回 null。-map.get(person) // System.out.println(map.get(person));//单打是地址值 } System.out.println("-------------------entryset---------"); for (Entry entry:map.entrySet() ) { // interface Entry API里面搜map,是接口 Map.Entry // Set > entrySet()返回此映射中包含的映射关系的 set 视图。 System.out.println(entry.getKey().getName()+" "+entry.getValue().getName()); //K getKey()返回与此项对应的键。 } System.out.println("-------------befor remove------map.size: "+ map.size()); for(Person p:keys){ map.remove(p); } System.out.println("-------------after remove------map.size: "+ map.size()); } }
-------------------------------------------】