Set:无序,不可以重复元素
|-----HashSet:数据结构是哈希表,线程是非同步的。
保证元素唯一性的原理:判断元素的HashCode值是否相同。如果相同,还会继续判断元素的equals方法,是否为true。
|----TreeSet:可以对Set集合中的元素进行排序,当主要条件相同时,一定要比较下次要条件
TreeSet底层运用的数据结构二叉树,保证元素唯一性的依据:
compareTo,return0
TreeSet排序的第一种方式,让元素自身具备比较性,元素需要实现Compareable接口,覆盖compareTo方法,这种方法叫做元素的自然顺序也叫默认顺序。
TreeSet集合第二张排序方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,在集合初始化时,就有了比较方式。
这时需要定义一个比较器,当参数传递。当两种方式都存在时,以比较器为主。
泛型
JKD1.5以后出现的新特性,解决安全隐患
好处:
-
将运行时期出现的问题ClassCastException,转移到了编译时期方便于程序员解决问题,让运行时期出现的问题减少
-
避免了强制转换的麻烦
泛型格式:通过<>来定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型?
通常在集合框架中需要定义泛型,只要见到<>就要定义泛型
其实<>就是用来接收类型的。
泛型类
Class utils<T>
{
}
什么时候定义?
当类中要操作的引用数据类型不确定的时候,早期定义object来完成扩展,现在用泛型类来定义
泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有操作的类型就已经固定了,
为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上
特殊之处:静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
泛型的高级应用:
?通配符,也可以说是占位符。
泛型的限定:
<? Extends E>:可以接收E类型或者E的子类型,上限
<? Super E> : 可以接收E类型或者E的父类,下限
集合框架Map
Map集合特点:该集合存储键值对,一对一对存储,要保证键值的唯一性
-
添加
Put(K key, V valut);会返回这个键原来的值,添加相同键,会覆盖以前的值
putAll(Map<? extends K, ? extends V> m)
-
删除
Clear();
Remove();
-
判断
containsValue(Object value)
containsKey()Object key)
isEmpty();
-
获取
Get(Object key):取出一个值
Size()
Values()
entrySet()
keyset()
Map
|----Hashtable:底层是哈希表数据结构,不可以存入null键null值,线程同步
|----HashMap:底层是哈希表数据结构,预习null键null值,该集合不同步
|----TreeMap:底层是二叉树,线程不同步,可以用于给map集合中的键排序
和Set很像,其实Set底层就是使用Map集合
Map集合的两种取出方式:
-
keySet:将map中所有的键值存入到Set集合中,因为Set具备迭代器,所以可以迭代方式取出所有键值,在根据get方法,获取每一个键对应的值。
Map集合的取出原理:将map集合转成set集合,在通过迭代器取出。
-
Set<Map.Entry<k,v>>entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是Map.Entry
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口
Interface Map
{
Publicstatic interface Entry
{
Publicabstract object getKey();
Publicabstract object getValue();
}
}
Class HashMap implements Map
{
ClassHash implements Map.Entry
{
Public Object getKey(){}
Public Object getValue(){}
}
}
存储到HashSet中要覆写hashcode()和equals()方法,要存到二叉树中要实现Compare接口
什么时候使用Map集合?
当存在映射关系时使用