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()方法。此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此 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)。