--< java.util >-- Set接口:
|--Set:元素是无序(无序是指存入和取出的顺序不一定一致),元素不可以重复。、
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的hashCode值相同,才会判断equals是否为true.
如果元素的hashCode值不同,不会调用equals.
|--LinkedHashSet:有序,hashset的子类。
|--TreeSet:对Set集合中的元素的进行指定顺序的排序.不同步.数据结构是二叉树。
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img0.ph.126.net/GJOlH6AJ5-UFWkeLMahtNQ==/3126624041402174655.png)
Set集合的方法功能和Collection是一致的。
List因为有索引故多了一些方法,Set和Collection一致
哈希表的原理:
1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。
2.哈希值就是这个元素的位置。
3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就存储,在原来对象的哈希值基础 +1顺延。???
4.存储哈希值的结构,我们称为哈希表。
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img0.ph.126.net/S-2vfxib-Sx62QQERVYPWA==/2274317811839100030.png)
注意,HashSet判断元素是否存在,及删除等操作,依赖的方法是元素的hashcode和equals
ArrayList中判断元素,删除元素只依赖equals方法,HashSet依赖两个方法,而且二次判断时才有equals
TreeSet:
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img2.ph.126.net/siH2-ia6vlvQP9x4a8u7IA==/1435522381324570856.png)
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img2.ph.126.net/V8YyBd8OC262bqbuOj7d9g==/877076027530848539.png)
Person实现Comparable,覆写compareTo方法
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img1.ph.126.net/Nu77tQ-jzcT-fw_O56hiXg==/3126624041402174659.png)
当主要条件相同时,比较次要条件.
完善程序:当年龄相等时,比较姓名
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img1.ph.126.net/a0AIe_iQdMC1of0VSt-YeA==/2050263730460889568.png)
二叉树
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img1.ph.126.net/nSbz9aOcwXOSTmp1RGcANA==/2510756792277235825.png)
TreeSet集合排序有两种方式,Comparable和Comparator区别:
1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法.
2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数.
第二种方式较为灵活。
若元素不具备比较性---自定义元素 Person类对象
或具备的比较性不是所需要的---可以让Person实现Comparable,定义age具有比较性,但现在需要不想用age排序,修改源代码风险太大
此时就需要让集合自身具备比较性
好比让集合有个刻度尺,元素A进来与集合比较一下,元素B进来与集合比较一下。
在集合初始化时,就让其具有比较方式.
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数.
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img2.ph.126.net/jMWcVnvEx6rGLWK9i5Ah0g==/1756122379798080893.png)
根据字符串长度排序
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img2.ph.126.net/9YHzeHitwbJSc4X3bqWqew==/1756122379798080896.png)
泛型Generic:jdk1.5版本以后出现的一个安全机制。表现格式:< >
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img1.ph.126.net/HE-vf35oGPYnFwDoqIIv3Q==/3025855999739924749.png)
泛型好处
1.将运行时期出现问题ClassCastException,转移到了编译时期.
方便于程序员解决问题,让运行时问题减少,更加安全.
2.避免了强制转换麻烦。
何时写泛型呢?
通常在集合框架中很常见.
只要见到<>就要定义泛型.
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可.
泛型类:
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img2.ph.126.net/aJzX7nRBWHcDWsauXZcQDQ==/2518638091625151326.png)
何时定义泛型类?
当类中要操作的引用数据类型不确定的时候
只能是引用类型,基本类型泛型定义不了.
早期定义Object来完成扩展.现在定义泛型来完成扩展.
泛型方法:
泛型类定义的泛型,在整个类中有效.
为了让不同方法可以操作不同类型,而且类型还不确定.
那么可以将泛型定义在方法上.
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img1.ph.126.net/T4mraaKeCrUegAW6cgLq6Q==/3262294980176740354.png)
特殊之处:
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img0.ph.126.net/8p03VdGct_iBCr3tNQoLgg==/6597817434565376103.png)
静态方法不可以访问类上定义的泛型.
若静态方法操作的应用数据类型不确定,可以将泛型定义在方法上.
泛型接口
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img0.ph.126.net/xIlXVRHZAWtN_f8TzJb5vA==/137359788735098256.png)
通配符<?>
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img1.ph.126.net/PmFETllRm21-GpYhmA7xBA==/6598293523100153389.png)
泛型限定:
? 通配符.也可以理解为占位符。
泛型的限定;
上限:<? extends E> 可以接收E类型或者E的子类型.
下限:<? super E> 可以接收E类型或者E的父类型.
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img2.ph.126.net/TDFJC6LC_GRhpLcb9Jv3HA==/6597166523682045944.png)
上限什么时候用:
往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象.
取的时候,E类型既可以接收E类对象,又可以接收E的子类型对象.
下限什么时候用:
当从集合获取元素进行操作时,可用当前元素类型接收,也可用当前元素父类型接收.
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img1.ph.126.net/n4XulFBX-kI4ZErgW3cWDA==/6608679509933893300.png)
泛型的细节:
1)、泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型;
2)、使用带泛型的类创建对象时,等式两边指定的泛型必须一致;
原因:编译器检查对象调用方法时只看变量,然而程序运行期间调用方法时就要考虑对象具体类型了;
3)、等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容);
ArrayList<String> al = new ArrayList<Object>(); //错
//要保证左右两边的泛型具体类型一致就可以了,这样不容易出错。
ArrayList<? extends Object> al = new ArrayList<String>();
al.add("aa"); //错
//因为集合具体对象中既可存储String,也可以存储Object的其他子类,所以添加具体的类型对象不合适,类型检查会出现安全问题。 ?extends Object 代表Object的子类型不确定,怎么能添加具体类型的对象呢?
public static void method(ArrayList<? extends Object> al) {
al.add("abc"); //错
//只能对al集合中的元素调用Object类中的方法,具体子类型的方法都不能用,因为子类型不确定。
}
自己的一些错误总结
![黑马程序员_复习_Day11 - 九五二七 - 今天](http://img2.ph.126.net/VkXPlwGwvSqiuidgtDCIKw==/28991922619254554.png)