今天学完IT十八掌第十一天java基础课程:
学习内容:
Vector
-------------------------------------------
add("tom");
add(index,"tom");
remove(int index)
数组列表,查询快,增删慢。
|---ArrayList
|---Vector
链表 查询较慢,增删快
|---LinkList
Iterator it = list.iterator();
boolean it.hasNext( ) 判断是否有下一个元素
Next() 取出一个元素
所以判断是否有下一个元素,hasNext()
next()返回是Object类对象,注意类型转换,
可以通过泛型解决,格式<E> 接在类名后指定类型
泛型是编译时约束,
Set
----------------------------------
接口,继承于Collection
实现类
HashSet
TreeSet
蜜蜂与熊的问题,重点搞懂,多线程生产消费。
--------------
HashSet:
---------------------------------
public int hashCode()
{
}
public boolean equals(Object obj)
{
}
注:
Set不能添加重复元素,判断是否重复会先调用hashCode()方法判断
再调用equals方法判断,两者都相同时,两个对象算是重复的。
而与两个对象是否同一对象无关。
也就是说Set判断是否重复的范围超出了同一对象的,不同对象只要
hashCode()和equals()返回相同也会判断成重复。
remove中也是利用hashCode()和equals()方法来判断重复的。
问题:两个相同对象,hashCode()和equals()必定相同吗?
所以必定重复?
答:不一定,在hashCode()中使用age++,使得两个相同对象
调用两次hashCode()方法的返回值不同,hashSet会认为这两个对象不重复,
hashSet也能添加这两个相同对象,所以两个相同对象不一定是重复的,hashSet
判断是否重复首先判断hashCode(),相同后再判断equals()方法。
只有hashCode()和equals的值相同,才会判断两个元素是重复的,而与是否是同一对象无关。
TreeSet
-------------------------------
有序的Set,底层采用二叉树
存储对象必须具备比较性,自定义比较器Comparator,重写compare(p1 , p2)方法
或者实现Comparable接口重写compareTo( p )方法。
comparator自定义比较器
Comparator<Person> comp = new Comparator<Person>( ) {
public int compare(p1 , p2)
{
}
};
//将比较器作为参数传递给TreeSet,使得其按自定义的比较器规则进行排序。
TreeSet<Person> ts = new TreeSet<Person>(comp);
问题:TreeSet通过什么样的方式遍历二叉树,将需要添加的对象与集合中元素进行比较呢?
解答:由于TreeSet底层采用的是二叉数,每次遍历时大数在右边,小数在左边。
从元素的中间数开始判断(偶数的话去中间数的整数部分,比如2.5就取2位置上的数先比较),
如下图的顺序,很快就可以将对应元素插入到集合
问题:TreeSet怎么判断两个元素是否重复。
通过比较器判断,如果返回0,两个元素则是重复的。
Map
-------------------------------------
HashMap
遇到的问题:
1,TreeSet使用比较器判断是否重复时是如何取数据的,经验证采用的是遍历二叉树。
2,HashSet和HashMap的区别与联系,HashSet底层采用的是HashMap,HashMap中的元素是key-value形式的。
需要帮助的问题
Map应用
本文出自 “菜鸟成就数据之路” 博客,转载请与作者联系!