`
bound
  • 浏览: 15902 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

[学习系列]Collection和Map

阅读更多
Collection分支:

set接口:元素无顺序,但是不可重复,可以存放不同的类型的对象,除了collection外,多了一个clear方法
HashSet:实现set结构的类,Set set=new HashSet(),add(),remove()方法
TreeSet类:实现SortedSet(set子接口)接口,不能重复,数据类型一样


List接口:有顺序的,add和remove多了重载方法:add(插入位置int,插入对象),remove同,位置编号从0开始;get,取值;indexOf,得到对象位置;set方法,修改某个位置的数据,同add方法,只是他会把旧位置上的对象返回
LinkedList和ArrayList实现List接口,LinkedList和ArrayList的区别,LinkedList插入速度快,ArrayList查询速度快

Iterator接口:读取collection对象中的数据
Collection有个iterator方法,生成iterator对象,next(),hasNext(),remove()(remove方法会删除掉next取得的数据,注意,不光是删掉iterator中的对象,原来collection中的对象也被删除掉了,所以iterator和生成它的对象是连在一起的,所以不管市collection和iterator对象哪个被修改,另外一个也被修改)

ListIterator接口:除了可以往后读取,还可以往前读取。生成ListIterator的方法是listIterator.只有LinkedList和ArrayList两个类有这个方法,next(),previous(),hasNext(),hasPrevious(),remove(),add(),set(),(注:remove,set,add方法都是以现在所指定的数据位置为修改的位置,不能任意指定其他位置),previousIndex,nextIndex,获得前一个或者后一个的位置,返回int类型

Map分支:

key value,put(关键值,数据),必须都是对象类型;remove()参数是关键值,返回的是数据,putAll(Map t),putAll除了执行put()迭代操作还需要迭代所传递的Map元素,putAll会自动调整Map的大小。
所有键值对-entrySet(),返回Set对象,其中每个对象都是Map.Entry对象;所有键--keySet(),返回Set对象,删除set的元素同时删除map中对应的映射;所有值--values(),返回Collection对象,删除方面同前

实现Map接口的类,三种:
通用Map:用于在应用程序中管理映射,通常在java.utils程序报中实现
HashMap,HashTable,Properties,LinkedHashMap,IdentityHashMap,TreeMap,WeakHashMap,ConcurrendHashMap
专用Map:通常不必亲自创建此类Map,而是通过某些其他类对其进行访问
Java.util.jar.Attributes,javax.print.attribute.standard.PrinterStateReasons
Java.security.Provider,java.awt.RenderingHints,javax.swing.UIDefaults
用户帮助实现自己的Map类的抽象类
AbstractMap

哈希映射:由一个存储元素的内部数组组成,由于内部采用数组存储,因此必然存在一个访问数组的索引机制,实际上,该机制需要一格小于数组大小的整数索引值,该机制称作 哈希函数,在java基于哈希德Map中,哈希函数将对象转换为一个适合内部数组的整数。
Int hasvalue=(key.hashCode()&0x7fffffff)%table.length

不同的键位映射到相同的位置的冲突的处理:在索引位置插入一个链接列表,并简单的将元素添加到此链接列表。
public Object put(Object key, Object value) {
//我们的内部数组是一个 Entry 对象数组
//Entry[] table;
//获取哈希码,并映射到一个索引
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % table.length;
//循环遍历位于 table[index] 处的链接列表,以查明
//我们是否拥有此键项 — 如果拥有,则覆盖它
for (Entry e = table[index] ; e != null ; e = e.next) {
//必须检查键是否相等,原因是不同的键对象
//可能拥有相同的哈希
if ((e.hash == hash) && e.key.equals(key)) {
//这是相同键,覆盖该值
//并从该方法返回 old 值
Object old = e.value;
e.value = value;
return old;
}
}
//仍然在此处,因此它是一个新键,只需添加一个新 Entry
//Entry 对象包含 key 对象、 value 对象、一个整型的 hash、
//和一个指向列表中的下一个 Entry 的 next Entry
//创建一个指向上一个列表开头的新 Entry,
//并将此新 Entry 插入表中
Entry e = new Entry(hash, key, value, table[index]);
table[index] = e;
return null;
}

map大小调整:

内部数组中的每个位置称作bucket,而可用的bucket数(即内部数组的大小)称作capacity,如果将Map调整的足够大可以减少重新调整大小。
负载因子:为确定合适调整大小,而不是对每个bucket中的链接列表的深度进行计数,基于哈希的Map使用一个额外参数并粗略计算bucket的密度。
负载因子,项数(map大小)与容量之间的关系:
如果(负载因子)*(容量)〉map大小,则调整Map大小

将所有的Map变量生命为Map可简化操作
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics