10.14-Set集合、散列表

Set集合

无序集,不重复集

所谓的不重复指的是Set集合中不会出现两个equals()比较为true的元素

Set集合的实现类

  • HashSet 使用散列算法实现

  • TreeSet 使用二叉树来实现(不常用)

例子-无序与不重复特点

package day10_14;

import java.util.HashSet;
import java.util.Set;

public class HashSetDemo01 {
	/**
	 * Set集合:无序、不重复
	 */
	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		set.add("one");
		set.add("two");
		set.add("three");
		set.add("four");
		System.out.println(set.size());//[four, one, two, three]
		/*
		 * 元素的存放顺序与元素在集合内部的保存位置不同
		 */
		System.out.println(set);
		set.add("one");//重复添加
		//Set集合不能存入重复的元素
		System.out.println(set);//[four, one, two, three]
	}
}

例子-Set集合遍历

对于HashSet而言,它存取元素时依赖于元素的HashCode()方法

HashCode()方法是Object类中的方法,所有的类都具备该方法,通常我们重写一个类的equals()方法时要求一并重写hashCode方法

HashCode()重写注意事项

  1. hashCode()方法在被多次调用时应当返回一个稳定值,除非参与的equals()方法比较的属性发生了改变

  2. 当两个对象equals()方法比较为true时,两个对象的hashCode()方法的返回值就应当相同

  3. 当两个对象equals()方法比较为false时,不要求hashCode()方法的返回值不同

例子-HashSet对HashCode()的依赖

首先,创建Element.class类

再创建HashSetDemo03.class测试类

散列表

Map

是一个多行两列的表格,每一行储存一项

一项中包含两个部分:key-value(键值对)

其常见的实现类:HashMap(使用散列算法实现的Map)

散列表常见概念

  1. 容量:散列表中散列数组的大小(不能无限大)

  2. 散列运算:根据key计算散列值的算法(散列算法)

  3. 散列桶:散列值相同的元素的"线性集合"

  4. 加载因子:是散列数组的加载率,一般小于75%性能就比较理想(元素数量/散列数组的大小)

  5. 散列查找:根据key计算散列值,根据散列值查找对应的value

  6. 散列表中的key绝对不同,但value可以相同

HashMap的性能调优

加载因子的比值如果超过0.75时,散列数组将扩容;存在原数组中的数据,需要重新进行散列运算之后存入新的数组当中,并不是简单的将原数组中的数据复制到新数组中,这个过程称之为rehash(重新散列);而这么扩容数组,rehash则会带来一定的性能开销

HashMap

以键值对的形式来存储对象,关键字Key是唯一不重复的。

  1. Key可以是任意对象,value也可以是任意对象

  2. Key-value需要成对放置在集合中

  3. 重复key只计算一个,重复添加时后添加的value将覆盖旧value值

  4. 根据key的散列值计算散列表,元素按照散列值进行排序(散列值是没有顺序的)

  5. HashMap的默认容量是16,默认的加载因子是0.75

  6. HashMap可以根据key检索查找value值

  7. HashMap可以在构造器中指定参数:初始容量与加载因子

散列表中常用方法

V put(K k,V v)

将一对键值对存入到散列表中。

因为Map要求key不允许重复,所以当使用相同的key存入不同的元素,其操作为替换value

put返回值是被替换的value

v get(Object k)

根据给定的key获取对应的value,若是给定的key不存在,则返回null

例子

遍历Map的三种方式

  1. 遍历所有的key

  2. 遍历所有的value

  3. 遍历所有的键值对

例子

例子-列表

HashTable(JDK1.2)

相对于HashMap来说,HashTable速度更更慢,但其更安全。

总结

集合框架(Collection和Map)

集合框架包括集合及其映射的子类

  1. List集合:元素有先后次序,玄素有index位置,元素可以重复,继承于Collection接口,实现类有ArrayList/LinkedList/Vector

  2. Set集合:元素无序,不能重复添加,是真正意义上的数学集合,继承自Collection接口,实现类有HashSet(是一个只有key的HashMap)/TreeSet

  3. Collection:没有说明元素是否重复和有序,很少使用

  4. Collections:集合的工具类

  5. Map:描述了成对(key-value)放置的集合;key不可重复,value可以重复;实现类有HashMap/HashTable/TreeMap

最后更新于