Vector集合,Set接口,HashSet类,LinkedHashSet类

Vector集合:

    Vector集合数据存储的结构是数组结构,Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。

             Vector常见的方法:

      

              Enumeration枚举常见的方法:

      

 

 Set接口:

    Set接口里面的集合所存储的元素是不重复的,没有下标,取元素无序。没有独有的方法,Collection有什么方法,Set接口就有什么方法。

HashSet集合:

    此类实现Set接口,由哈希表支持(实际上是一个 HashMap集合)。HashSet集合不能保证的迭代顺序与元素存储顺序相同。HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。此类为基本操作提供了稳定性能,这些基本操作包括 addremovecontainssize,假定哈希函数将这些元素正确地分布在桶中。对此 set 进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能(遍历的效率)很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。

    构造方法摘要:

构造方法摘要
HashSet()
          构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
HashSet(Collection<? extends E> c)
          构造一个包含指定 collection 中的元素的新 set。
HashSet(int initialCapacity)
          构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
HashSet(int initialCapacity, float loadFactor)
          构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。

 为什么HashSet不能存重复元素:

  哈希函数是hsaCode()方法,属于Object,所有类自动继承,因为没有重写toString方法,equals方法,所以哈希值是根据地址值打印的,所以值不一样,首先需要重写hasCode(),return name.hasCode()+age ;toString()方法,equals()方法。也就是说存自定义类型时,必须把equals()方法与hasCode()方法点出来。自己重写的HasCode()方法,挂的值太多,太容易重复。

  public class Demo03 {

      public static void main(String[] args) {
    String s1="abc";
    String s2=new String("abc");
    System.out.println(s1.hashCode());96354
    System.out.println(s2.hashCode());96354
    Person p1=new Person("a",10);
    Person p2=new Person("a",10));
    System.out.println(p1.hashCode());
    System.out.println(p2.hashCode());
    }
}

       public int hashCode() {          s1调用方法,
           int h = hash(private  int hash);   hash是成员变量,赋默认值为0
            if (h == 0 && value.length > 0) {    value(private final char value[])也是成员变量,且是一个char数组,装的是"abc",
                char val[] = value;

                for (int i = 0; i < value.length; i++) {
                    h = 31 * h + val[i];      h=31*0+97('a')=97  h=31*97+98=3105   h=31*3105+99=96354    
                }
                hash = h;
            }
            return h;   96354
        }

LinkedHashSet集合:

 保证存取数据有序,因为LinkedHashSet是双链结构。

1.1  ArrayList的contains方法判断元素是否重复原理

 

 

ArrayList的contains方法会使用调用方法时,传入的元素的equals方法依次与集合中的旧元素所比较,从而根据返回的布尔值判断是否有重复元素。此时,当ArrayList存放自定义类型时,由于自定义类型在未重写equals方法前,判断是否重复的依据是地址值,所以如果想根据内容判断是否为重复元素,需要重写元素的equals方法。

 

哈希表:数组与链表的结合体,链表节点存的是值,数组存的是地址值,初始容量就是数组的长度,加载因子是到了初始容量的哪里准备要增加的新的初始容量(16*0.75=12)。

    

 

 

posted @ 2020-10-13 16:27  马雪峰1  阅读(139)  评论(0编辑  收藏  举报