泛型机制
基本概念
- 通常情况下集合中可以存放不同类型的对象, 是因为将所有对象都看做Objcet类型放入的, 因此从集合中取出元素时也是Object类型. 为了表达该元素真实的数据类型, 则需要强制类型转换, 而强制类型转换可能会引发 类型转换异常
- 为了避免上述错误的发生, 从Java5开始增加泛型机制,也就是在集合名称的右侧使用<数据类型>的方式来<u>明确要求该集合中可以存放的元素类型</u>. 若放入其它类型的元素则编译报错
- 泛型只在编译时期有效, 在运行时期不区分是什么类型
底层原理
- 泛型的本质就是参数化类型, 也就是让数据类型作为参数传递.其中
E
相当于形式参数负责占位, 而使用集合时<>
中的数据类型相当于实际参数, 用于给形式参数E
进行初始化, 从而使得集合中所有的E被实际参数替换. 由于实际参数可以传递各种各样广泛的数据类型,因此得名为泛型
/* 无关泛型 */
// i叫做形式参数,负责占位
int i;
public static void show(int i){
...
}
// 10叫做实际参数,负责给形式参数初始化
show(10);
/* 泛型 */
// E叫做形式参数,负责占位
// String叫做实际参数
E = String;
public interface List{
...
}
Set集合
基本概念
java.util.Set
集合是Collection集合的子集合,与List集合平级- 该集合中元素没有先后放入次序,且不允许重复
该集合的主要实现类是
HashSet
,TreeSet
,LinkedHashSet
HashSet
类的底层是采用哈希表进行数据管理的TreeSet
类的底层是采用红黑树进行数据管理的LinkedHashSet
类在内部维护了一个双向链表,链表中记录了元素的迭代顺序,也就是元素插入集合的先后顺序,因此便于迭代
常用的方法
参才Collection集合中的方法Collection集合常用方法
元素放入HashSet集合的原理
- 使用元素调用
hashCode
方法获取对应的哈希玛值, 再由某种哈希算法计算出该元素在数组中的索引位置 - 若该位置没有元素,则将该元素直接放入即可
若该位置有元素, 则使用新元素与已有元素比较哈希玛值.
- 若哈希值不相同, 则将该元素直接放入
若哈希值相同,则使用新元素调用
equals
方法与已有元素依次比较- 若相等则添加元素失败,否则将元素直接放入即可
TreeSet集合的概念
- 二叉树主要指每个节点最多只有两个子节点的树形结构
- 满足以下3个特征的二叉树叫做有序二叉树
a. 左子树中的任意节点元素都小于根节点元素值
b. 右子树中的任意节点元素都大于根节点元素值
c. 左子树和右子树的内部也遵守上述规则 - 由于
TreeSet
集合的底层采用红黑树进行数据的管理,当有新元素插入到TreeSet集合时, 需要用新元素与集合中已有的元素依次比较来确定新元素的合理位置 比较元素大小的规则有两种方式
- 使用元素的自然排序规则进行比较并排序,让元素类型实现
java.lang.Comparable
接口 - 使用比较器规则进行比较并排序,构造TreeSet集合时传入
java.util.Comparator
接口 - 自然排序的规则比较单一, 而比较器的规则比较多元化,而且比较器优先于自然排序
- 使用元素的自然排序规则进行比较并排序,让元素类型实现
Map集合
基本概念
java.util.Map<K,V>
集合中存取元素的基本单位是单对元素- K: 此映射所维护的键(Key)的类型,相当于目录
- V: 映射值(Value)的类型,相当于内容
- 该集合中key是不允许重复的,而且一个key只能对应一个value
该集合的主要实现类有:
HashMap
,TreeMap
,LinkedHashMap
,Hashtable
HashMap
类的底层是采用哈希表进行数据管理的TreeMap
类的底层是采用红黑树进行数据管理的LinkedHashMap
类在内部维护了一个双向链表.链表中记录了元素迭代顺序, 也就是元素插入集合中的先后顺序,因此便于迭代Hashtable
类属于线程安全类,且不允许null作为key或value的数值Properties
类是Hashtable
类的子类,该对象用于处理属性文件, key和value都是String
类型
- Map集合是面向查询优化的数据结构,在大数据量情况下有着优良的查询性能
- 经常用于根据key检索value的业务场景
常用的方法
功能介绍 | 方法声明 |
---|---|
将Key-Value对存入Map | V put(K key, V value) |
返回与参数Key所对应的Value对象,如果不存在就返回null | V get(Object key) |
判断集合中是否包含指定的Key | boolean containsKey(Object key) |
判断集合中是否包含指定的Value | boolean containsValue(Object value) |
根据参数指定的key进行删除 | V remove(Object key) |
返回此映射中包含的键的Set视图 | Set keySet() |
返回此映射中包含的值的Set视图 | Collection values() |
返回此映射中包含的映射的Set视图 | Set<Map.Entry<K,V>> entrySet() |
V put(K key, V value)
: 将Key-Value对存入Map.若集合中已经包含该Key, 则替换该Key所对应的Value,返回值为该Key原来所对应的Value,若没有则返回null
元素放入HashMap集合的原理
- 使用元素key调用
hashCode
方法获取对应的哈希码值, 再由某种哈希算法计算在数组中的索引位置 - 若该位置没有元素, 则将该键值对直接放入即可
若该位置有元素,则使用key与已有元素依次比较哈希值
- 若哈希值不相同, 则将该元素直接放入
若key与已有元素的哈希值相同,则使用key调用
equals
方法与已有元素依次比较- 若相等,则将对应的value修改
- 否则将键值对直接放入
相关的常量
DEFAULT_INITIAL_CAPACITY
: HashMap的默认容量-16DEFAULT_LOAD_FACTOR
: HashMap的默认加载因子是0.75threshold
: 扩容的临界值.该数值是:容量*填充因子,也就是12TREEIFY_THRESHOLD
: 若Bucket中链表长度大于该默认值则转化为红黑树存储.该数值是8MIN_TREEIFY_CAPACITY
: 桶中的Node被树化时最小的hash表容量,该数值是64
思考
为什么要求重写equals方法后要重写hashCode方法
[解析参考]
当两个元素调用equals
方法相等时证明两个元素相同.
重写hashCode
方法后保证这两个元素得到的哈希玛值相同,那么由一个哈希算法生成的索引位置相同. 此时只需要与该索引位置已有元素比较即可,从而提高效率并避免重复元素的出现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。