• java基金会成立Set


    1、设置

    当向集合Set中添加对象时。首先集合计算要添加对象的hashcode,依据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set觉得该对象在集合中不存在,直接添加进去。假设在该位置有一个对象存在。接着将准备添加到集合中的的对象与该位置上的对象进行equals比較。若返回false,在进行一次散列。将该对象放到散列后计算出的新地址。若返回true,不会再将该对象添加到集合中

     

    2、当重写equals方法时,必需要重写hashcode方法

    假设一个类的两个对象。使用equals方法比較时。结果为true,那么这两个对象必须具有同样的hashcode


    3、请參考下面代码执行。查看输出结果来理解以上说法

    test1和test2比較的是String,因为String重写了equals方法和hashcode方法。所以,String = “abc"。和 string = new String("abc")比較equals方法时候是返回true,因此test1和test2输出结果一致。Person类没有重写equals方法。而Person1重写了,所以test3和test4输出结果不一致。

    /**
     * author Ding Chengyun
     * 2014-2-23
     */
    package test;
    
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    
    /**
     * @author Ding Chengyun
     * 2014-2-23
     */
    public class SetTest {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		test4();
    	}
    	
    	public static void test1() {
    		Set<String> s1 = new HashSet<String>();
    		s1.add("abc");
    		s1.add("xyz");
    		s1.add("abc");
    		for (Iterator<String> iter = s1.iterator(); iter.hasNext();) {
    			System.out.println(iter.next());
    		}
    //		输出:
    //		abc
    //		xyz
    	}
    	
    	public static void test2() {
    		Set<String> s1 = new HashSet<String>();
    		s1.add(new String("abc"));
    		s1.add(new String("xyz"));
    		s1.add(new String("abc"));
    		for (Iterator<String> iter = s1.iterator(); iter.hasNext();) {
    			System.out.println(iter.next());
    		}
    		
    //		输出:
    //		abc
    //		xyz
    
    	}
    	
    	public static void test3() {
    		Set<Person> s = new HashSet<Person>();
    		s.add(new Person("zhangsan"));
    		s.add(new Person("lisi"));
    		s.add(new Person("zhangsan"));
    		for (Iterator<Person> iter = s.iterator(); iter.hasNext();) {
    			System.out.println(iter.next().getName());
    		}
    		
    //		输出:
    //		zhangsan
    //		zhangsan
    //		lisi
    
    	}
    
    	public static void test4() {
    		Set<Person1> s = new HashSet<Person1>();
    		s.add(new Person1("zhangsan"));
    		s.add(new Person1("lisi"));
    		s.add(new Person1("zhangsan"));
    		for (Iterator<Person1> iter = s.iterator(); iter.hasNext();) {
    			System.out.println(iter.next().getName());
    		}
    //		输出:
    //		lisi
    //		zhangsan
    	}
    }
    
    class Person {
    	String name;
    	public Person(String name) {
    		this.name = name;
    	}
    	public String getName() {
    		return name;
    	}
    }
    
    class Person1 {
    	String name;
    	public Person1(String name) {
    		this.name = name;
    	}
    	public String getName() {
    		return name;
    	}
    	
    	public boolean equals(Object obj) {
    		if (this == obj) {
    			return true;
    		}
    		if (obj instanceof Person1) {
    			Person1 p = (Person1)obj;
    			if (this.name.equals(p.getName())) {
    				return true;
    			}
    		}
    		return false;
    	}
    	
    	public int hashCode() {
    		return name.hashCode();
    	}
    }


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    流媒体传输协议之 RTP(下篇)
    我在春晚现场护航直播
    【邀请有礼】全球视频云创新挑战赛邀请有礼:参与 100% 获得 “壕” 礼,更有机会获得 JBL 音箱、Cherry 机械键盘
    流媒体传输协议之 RTMP
    WebRTC 音视频同步原理与实现
    阿里云联手 Intel 举办首届视频云挑战赛,40 万奖金邀你来战!
    你真的懂 MP4 格式吗?
    如何用 4 个小时搭建一个新 “Clubhouse” ,引爆声音社交新风口
    流媒体传输协议之 RTP (上篇)
    POJ 1655 Balancing Act【树形DP】POJ 1655 Balancing Act Balancing Act POJ 1655
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4653475.html
Copyright © 2020-2023  润新知