Set

    Set主要的特点是存放无序,List存放有序  

  HashSet  

哈希表结构

1,判断存入对象的哈希码值是否在集合中已经存在
2,如果存在,那么调用equals()方法判断对象内容是否一致
3,如果equals方法返回值为true,表示对象已经存在,那么将不在存储
4,如果equals方法返回值为false,表示对象哈希码值一致,但内容不同,可以存在另一片内存中
5,如果哈希码值不一致,将其存储到对应当前哈希码值存在的地方

必须将存入对象所在的类,重写hashCode方法与equals方法

    HashSet实例

 1 package com.qf.hashsetdemo;
 2 
 3 public class Students {
 4     private String name;
 5     private int age;
 6     public Students(String name, int age) {
 7         super();
 8         this.name = name;
 9         this.age = age;
10     }
11     @Override
12     public String toString() {
13         return "Students [name=" + name + ", age=" + age + "]";
14     }
15     
16     //重写hashCode方法
17     @Override
18     public int hashCode() {
19         //自定义一个算法
20         return this.name.hashCode()*10+age;
21     }
22     //重写equals方法
23     @Override
24     public boolean equals(Object obj) {
25         if (this == obj) {
26             return true;
27         }else{
28             if (obj instanceof Students) {
29                 Students s = (Students) obj;
30                 if(this.name.equals(s.name)&&this.age == s.age){
31                     return true;
32                 }
33             }
34         }
35         return false;
36     }
37 }

 

主程序

package com.qf.hashsetdemo;

import java.util.HashSet;

/**
 * 使用HashSet存放自定义数据类型
 * 要求存储内容不一致
 */
public class HashSetDemoB {
    public static void main(String[] args) {
        //创建HashSet集合存入数据类型为Students
        HashSet<Students> set = new HashSet<Students>();
        //创建Students对象
        Students s1 = new Students("佳佳", 22);
        Students s2 = new Students("森少", 21);
        Students s3 = new Students("波波", 21);
        Students s4 = new Students("川川", 16);
        Students s5 = new Students("李秉鑫", 12);
        Students s6 = new Students("小乔", 18);
        Students s7 = new Students("周鹏", 22);
        Students s8 = new Students("老司机", 18);
        Students s9 = new Students("佳佳", 22);
        //向集合中存入数据
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);
        set.add(s6);
        set.add(s7);
        set.add(s8);
        set.add(s9);
        System.out.println(s1.hashCode());
        System.out.println(s9.hashCode());
        //遍历集合中的元素
        for (Students students : set) {
            System.out.println(students);
        }
    }
}

 

重写HashCode的方法,自己定义可以,每个字符都对应有一个ASCII值,  HashCode值一样,则不能写入相同的对象

重写的目的就是跳过比较地址这个环节,compareTo和remove都是基于hashcode值进行的.

 

TreeSet

    输出会按照结果字典顺序排序

 1 import java.util.TreeSet;
 2 
 3 public class TreeSetDemoA {
 4     public static void main(String[] args) {
 5         TreeSet<Integer> set = new TreeSet<Integer>();
 6         set.add(8);
 7         set.add(11);
 8         set.add(4);
 9         set.add(3);
10         set.add(5);
11         set.add(7);
12         set.add(9);
13         set.add(10);
14         set.add(13);
15         boolean b1 = set.add(1);
16         System.out.println(b1);
17         boolean b2 = set.add(1);
18         System.out.println(b2);
19         for (Integer integer : set) {
20             System.out.print(integer+",");
21         }
22     }
23 }

 

posted on 2016-08-13 16:16  逆光Backlight  阅读(216)  评论(0编辑  收藏  举报