第十七章 容器深入研究
-
完整的容器分类法
-
容器分为Collection集合类和Map键值对类
-
Collection 接口:
-
List 接口 (按插入顺序保存,元素可以重复):
- ArrayList (相当于大小可变的数组,随机访问快,插入移除慢)
- LinkedList(插入移除快,随机访问慢)
-
set 接口(不能有重复元素)
- HashSet(元素无序,查询速度非常快)
- LinkedHashSet(按插入顺序保存,同时有HashSet的查询速度)
- TreeSet(按元素升序保存对象,或者根据元素实现的比较器排序)
-
Queue接口(一头进一头出)
- PriorityQueue(优先级高的先出,也实现了List接口)
-
Map接口
- HashMap (查找速度快,内部无规则排序)
- LinkedHashMap(按插入顺序排序,查找速度快)
- TreeMap(根据元素实现的比较器排序)
-
-
-
填充容器
所有Collection的构造器都可以接收另一个Collection来填充自己
-
Collection的功能与方法
boolean add(T) //确保容器持有具有泛型类型T的参数 boolean addAll(Collection<? extends> T) //添加参数中的所有元素,只要添加了任意元素就返回true void clear() //移除容器中的所有元素 boolean contains()//如果容器中包含此参数,返回true boolean containsAll()//如果容器中有此参数中的所有元素,返回true boolean isEmpty()//容器中没有元素返回true boolean remove(Object)//如果参数在容器中,则移除此元素的一个实例。如果做了此操作,反悔true int size()//返回容器中元素的数目
- 迭代器接口方法
- hasNext() : 判断是否存在下一个对象元素
- next() :获取下一个元素
- remove() : 移除元素
- 迭代器接口方法
-
List的功能与方法
-
List:
get(int) //获取指定索引位置的列表元素 set(int,E) 设置指定索引位置的列表元素 add(int,E) 将指定的元素添加到此列表的索引位置。 remove(int) 移除指定索引位置的元素; indexOf(Object) 从列表头部查找Object对象元素 lastIndexOf(Objcet) 从列表尾部查找Object对象元素 listIterator() 返回列表迭代器 listIterator(int) 返回指定索引位置的列表迭代器 subList(int,int) 该方法返回的是父list一个视图,从fromIndex(包含),到toIndex(不包含)
-
ListIterator:
hasPrevious() 如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false previous() 返回列表中ListIterator指向位置前面的元素 set(E) 从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素 add(E) 将指定的元素插入列表,插入位置为迭代器当前位置之前 nextIndex() 返回列表中ListIterator所需位置后面元素的索引 previousIndex() 返回列表中ListIterator所需位置前元素的索引
-
-
Set和存储顺序
- 加入Set的元素必须确保对象的唯一性(定义equals()方法)
- hashcode() 只有这个类被置于HashSet或者LinkedHashSet中时才是必需的
- SortedSet:按对象的比较函数对元素排序;LinkedHashSet:元素的插入次序
-
MAP
-
散列与散列码
- 散列码是相对唯一的、用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的
- hashMap使用equals()判断当前的键值是否与已存在的键相同
- 默认的equals()方法只是比较对象的地址,如果使用自定义的类作为hashMap的键时,要重写hashCode()和equals()
- 重写equals()需要满足五个条件:自反性,对称性,传递性,一致性,对任何非null 的值,equals(null) 返回false
- 使用散列的目的在于:想要使用一个对象查找另一个对象
- HashMap查询快速的原因在于使用散列码进行查询。当查询的散列码对象唯一,则散列码对应的位置就是要查找的元素,如果不唯一,则散列码对应的下标所在数组元素保存的是一个集合,然后使用集合的equals()方法进行查询
-
散列
散列就是将一个对象生成一个数字保存下来,然后在查找这个对象时直接找到这个数字就可以了,所以散列的目的是为了提高查找速度,而手段是将一个对象生成的数字与其关联并保存下来。这个生成的数字就是散列码。而生成这个散列码的方法称为散列函数(hashCode())